schemaorg-kit 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -98,6 +98,7 @@ __export(index_exports, {
98
98
  RecipeSchema: () => RecipeSchema,
99
99
  ReviewSchema: () => ReviewSchema,
100
100
  SchemaGraph: () => SchemaGraph,
101
+ SchemaIds: () => SchemaIds,
101
102
  SchemaNode: () => SchemaNode,
102
103
  SeekToActionSchema: () => SeekToActionSchema,
103
104
  ServicePeriodSchema: () => ServicePeriodSchema,
@@ -213,7 +214,7 @@ function makeFactory(schema2) {
213
214
  }
214
215
 
215
216
  // src/types/things/Person.ts
216
- var import_zod6 = require("zod");
217
+ var import_zod7 = require("zod");
217
218
 
218
219
  // src/types/things/Thing.ts
219
220
  var import_zod4 = require("zod");
@@ -225,6 +226,8 @@ var import_zod3 = require("zod");
225
226
  var import_zod2 = require("zod");
226
227
  var PersonOrOrgRef = import_zod2.z.union([
227
228
  import_zod2.z.string(),
229
+ // @id-only reference for @graph cross-referencing (e.g. { "@id": "https://example.com/#organization" })
230
+ import_zod2.z.object({ "@id": import_zod2.z.string() }),
228
231
  // Accept any Person or Organization object — including full schema outputs via .toObject().
229
232
  // .catchall() allows extra fields; name/url are optional to match ThingSchema's base types.
230
233
  import_zod2.z.object({ "@type": import_zod2.z.literal("Person") }).catchall(import_zod2.z.unknown()),
@@ -234,15 +237,24 @@ var PersonOrOrgRef = import_zod2.z.union([
234
237
  // src/types/shared/ImageObject.ts
235
238
  var ImageObjectSchema = import_zod3.z.object({
236
239
  "@type": import_zod3.z.literal("ImageObject").default("ImageObject"),
240
+ "@id": import_zod3.z.string().optional(),
237
241
  url: import_zod3.z.url(),
238
242
  contentUrl: import_zod3.z.url().optional(),
239
243
  width: import_zod3.z.union([
240
244
  import_zod3.z.number(),
241
- import_zod3.z.object({ "@type": import_zod3.z.literal("QuantitativeValue"), value: import_zod3.z.number(), unitCode: import_zod3.z.string().optional() })
245
+ import_zod3.z.object({
246
+ "@type": import_zod3.z.literal("QuantitativeValue").default("QuantitativeValue"),
247
+ value: import_zod3.z.number(),
248
+ unitCode: import_zod3.z.string().optional()
249
+ })
242
250
  ]).optional(),
243
251
  height: import_zod3.z.union([
244
252
  import_zod3.z.number(),
245
- import_zod3.z.object({ "@type": import_zod3.z.literal("QuantitativeValue"), value: import_zod3.z.number(), unitCode: import_zod3.z.string().optional() })
253
+ import_zod3.z.object({
254
+ "@type": import_zod3.z.literal("QuantitativeValue").default("QuantitativeValue"),
255
+ value: import_zod3.z.number(),
256
+ unitCode: import_zod3.z.string().optional()
257
+ })
246
258
  ]).optional(),
247
259
  caption: import_zod3.z.string().optional(),
248
260
  description: import_zod3.z.string().optional(),
@@ -292,62 +304,56 @@ function extendThing(type, shape) {
292
304
  });
293
305
  }
294
306
 
295
- // src/types/shared/InteractionCounter.ts
307
+ // src/types/shared/PostalAddress.ts
296
308
  var import_zod5 = require("zod");
297
- var InteractionCounterSchema = import_zod5.z.object({
298
- "@type": import_zod5.z.literal("InteractionCounter").default("InteractionCounter"),
299
- interactionType: import_zod5.z.string(),
309
+ var PostalAddressSchema = import_zod5.z.object({
310
+ "@type": import_zod5.z.literal("PostalAddress").default("PostalAddress"),
311
+ streetAddress: import_zod5.z.string().optional(),
312
+ addressLocality: import_zod5.z.string().optional(),
313
+ // city
314
+ addressRegion: import_zod5.z.string().optional(),
315
+ // state/province
316
+ postalCode: import_zod5.z.string().optional(),
317
+ addressCountry: import_zod5.z.string().optional(),
318
+ // ISO 3166-1 alpha-2, e.g. "US"
319
+ postOfficeBoxNumber: import_zod5.z.string().optional()
320
+ });
321
+
322
+ // src/types/shared/InteractionCounter.ts
323
+ var import_zod6 = require("zod");
324
+ var InteractionCounterSchema = import_zod6.z.object({
325
+ "@type": import_zod6.z.literal("InteractionCounter").default("InteractionCounter"),
326
+ interactionType: import_zod6.z.string(),
300
327
  // full URL, e.g. "https://schema.org/LikeAction"
301
- userInteractionCount: import_zod5.z.number().int().nonnegative()
328
+ userInteractionCount: import_zod6.z.number().int().nonnegative()
302
329
  });
303
330
 
304
331
  // src/types/things/Person.ts
305
332
  var PersonSchema = extendThing("Person", {
306
- givenName: import_zod6.z.string().optional(),
307
- familyName: import_zod6.z.string().optional(),
308
- email: import_zod6.z.string().email().optional(),
309
- telephone: import_zod6.z.string().optional(),
310
- jobTitle: import_zod6.z.string().optional(),
311
- worksFor: import_zod6.z.lazy(() => import_zod6.z.object({ "@type": import_zod6.z.string(), name: import_zod6.z.string() })).optional(),
312
- birthDate: import_zod6.z.string().optional(),
333
+ givenName: import_zod7.z.string().optional(),
334
+ familyName: import_zod7.z.string().optional(),
335
+ email: import_zod7.z.string().email().optional(),
336
+ telephone: import_zod7.z.string().optional(),
337
+ jobTitle: import_zod7.z.string().optional(),
338
+ worksFor: import_zod7.z.lazy(() => import_zod7.z.object({ "@type": import_zod7.z.string(), name: import_zod7.z.string() })).optional(),
339
+ birthDate: import_zod7.z.string().optional(),
313
340
  // ISO 8601
314
- gender: import_zod6.z.enum(["Male", "Female", "Unknown"]).optional(),
315
- nationality: import_zod6.z.string().optional(),
316
- interactionStatistic: import_zod6.z.union([InteractionCounterSchema, import_zod6.z.array(InteractionCounterSchema)]).optional(),
317
- agentInteractionStatistic: import_zod6.z.union([InteractionCounterSchema, import_zod6.z.array(InteractionCounterSchema)]).optional(),
318
- address: import_zod6.z.object({
319
- "@type": import_zod6.z.literal("PostalAddress"),
320
- streetAddress: import_zod6.z.string().optional(),
321
- addressLocality: import_zod6.z.string().optional(),
322
- addressRegion: import_zod6.z.string().optional(),
323
- postalCode: import_zod6.z.string().optional(),
324
- addressCountry: import_zod6.z.string().optional()
325
- }).optional()
341
+ gender: import_zod7.z.enum(["Male", "Female", "Unknown"]).optional(),
342
+ nationality: import_zod7.z.string().optional(),
343
+ interactionStatistic: import_zod7.z.union([InteractionCounterSchema, import_zod7.z.array(InteractionCounterSchema)]).optional(),
344
+ agentInteractionStatistic: import_zod7.z.union([InteractionCounterSchema, import_zod7.z.array(InteractionCounterSchema)]).optional(),
345
+ address: import_zod7.z.union([import_zod7.z.string(), PostalAddressSchema]).optional()
326
346
  });
327
347
  var createPerson = makeFactory(PersonSchema);
328
348
 
329
349
  // src/types/things/Organization.ts
330
350
  var import_zod15 = require("zod");
331
351
 
332
- // src/types/shared/PostalAddress.ts
333
- var import_zod7 = require("zod");
334
- var PostalAddressSchema = import_zod7.z.object({
335
- "@type": import_zod7.z.literal("PostalAddress").default("PostalAddress"),
336
- streetAddress: import_zod7.z.string().optional(),
337
- addressLocality: import_zod7.z.string().optional(),
338
- // city
339
- addressRegion: import_zod7.z.string().optional(),
340
- // state/province
341
- postalCode: import_zod7.z.string().optional(),
342
- addressCountry: import_zod7.z.string().optional(),
343
- // ISO 3166-1 alpha-2, e.g. "US"
344
- postOfficeBoxNumber: import_zod7.z.string().optional()
345
- });
346
-
347
352
  // src/types/shared/ContactPoint.ts
348
353
  var import_zod8 = require("zod");
349
354
  var ContactPointSchema = import_zod8.z.object({
350
355
  "@type": import_zod8.z.literal("ContactPoint").default("ContactPoint"),
356
+ "@id": import_zod8.z.string().optional(),
351
357
  telephone: import_zod8.z.string().optional(),
352
358
  contactType: import_zod8.z.string().optional(),
353
359
  // e.g. "customer support", "sales"
@@ -548,7 +554,7 @@ var OfferSchema = import_zod12.z.object({
548
554
  // ISO 8601
549
555
  validThrough: import_zod12.z.string().optional(),
550
556
  // ISO 8601
551
- url: import_zod12.z.string().url().optional(),
557
+ url: import_zod12.z.url().optional(),
552
558
  seller: import_zod12.z.object({ "@type": import_zod12.z.string(), name: import_zod12.z.string() }).optional(),
553
559
  category: import_zod12.z.string().optional(),
554
560
  inventoryLevel: import_zod12.z.object({
@@ -561,13 +567,8 @@ var OfferSchema = import_zod12.z.object({
561
567
  UnitPriceSpecificationSchema,
562
568
  import_zod12.z.array(UnitPriceSpecificationSchema)
563
569
  ]).optional(),
564
- shippingDetails: import_zod12.z.union([
565
- OfferShippingDetailsSchema,
566
- import_zod12.z.array(OfferShippingDetailsSchema)
567
- ]).optional(),
568
- hasMerchantReturnPolicy: import_zod12.z.lazy(
569
- () => import_zod12.z.object({ "@type": import_zod12.z.string() }).catchall(import_zod12.z.unknown())
570
- ).optional()
570
+ shippingDetails: import_zod12.z.union([OfferShippingDetailsSchema, import_zod12.z.array(OfferShippingDetailsSchema)]).optional(),
571
+ hasMerchantReturnPolicy: import_zod12.z.lazy(() => import_zod12.z.object({ "@type": import_zod12.z.string() }).catchall(import_zod12.z.unknown())).optional()
571
572
  });
572
573
  var MerchantReturnPolicySchema = import_zod12.z.object({
573
574
  "@type": import_zod12.z.literal("MerchantReturnPolicy").default("MerchantReturnPolicy"),
@@ -582,7 +583,7 @@ var MerchantReturnPolicySchema = import_zod12.z.object({
582
583
  refundType: import_zod12.z.string().optional(),
583
584
  // schema.org enum URL
584
585
  // Additional Google Merchant Listing fields
585
- merchantReturnLink: import_zod12.z.string().url().optional(),
586
+ merchantReturnLink: import_zod12.z.url().optional(),
586
587
  returnShippingFeesAmount: MonetaryAmountSchema.optional(),
587
588
  itemCondition: import_zod12.z.union([ItemCondition, import_zod12.z.array(ItemCondition)]).optional(),
588
589
  returnLabelSource: import_zod12.z.string().optional(),
@@ -617,7 +618,7 @@ var AggregateOfferSchema = import_zod12.z.object({
617
618
  offerCount: import_zod12.z.number().int().nonnegative().optional(),
618
619
  offers: import_zod12.z.union([OfferSchema, import_zod12.z.array(OfferSchema)]).optional(),
619
620
  availability: ItemAvailability.optional(),
620
- url: import_zod12.z.string().url().optional()
621
+ url: import_zod12.z.url().optional()
621
622
  });
622
623
 
623
624
  // src/types/shared/MemberProgram.ts
@@ -632,14 +633,14 @@ var MemberProgramTierSchema = import_zod13.z.object({
632
633
  value: import_zod13.z.number().optional(),
633
634
  unitText: import_zod13.z.string().optional()
634
635
  }).optional(),
635
- url: import_zod13.z.string().url().optional()
636
+ url: import_zod13.z.url().optional()
636
637
  });
637
638
  var MemberProgramSchema = import_zod13.z.object({
638
639
  "@type": import_zod13.z.literal("MemberProgram").default("MemberProgram"),
639
640
  name: import_zod13.z.string(),
640
641
  description: import_zod13.z.string().optional(),
641
642
  hasTiers: import_zod13.z.union([MemberProgramTierSchema, import_zod13.z.array(MemberProgramTierSchema)]).optional(),
642
- url: import_zod13.z.string().url().optional()
643
+ url: import_zod13.z.url().optional()
643
644
  });
644
645
 
645
646
  // src/types/shared/ShippingService.ts
@@ -715,7 +716,7 @@ var NestedOrgRef = import_zod15.z.lazy(
715
716
  );
716
717
  var OrganizationSchema = extendThing("Organization", {
717
718
  legalName: import_zod15.z.string().optional(),
718
- email: import_zod15.z.email().optional(),
719
+ email: import_zod15.z.string().email().optional(),
719
720
  telephone: import_zod15.z.string().optional(),
720
721
  logo: ImageOrUrl.optional(),
721
722
  foundingDate: import_zod15.z.string().optional(),
@@ -748,20 +749,26 @@ var OrganizationSchema = extendThing("Organization", {
748
749
  // Hierarchical organization (loose refs to avoid circular type inference):
749
750
  subOrganization: NestedOrgRef.optional(),
750
751
  parentOrganization: NestedOrgRef.optional(),
751
- sameAs: import_zod15.z.union([import_zod15.z.string().url(), import_zod15.z.array(import_zod15.z.string().url())]).optional()
752
+ sameAs: import_zod15.z.union([import_zod15.z.url(), import_zod15.z.array(import_zod15.z.url())]).optional()
752
753
  });
753
754
  var createOrganization = makeFactory(OrganizationSchema);
754
755
  var createNGO = makeFactory(
755
756
  OrganizationSchema.extend({ "@type": import_zod15.z.literal("NGO").default("NGO") })
756
757
  );
757
758
  var createCorporation = makeFactory(
758
- OrganizationSchema.extend({ "@type": import_zod15.z.literal("Corporation").default("Corporation") })
759
+ OrganizationSchema.extend({
760
+ "@type": import_zod15.z.literal("Corporation").default("Corporation")
761
+ })
759
762
  );
760
763
  var createOnlineStore = makeFactory(
761
- OrganizationSchema.extend({ "@type": import_zod15.z.literal("OnlineStore").default("OnlineStore") })
764
+ OrganizationSchema.extend({
765
+ "@type": import_zod15.z.literal("OnlineStore").default("OnlineStore")
766
+ })
762
767
  );
763
768
  var createOnlineBusiness = makeFactory(
764
- OrganizationSchema.extend({ "@type": import_zod15.z.literal("OnlineBusiness").default("OnlineBusiness") })
769
+ OrganizationSchema.extend({
770
+ "@type": import_zod15.z.literal("OnlineBusiness").default("OnlineBusiness")
771
+ })
765
772
  );
766
773
 
767
774
  // src/types/things/Product.ts
@@ -794,12 +801,10 @@ var ReviewSchema = import_zod16.z.object({
794
801
  // ISO 8601 date
795
802
  publisher: PersonOrOrgRef.optional(),
796
803
  // itemReviewed: any Thing — kept loose to avoid circular imports
797
- itemReviewed: import_zod16.z.lazy(
798
- () => import_zod16.z.object({ "@type": import_zod16.z.string() }).passthrough()
799
- ).optional(),
804
+ itemReviewed: import_zod16.z.lazy(() => import_zod16.z.object({ "@type": import_zod16.z.string() }).passthrough()).optional(),
800
805
  name: import_zod16.z.string().optional(),
801
806
  // Review headline
802
- url: import_zod16.z.string().url().optional(),
807
+ url: import_zod16.z.url().optional(),
803
808
  /** ISO 8601 DateTime — required for French vacation rental reviews */
804
809
  contentReferenceTime: import_zod16.z.string().optional()
805
810
  });
@@ -957,7 +962,7 @@ var ClipSchema = import_zod18.z.object({
957
962
  // seconds from start
958
963
  endOffset: import_zod18.z.number().optional(),
959
964
  // seconds from start
960
- url: import_zod18.z.string().url().optional()
965
+ url: import_zod18.z.url().optional()
961
966
  // URL pointing to this clip
962
967
  });
963
968
  var BroadcastEventSchema = import_zod18.z.object({
@@ -977,15 +982,15 @@ var VideoObjectSchema = import_zod18.z.object({
977
982
  "@type": import_zod18.z.literal("VideoObject").default("VideoObject"),
978
983
  // Required by Google:
979
984
  name: import_zod18.z.string(),
980
- thumbnailUrl: import_zod18.z.union([import_zod18.z.string().url(), import_zod18.z.array(import_zod18.z.string().url())]),
985
+ thumbnailUrl: import_zod18.z.union([import_zod18.z.url(), import_zod18.z.array(import_zod18.z.url())]),
981
986
  uploadDate: import_zod18.z.string(),
982
987
  // ISO 8601 date
983
988
  // Recommended by Google:
984
989
  description: import_zod18.z.string().optional(),
985
990
  duration: import_zod18.z.string().optional(),
986
991
  // ISO 8601 duration, e.g. "PT1M54S"
987
- contentUrl: import_zod18.z.string().url().optional(),
988
- embedUrl: import_zod18.z.string().url().optional(),
992
+ contentUrl: import_zod18.z.url().optional(),
993
+ embedUrl: import_zod18.z.url().optional(),
989
994
  // Optional:
990
995
  expires: import_zod18.z.string().optional(),
991
996
  // ISO 8601 — when video is no longer available
@@ -1022,13 +1027,13 @@ var EventAttendanceMode = import_zod19.z.enum([
1022
1027
  var PlaceRef = import_zod19.z.union([
1023
1028
  import_zod19.z.string(),
1024
1029
  import_zod19.z.object({
1025
- "@type": import_zod19.z.literal("Place"),
1030
+ "@type": import_zod19.z.literal("Place").default("Place"),
1026
1031
  name: import_zod19.z.string().optional(),
1027
1032
  address: import_zod19.z.union([import_zod19.z.string(), PostalAddressSchema]).optional(),
1028
1033
  url: import_zod19.z.url().optional()
1029
1034
  }),
1030
1035
  import_zod19.z.object({
1031
- "@type": import_zod19.z.literal("VirtualLocation"),
1036
+ "@type": import_zod19.z.literal("VirtualLocation").default("VirtualLocation"),
1032
1037
  url: import_zod19.z.url(),
1033
1038
  name: import_zod19.z.string().optional()
1034
1039
  }),
@@ -1057,11 +1062,15 @@ var EventSchema = extendThing("Event", {
1057
1062
  subEvent: import_zod19.z.lazy(
1058
1063
  () => import_zod19.z.array(import_zod19.z.object({ "@type": import_zod19.z.string() }).catchall(import_zod19.z.unknown()))
1059
1064
  ).optional(),
1060
- superEvent: import_zod19.z.lazy(
1061
- () => import_zod19.z.object({ "@type": import_zod19.z.string() }).catchall(import_zod19.z.unknown())
1062
- ).optional(),
1065
+ superEvent: import_zod19.z.lazy(() => import_zod19.z.object({ "@type": import_zod19.z.string() }).catchall(import_zod19.z.unknown())).optional(),
1063
1066
  // Additional:
1064
- inLanguage: import_zod19.z.union([import_zod19.z.string(), import_zod19.z.object({ "@type": import_zod19.z.literal("Language"), name: import_zod19.z.string() })]).optional(),
1067
+ inLanguage: import_zod19.z.union([
1068
+ import_zod19.z.string(),
1069
+ import_zod19.z.object({
1070
+ "@type": import_zod19.z.literal("Language").default("Language"),
1071
+ name: import_zod19.z.string()
1072
+ })
1073
+ ]).optional(),
1065
1074
  isAccessibleForFree: import_zod19.z.boolean().optional(),
1066
1075
  maximumAttendeeCapacity: import_zod19.z.number().int().nonnegative().optional(),
1067
1076
  remainingAttendeeCapacity: import_zod19.z.number().int().nonnegative().optional(),
@@ -1101,11 +1110,13 @@ var PlaceSchema = extendThing("Place", {
1101
1110
  maximumAttendeeCapacity: import_zod21.z.number().int().nonnegative().optional(),
1102
1111
  isAccessibleForFree: import_zod21.z.boolean().optional(),
1103
1112
  publicAccess: import_zod21.z.boolean().optional(),
1104
- amenityFeature: import_zod21.z.array(import_zod21.z.object({
1105
- "@type": import_zod21.z.literal("LocationFeatureSpecification").default("LocationFeatureSpecification"),
1106
- name: import_zod21.z.string(),
1107
- value: import_zod21.z.union([import_zod21.z.boolean(), import_zod21.z.string(), import_zod21.z.number()])
1108
- })).optional(),
1113
+ amenityFeature: import_zod21.z.array(
1114
+ import_zod21.z.object({
1115
+ "@type": import_zod21.z.literal("LocationFeatureSpecification").default("LocationFeatureSpecification"),
1116
+ name: import_zod21.z.string(),
1117
+ value: import_zod21.z.union([import_zod21.z.boolean(), import_zod21.z.string(), import_zod21.z.number()])
1118
+ })
1119
+ ).optional(),
1109
1120
  containedInPlace: import_zod21.z.lazy(
1110
1121
  () => import_zod21.z.object({ "@type": import_zod21.z.string(), name: import_zod21.z.string().optional() }).catchall(import_zod21.z.unknown())
1111
1122
  ).optional()
@@ -1132,11 +1143,14 @@ var LocalBusinessSchema = PlaceSchema.extend({
1132
1143
  import_zod22.z.literal("LodgingBusiness"),
1133
1144
  import_zod22.z.literal("GroceryStore"),
1134
1145
  import_zod22.z.literal("ShoppingCenter"),
1135
- import_zod22.z.literal("TravelAgency")
1146
+ import_zod22.z.literal("TravelAgency"),
1147
+ // Google allows @type to be a string or array for multi-typed entities
1148
+ import_zod22.z.string(),
1149
+ import_zod22.z.array(import_zod22.z.string())
1136
1150
  ]).default("LocalBusiness"),
1137
1151
  // Business identity:
1138
1152
  legalName: import_zod22.z.string().optional(),
1139
- email: import_zod22.z.email().optional(),
1153
+ email: import_zod22.z.string().email().optional(),
1140
1154
  logo: ImageOrUrl.optional(),
1141
1155
  contactPoint: import_zod22.z.union([ContactPointSchema, import_zod22.z.array(ContactPointSchema)]).optional(),
1142
1156
  // Ratings & reviews:
@@ -1168,7 +1182,9 @@ var LocalBusinessSchema = PlaceSchema.extend({
1168
1182
  });
1169
1183
  var createLocalBusiness = makeFactory(LocalBusinessSchema);
1170
1184
  var createRestaurant = makeFactory(
1171
- LocalBusinessSchema.extend({ "@type": import_zod22.z.literal("Restaurant").default("Restaurant") })
1185
+ LocalBusinessSchema.extend({
1186
+ "@type": import_zod22.z.literal("Restaurant").default("Restaurant")
1187
+ })
1172
1188
  );
1173
1189
  var createHotel = makeFactory(
1174
1190
  LocalBusinessSchema.extend({ "@type": import_zod22.z.literal("Hotel").default("Hotel") })
@@ -1193,7 +1209,10 @@ var MovieSchema = extendThing("Movie", {
1193
1209
  // ISO 3166
1194
1210
  inLanguage: import_zod23.z.union([
1195
1211
  import_zod23.z.string(),
1196
- import_zod23.z.object({ "@type": import_zod23.z.literal("Language"), name: import_zod23.z.string() })
1212
+ import_zod23.z.object({
1213
+ "@type": import_zod23.z.literal("Language").default("Language"),
1214
+ name: import_zod23.z.string()
1215
+ })
1197
1216
  ]).optional(),
1198
1217
  aggregateRating: AggregateRatingSchema.optional(),
1199
1218
  review: import_zod23.z.union([ReviewSchema, import_zod23.z.array(ReviewSchema)]).optional(),
@@ -1237,10 +1256,7 @@ var BorrowActionSchema = import_zod24.z.object({
1237
1256
  "@type": import_zod24.z.literal("BorrowAction").default("BorrowAction"),
1238
1257
  /** Library system or library lending this book */
1239
1258
  lender: import_zod24.z.object({
1240
- "@type": import_zod24.z.union([
1241
- import_zod24.z.literal("LibrarySystem"),
1242
- import_zod24.z.literal("Library")
1243
- ]),
1259
+ "@type": import_zod24.z.union([import_zod24.z.literal("LibrarySystem"), import_zod24.z.literal("Library")]),
1244
1260
  name: import_zod24.z.string(),
1245
1261
  url: import_zod24.z.url().optional(),
1246
1262
  /** Unique identifier for the library system */
@@ -1313,9 +1329,7 @@ var BookSchema = import_zod24.z.object({
1313
1329
  /** BCP 47 language tag */
1314
1330
  inLanguage: import_zod24.z.string().optional(),
1315
1331
  /** Aggregate rating across editions */
1316
- aggregateRating: import_zod24.z.lazy(
1317
- () => import_zod24.z.object({ "@type": import_zod24.z.string() }).catchall(import_zod24.z.unknown())
1318
- ).optional()
1332
+ aggregateRating: import_zod24.z.lazy(() => import_zod24.z.object({ "@type": import_zod24.z.string() }).catchall(import_zod24.z.unknown())).optional()
1319
1333
  });
1320
1334
  var createBook = makeFactory(BookSchema);
1321
1335
 
@@ -1337,18 +1351,23 @@ var CreativeWorkSchema = extendThing("CreativeWork", {
1337
1351
  inLanguage: import_zod25.z.union([
1338
1352
  import_zod25.z.string(),
1339
1353
  // BCP 47, e.g. "en-US"
1340
- import_zod25.z.object({ "@type": import_zod25.z.literal("Language"), name: import_zod25.z.string() })
1354
+ import_zod25.z.object({
1355
+ "@type": import_zod25.z.literal("Language").default("Language"),
1356
+ name: import_zod25.z.string()
1357
+ })
1341
1358
  ]).optional(),
1342
1359
  license: import_zod25.z.url().optional(),
1343
1360
  thumbnailUrl: import_zod25.z.url().optional(),
1344
1361
  isAccessibleForFree: import_zod25.z.boolean().optional(),
1345
1362
  image: import_zod25.z.union([ImageOrUrl, import_zod25.z.array(ImageOrUrl)]).optional(),
1346
1363
  // Paywalled content support:
1347
- hasPart: import_zod25.z.array(import_zod25.z.object({
1348
- "@type": import_zod25.z.string(),
1349
- isAccessibleForFree: import_zod25.z.boolean().optional(),
1350
- cssSelector: import_zod25.z.string().optional()
1351
- })).optional(),
1364
+ hasPart: import_zod25.z.array(
1365
+ import_zod25.z.object({
1366
+ "@type": import_zod25.z.string(),
1367
+ isAccessibleForFree: import_zod25.z.boolean().optional(),
1368
+ cssSelector: import_zod25.z.string().optional()
1369
+ })
1370
+ ).optional(),
1352
1371
  // For subscription / paywalled content
1353
1372
  isPartOf: import_zod25.z.object({
1354
1373
  "@type": import_zod25.z.string(),
@@ -1449,9 +1468,7 @@ var WebSiteSchema = CreativeWorkSchema.extend({
1449
1468
  // Site-level metadata
1450
1469
  copyrightYear: import_zod28.z.number().int().optional(),
1451
1470
  // isPartOf — rarely used for WebSite itself but allowed
1452
- isPartOf: import_zod28.z.lazy(
1453
- () => import_zod28.z.object({ "@type": import_zod28.z.string() }).catchall(import_zod28.z.unknown())
1454
- ).optional()
1471
+ isPartOf: import_zod28.z.lazy(() => import_zod28.z.object({ "@type": import_zod28.z.string() }).catchall(import_zod28.z.unknown())).optional()
1455
1472
  });
1456
1473
  var createWebSite = makeFactory(WebSiteSchema);
1457
1474
 
@@ -1490,16 +1507,21 @@ var DatasetSchema = CreativeWorkSchema.extend({
1490
1507
  // ISO 8601 or date range string
1491
1508
  spatialCoverage: import_zod29.z.union([
1492
1509
  import_zod29.z.string(),
1493
- import_zod29.z.object({ "@type": import_zod29.z.literal("Place"), name: import_zod29.z.string() })
1510
+ import_zod29.z.object({
1511
+ "@type": import_zod29.z.literal("Place").default("Place"),
1512
+ name: import_zod29.z.string()
1513
+ })
1494
1514
  ]).optional(),
1495
- distribution: import_zod29.z.array(import_zod29.z.object({
1496
- "@type": import_zod29.z.literal("DataDownload").default("DataDownload"),
1497
- encodingFormat: import_zod29.z.string(),
1498
- // MIME type or format name
1499
- contentUrl: import_zod29.z.url(),
1500
- name: import_zod29.z.string().optional(),
1501
- description: import_zod29.z.string().optional()
1502
- })).optional(),
1515
+ distribution: import_zod29.z.array(
1516
+ import_zod29.z.object({
1517
+ "@type": import_zod29.z.literal("DataDownload").default("DataDownload"),
1518
+ encodingFormat: import_zod29.z.string(),
1519
+ // MIME type or format name
1520
+ contentUrl: import_zod29.z.url(),
1521
+ name: import_zod29.z.string().optional(),
1522
+ description: import_zod29.z.string().optional()
1523
+ })
1524
+ ).optional(),
1503
1525
  includedInDataCatalog: import_zod29.z.object({
1504
1526
  "@type": import_zod29.z.literal("DataCatalog").default("DataCatalog"),
1505
1527
  name: import_zod29.z.string(),
@@ -1524,7 +1546,7 @@ var HowToStepSchema = import_zod30.z.object({
1524
1546
  // Step title (avoid "Step 1" format per Google)
1525
1547
  text: import_zod30.z.string(),
1526
1548
  // Step description
1527
- url: import_zod30.z.string().url().optional(),
1549
+ url: import_zod30.z.url().optional(),
1528
1550
  // Anchor link to step
1529
1551
  image: ImageOrUrl.optional()
1530
1552
  });
@@ -1645,11 +1667,13 @@ var CourseSchema = CreativeWorkSchema.extend({
1645
1667
  image: import_zod32.z.union([ImageOrUrl, import_zod32.z.array(ImageOrUrl)]).optional(),
1646
1668
  offers: import_zod32.z.union([OfferSchema, import_zod32.z.array(OfferSchema)]).optional(),
1647
1669
  inLanguage: import_zod32.z.union([import_zod32.z.string(), import_zod32.z.array(import_zod32.z.string())]).optional(),
1648
- syllabusSections: import_zod32.z.array(import_zod32.z.object({
1649
- "@type": import_zod32.z.literal("Syllabus").default("Syllabus"),
1650
- name: import_zod32.z.string(),
1651
- description: import_zod32.z.string().optional()
1652
- })).optional()
1670
+ syllabusSections: import_zod32.z.array(
1671
+ import_zod32.z.object({
1672
+ "@type": import_zod32.z.literal("Syllabus").default("Syllabus"),
1673
+ name: import_zod32.z.string(),
1674
+ description: import_zod32.z.string().optional()
1675
+ })
1676
+ ).optional()
1653
1677
  });
1654
1678
  var createCourse = makeFactory(CourseSchema);
1655
1679
 
@@ -1751,7 +1775,7 @@ var MathSolverSchema = CreativeWorkSchema.extend({
1751
1775
  educationalLevel: import_zod34.z.string().optional(),
1752
1776
  teaches: import_zod34.z.union([import_zod34.z.string(), import_zod34.z.array(import_zod34.z.string())]).optional(),
1753
1777
  /** URL of a page describing usage/terms for the solver — Google required field */
1754
- usageInfo: import_zod34.z.string().url().optional(),
1778
+ usageInfo: import_zod34.z.url().optional(),
1755
1779
  /** Learning resource type — defaults to "Math Solver" per Google spec */
1756
1780
  learningResourceType: import_zod34.z.string().default("Math Solver"),
1757
1781
  /** Topics the solver assesses */
@@ -1768,14 +1792,14 @@ var ClaimSchema = import_zod35.z.object({
1768
1792
  /** ISO 8601 date the claim was made */
1769
1793
  datePublished: import_zod35.z.string().optional(),
1770
1794
  /** URL of the first appearance of the claim */
1771
- firstAppearance: import_zod35.z.string().url().optional(),
1795
+ firstAppearance: import_zod35.z.url().optional(),
1772
1796
  /** URL(s) of other appearances of the claim */
1773
- appearance: import_zod35.z.union([import_zod35.z.string().url(), import_zod35.z.array(import_zod35.z.string().url())]).optional()
1797
+ appearance: import_zod35.z.union([import_zod35.z.url(), import_zod35.z.array(import_zod35.z.url())]).optional()
1774
1798
  });
1775
1799
  var ClaimReviewSchema = import_zod35.z.object({
1776
1800
  "@type": import_zod35.z.literal("ClaimReview").default("ClaimReview"),
1777
1801
  /** Canonical URL of the fact-check article */
1778
- url: import_zod35.z.string().url(),
1802
+ url: import_zod35.z.url(),
1779
1803
  /** The text of the claim being evaluated */
1780
1804
  claimReviewed: import_zod35.z.string(),
1781
1805
  /** The rating given by the fact-checker */
@@ -1792,7 +1816,7 @@ var ClaimReviewSchema = import_zod35.z.object({
1792
1816
  /** Name of the rating scale */
1793
1817
  name: import_zod35.z.string().optional(),
1794
1818
  /** URL of the rating explanation page */
1795
- image: import_zod35.z.string().url().optional()
1819
+ image: import_zod35.z.url().optional()
1796
1820
  }),
1797
1821
  /** The fact-checking author / organization */
1798
1822
  author: import_zod35.z.union([PersonOrOrgRef, import_zod35.z.array(PersonOrOrgRef)]).optional(),
@@ -1909,7 +1933,7 @@ var AlignmentObjectSchema = import_zod38.z.object({
1909
1933
  alignmentType: import_zod38.z.string(),
1910
1934
  targetName: import_zod38.z.string(),
1911
1935
  educationalFramework: import_zod38.z.string().optional(),
1912
- targetUrl: import_zod38.z.string().url().optional(),
1936
+ targetUrl: import_zod38.z.url().optional(),
1913
1937
  targetDescription: import_zod38.z.string().optional()
1914
1938
  });
1915
1939
  var AnswerSchema = import_zod38.z.object({
@@ -1920,16 +1944,18 @@ var AnswerSchema = import_zod38.z.object({
1920
1944
  dateModified: import_zod38.z.string().optional(),
1921
1945
  // ISO 8601
1922
1946
  upvoteCount: import_zod38.z.number().int().nonnegative().optional(),
1923
- url: import_zod38.z.string().url().optional(),
1947
+ url: import_zod38.z.url().optional(),
1924
1948
  author: PersonOrOrgRef.optional(),
1925
1949
  image: import_zod38.z.union([ImageOrUrl, import_zod38.z.array(ImageOrUrl)]).optional(),
1926
1950
  video: import_zod38.z.union([VideoObjectSchema, import_zod38.z.array(VideoObjectSchema)]).optional(),
1927
- comment: import_zod38.z.array(import_zod38.z.object({
1928
- "@type": import_zod38.z.literal("Comment").default("Comment"),
1929
- text: import_zod38.z.string(),
1930
- author: PersonOrOrgRef.optional(),
1931
- datePublished: import_zod38.z.string().optional()
1932
- })).optional()
1951
+ comment: import_zod38.z.array(
1952
+ import_zod38.z.object({
1953
+ "@type": import_zod38.z.literal("Comment").default("Comment"),
1954
+ text: import_zod38.z.string(),
1955
+ author: PersonOrOrgRef.optional(),
1956
+ datePublished: import_zod38.z.string().optional()
1957
+ })
1958
+ ).optional()
1933
1959
  });
1934
1960
  var QuestionSchema = import_zod38.z.object({
1935
1961
  "@type": import_zod38.z.literal("Question").default("Question"),
@@ -1946,7 +1972,7 @@ var QuestionSchema = import_zod38.z.object({
1946
1972
  datePublished: import_zod38.z.string().optional(),
1947
1973
  dateModified: import_zod38.z.string().optional(),
1948
1974
  // ISO 8601
1949
- url: import_zod38.z.string().url().optional(),
1975
+ url: import_zod38.z.url().optional(),
1950
1976
  image: import_zod38.z.union([ImageOrUrl, import_zod38.z.array(ImageOrUrl)]).optional(),
1951
1977
  video: import_zod38.z.union([VideoObjectSchema, import_zod38.z.array(VideoObjectSchema)]).optional(),
1952
1978
  /** Education Q&A question type, e.g. "Flashcard", "Problem Set" */
@@ -1964,9 +1990,7 @@ var QuizSchema = CreativeWorkSchema.extend({
1964
1990
  "@type": import_zod38.z.literal("Quiz").default("Quiz"),
1965
1991
  name: import_zod38.z.string().optional(),
1966
1992
  educationalLevel: import_zod38.z.string().optional(),
1967
- about: import_zod38.z.lazy(
1968
- () => import_zod38.z.object({ "@type": import_zod38.z.string() }).catchall(import_zod38.z.unknown())
1969
- ).optional(),
1993
+ about: import_zod38.z.lazy(() => import_zod38.z.object({ "@type": import_zod38.z.string() }).catchall(import_zod38.z.unknown())).optional(),
1970
1994
  hasPart: import_zod38.z.array(QuestionSchema).optional(),
1971
1995
  educationalAlignment: import_zod38.z.union([AlignmentObjectSchema, import_zod38.z.array(AlignmentObjectSchema)]).optional()
1972
1996
  });
@@ -1988,30 +2012,32 @@ var DiscussionForumPostingSchema = CreativeWorkSchema.extend({
1988
2012
  // ISO 8601
1989
2013
  dateModified: import_zod39.z.string().optional(),
1990
2014
  // ISO 8601
1991
- url: import_zod39.z.string().url().optional(),
1992
- comment: import_zod39.z.array(import_zod39.z.object({
1993
- "@type": import_zod39.z.literal("Comment").default("Comment"),
1994
- text: import_zod39.z.string(),
1995
- author: PersonOrOrgRef.optional(),
1996
- datePublished: import_zod39.z.string().optional(),
1997
- upvoteCount: import_zod39.z.number().int().nonnegative().optional(),
1998
- downvoteCount: import_zod39.z.number().int().nonnegative().optional(),
1999
- url: import_zod39.z.string().url().optional()
2000
- })).optional(),
2015
+ url: import_zod39.z.url().optional(),
2016
+ comment: import_zod39.z.array(
2017
+ import_zod39.z.object({
2018
+ "@type": import_zod39.z.literal("Comment").default("Comment"),
2019
+ text: import_zod39.z.string(),
2020
+ author: PersonOrOrgRef.optional(),
2021
+ datePublished: import_zod39.z.string().optional(),
2022
+ upvoteCount: import_zod39.z.number().int().nonnegative().optional(),
2023
+ downvoteCount: import_zod39.z.number().int().nonnegative().optional(),
2024
+ url: import_zod39.z.url().optional()
2025
+ })
2026
+ ).optional(),
2001
2027
  commentCount: import_zod39.z.number().int().nonnegative().optional(),
2002
2028
  upvoteCount: import_zod39.z.number().int().nonnegative().optional(),
2003
2029
  downvoteCount: import_zod39.z.number().int().nonnegative().optional(),
2004
2030
  image: ImageOrUrl.optional(),
2005
2031
  /** "published", "draft", "deleted" — or a schema.org enum URL */
2006
2032
  creativeWorkStatus: import_zod39.z.string().optional(),
2007
- mainEntityOfPage: import_zod39.z.union([import_zod39.z.string().url(), import_zod39.z.object({}).catchall(import_zod39.z.unknown())]).optional(),
2033
+ mainEntityOfPage: import_zod39.z.union([import_zod39.z.url(), import_zod39.z.object({}).catchall(import_zod39.z.unknown())]).optional(),
2008
2034
  // For reposts:
2009
- sharedContent: import_zod39.z.lazy(
2010
- () => import_zod39.z.object({ "@type": import_zod39.z.string() }).catchall(import_zod39.z.unknown())
2011
- ).optional(),
2035
+ sharedContent: import_zod39.z.lazy(() => import_zod39.z.object({ "@type": import_zod39.z.string() }).catchall(import_zod39.z.unknown())).optional(),
2012
2036
  interactionStatistic: import_zod39.z.union([InteractionCounterSchema, import_zod39.z.array(InteractionCounterSchema)]).optional()
2013
2037
  });
2014
- var createDiscussionForumPosting = makeFactory(DiscussionForumPostingSchema);
2038
+ var createDiscussionForumPosting = makeFactory(
2039
+ DiscussionForumPostingSchema
2040
+ );
2015
2041
 
2016
2042
  // src/types/intangibles/ItemList.ts
2017
2043
  var import_zod40 = require("zod");
@@ -2021,9 +2047,7 @@ var ListItemSchema = import_zod40.z.object({
2021
2047
  url: import_zod40.z.url().optional(),
2022
2048
  name: import_zod40.z.string().optional(),
2023
2049
  // item: the actual entity being listed (loose ref to any schema node)
2024
- item: import_zod40.z.lazy(
2025
- () => import_zod40.z.object({ "@type": import_zod40.z.string() }).catchall(import_zod40.z.unknown())
2026
- ).optional()
2050
+ item: import_zod40.z.lazy(() => import_zod40.z.object({ "@type": import_zod40.z.string() }).catchall(import_zod40.z.unknown())).optional()
2027
2051
  });
2028
2052
  var ItemListSchema = import_zod40.z.object({
2029
2053
  "@type": import_zod40.z.literal("ItemList").default("ItemList"),
@@ -2103,7 +2127,7 @@ var AccommodationSchema = import_zod42.z.object({
2103
2127
  import_zod42.z.array(LocationFeatureSpecificationSchema)
2104
2128
  ]).optional(),
2105
2129
  petsAllowed: import_zod42.z.union([import_zod42.z.boolean(), import_zod42.z.string()]).optional(),
2106
- url: import_zod42.z.string().url().optional(),
2130
+ url: import_zod42.z.url().optional(),
2107
2131
  /** "EntirePlace", "PrivateRoom", or "SharedRoom" */
2108
2132
  additionalType: import_zod42.z.string().optional()
2109
2133
  });
@@ -2137,11 +2161,14 @@ var VacationRentalSchema = LocalBusinessSchema.extend({
2137
2161
  ratingValue: import_zod42.z.number().min(0).max(5)
2138
2162
  }).optional(),
2139
2163
  offers: import_zod42.z.union([OfferSchema, import_zod42.z.array(OfferSchema)]).optional(),
2140
- leaseLength: import_zod42.z.union([import_zod42.z.string(), import_zod42.z.object({
2141
- "@type": import_zod42.z.literal("QuantitativeValue").default("QuantitativeValue"),
2142
- value: import_zod42.z.number(),
2143
- unitCode: import_zod42.z.string().optional()
2144
- })]).optional(),
2164
+ leaseLength: import_zod42.z.union([
2165
+ import_zod42.z.string(),
2166
+ import_zod42.z.object({
2167
+ "@type": import_zod42.z.literal("QuantitativeValue").default("QuantitativeValue"),
2168
+ value: import_zod42.z.number(),
2169
+ unitCode: import_zod42.z.string().optional()
2170
+ })
2171
+ ]).optional(),
2145
2172
  floorSize: import_zod42.z.object({
2146
2173
  "@type": import_zod42.z.literal("QuantitativeValue").default("QuantitativeValue"),
2147
2174
  value: import_zod42.z.number(),
@@ -2263,6 +2290,104 @@ function createGraph(nodes) {
2263
2290
  return graph;
2264
2291
  }
2265
2292
 
2293
+ // src/core/ids.ts
2294
+ var SchemaIds = class {
2295
+ constructor(origin) {
2296
+ this.origin = origin;
2297
+ }
2298
+ /** @internal Build an ID from origin + fragment */
2299
+ id(fragment) {
2300
+ return `${this.origin}/#${fragment}`;
2301
+ }
2302
+ // ── Well-known entity IDs ───────────────────────────────────────────────
2303
+ // Things
2304
+ organization() {
2305
+ return this.id("organization");
2306
+ }
2307
+ localBusiness() {
2308
+ return this.id("localbusiness");
2309
+ }
2310
+ person() {
2311
+ return this.id("person");
2312
+ }
2313
+ product() {
2314
+ return this.id("product");
2315
+ }
2316
+ event() {
2317
+ return this.id("event");
2318
+ }
2319
+ place() {
2320
+ return this.id("place");
2321
+ }
2322
+ movie() {
2323
+ return this.id("movie");
2324
+ }
2325
+ // Creative works
2326
+ website() {
2327
+ return this.id("website");
2328
+ }
2329
+ webpage() {
2330
+ return this.id("webpage");
2331
+ }
2332
+ article() {
2333
+ return this.id("article");
2334
+ }
2335
+ breadcrumb() {
2336
+ return this.id("breadcrumb");
2337
+ }
2338
+ dataset() {
2339
+ return this.id("dataset");
2340
+ }
2341
+ recipe() {
2342
+ return this.id("recipe");
2343
+ }
2344
+ course() {
2345
+ return this.id("course");
2346
+ }
2347
+ softwareApplication() {
2348
+ return this.id("softwareapplication");
2349
+ }
2350
+ // Intangibles & other
2351
+ faqPage() {
2352
+ return this.id("faqpage");
2353
+ }
2354
+ jobPosting() {
2355
+ return this.id("jobposting");
2356
+ }
2357
+ vacationRental() {
2358
+ return this.id("vacationrental");
2359
+ }
2360
+ profilePage() {
2361
+ return this.id("profilepage");
2362
+ }
2363
+ // ── Custom IDs ──────────────────────────────────────────────────────────
2364
+ /**
2365
+ * Generate an ID with any custom fragment.
2366
+ * @example ids.custom("hero-banner") // "https://example.com/#hero-banner"
2367
+ */
2368
+ custom(fragment) {
2369
+ return this.id(fragment);
2370
+ }
2371
+ /**
2372
+ * Generate an ID scoped to a specific page path.
2373
+ * @example ids.forPath("/about", "webpage") // "https://example.com/about#webpage"
2374
+ */
2375
+ forPath(path, fragment) {
2376
+ return `${this.origin}${path}#${fragment}`;
2377
+ }
2378
+ // ── Reference helper ────────────────────────────────────────────────────
2379
+ /**
2380
+ * Returns a `{ "@id": "..." }` reference object for cross-referencing
2381
+ * entities within a @graph. Pass to fields like publisher, organizer, etc.
2382
+ *
2383
+ * @example
2384
+ * createWebSite({ publisher: ids.ref("organization"), ... })
2385
+ */
2386
+ ref(fragment) {
2387
+ return { "@id": this.id(fragment) };
2388
+ }
2389
+ };
2390
+
2266
2391
  // src/helpers/breadcrumb.ts
2267
2392
  var import_zod43 = require("zod");
2268
2393
  var BreadcrumbListSchema = import_zod43.z.object({
@@ -2427,6 +2552,7 @@ function createPaywalledWebPage(data, options) {
2427
2552
  RecipeSchema,
2428
2553
  ReviewSchema,
2429
2554
  SchemaGraph,
2555
+ SchemaIds,
2430
2556
  SchemaNode,
2431
2557
  SeekToActionSchema,
2432
2558
  ServicePeriodSchema,