@svelte-vitals/core 0.40.0 → 0.41.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.d.ts CHANGED
@@ -486,6 +486,8 @@ interface ComponentFacts {
486
486
  url: string;
487
487
  line: number;
488
488
  }[];
489
+ /** Set when the file failed to read or parse and these facts are the empty fallback — the file was NOT analyzed. */
490
+ parseFailed?: true;
489
491
  }
490
492
 
491
493
  /** What the per-file parsers produce — `ComponentFacts` minus `file`, with `suppressions` always present. */
@@ -606,6 +608,8 @@ interface KitModuleFacts {
606
608
  };
607
609
  /** Inline `svelte-vitals-disable-next-line` directives in this file. */
608
610
  suppressions: SuppressionDirective[];
611
+ /** Set when the file failed to read or parse and these facts are the empty fallback — the file was NOT analyzed. */
612
+ parseFailed?: true;
609
613
  }
610
614
 
611
615
  /**
package/dist/index.js CHANGED
@@ -1587,7 +1587,7 @@ async function collectComponentFacts(rt, cwd) {
1587
1587
  const source = await rt.readFile(rt.join(cwd, rel));
1588
1588
  return { file: rel, ...parseComponentFacts(source, rel) };
1589
1589
  } catch {
1590
- return emptyComponentFacts(rel);
1590
+ return { ...emptyComponentFacts(rel), parseFailed: true };
1591
1591
  }
1592
1592
  })
1593
1593
  );
@@ -2167,7 +2167,7 @@ async function collectKitModuleFacts(rt, cwd, aliases) {
2167
2167
  const source = await rt.readFile(rt.join(cwd, rel));
2168
2168
  return { file: rel, kind, ...parseKitModuleFacts(source, rel, aliases) };
2169
2169
  } catch {
2170
- return emptyKitModuleFacts(rel, kind);
2170
+ return { ...emptyKitModuleFacts(rel, kind), parseFailed: true };
2171
2171
  }
2172
2172
  })
2173
2173
  );
@@ -2516,7 +2516,10 @@ var seoTitlePresence = {
2516
2516
 
2517
2517
  // src/rules/seo/head-tag-rule.ts
2518
2518
  function detect(head, match) {
2519
- const tag = head.tags.find(match);
2519
+ const matches = head.tags.filter(match);
2520
+ const rank = (t) => (t.value !== "absent" ? 2 : 0) + (t.presence === "own" ? 1 : 0);
2521
+ let tag;
2522
+ for (const m of matches) if (tag === void 0 || rank(m) > rank(tag)) tag = m;
2520
2523
  return tag ? { presence: tag.presence, value: tag.value } : { presence: "none", value: "absent" };
2521
2524
  }
2522
2525
  function headTagRule(opts) {
@@ -3573,6 +3576,23 @@ var DATE_KEYS = /* @__PURE__ */ new Set([
3573
3576
  "validFrom",
3574
3577
  "expires"
3575
3578
  ]);
3579
+ function contextValues(nodes) {
3580
+ const out = [];
3581
+ const walk = (v) => {
3582
+ if (Array.isArray(v)) {
3583
+ v.forEach(walk);
3584
+ return;
3585
+ }
3586
+ if (v && typeof v === "object") {
3587
+ for (const [k, val] of Object.entries(v)) {
3588
+ if (k === "@context") out.push(val);
3589
+ walk(val);
3590
+ }
3591
+ }
3592
+ };
3593
+ nodes.forEach(walk);
3594
+ return out;
3595
+ }
3576
3596
  var DEPRECATED_TYPES = /* @__PURE__ */ new Set(["HowTo", "FAQPage", "ClaimReview"]);
3577
3597
  function hasNonEmpty(node, key) {
3578
3598
  if (!(key in node)) return false;
@@ -3631,7 +3651,7 @@ function jsonldRule(opts) {
3631
3651
  severity: opts.severity,
3632
3652
  detection: PENALIZED,
3633
3653
  route: head.route,
3634
- location: head.file,
3654
+ location: tag.file ?? head.file,
3635
3655
  message: problem,
3636
3656
  recommendation: opts.recommendation,
3637
3657
  docsUrl: docsUrl12,
@@ -3644,7 +3664,7 @@ function jsonldRule(opts) {
3644
3664
  route: head.route,
3645
3665
  // Same `location` the penalized branch above uses (design
3646
3666
  // 2026-08-08-pass-result-location-design.md).
3647
- location: head.file,
3667
+ location: tag.file ?? head.file,
3648
3668
  message: opts.label,
3649
3669
  recommendation: opts.recommendation,
3650
3670
  docsUrl: docsUrl12
@@ -3657,14 +3677,1079 @@ function jsonldRule(opts) {
3657
3677
  };
3658
3678
  }
3659
3679
 
3680
+ // src/rules/seo/schema-vocabulary.generated.ts
3681
+ var SCHEMA_ORG_TYPES = /* @__PURE__ */ new Set([
3682
+ "3DModel",
3683
+ "AMRadioChannel",
3684
+ "APIReference",
3685
+ "AboutPage",
3686
+ "AcceptAction",
3687
+ "Accommodation",
3688
+ "AccountingService",
3689
+ "AchieveAction",
3690
+ "Action",
3691
+ "ActionAccessSpecification",
3692
+ "ActionStatusType",
3693
+ "ActivateAction",
3694
+ "AddAction",
3695
+ "AdministrativeArea",
3696
+ "AdultEntertainment",
3697
+ "AdultOrientedEnumeration",
3698
+ "AdvertiserContentArticle",
3699
+ "AggregateOffer",
3700
+ "AggregateRating",
3701
+ "AgreeAction",
3702
+ "Airline",
3703
+ "Airport",
3704
+ "AlignmentObject",
3705
+ "AllocateAction",
3706
+ "AmpStory",
3707
+ "AmusementPark",
3708
+ "AnalysisNewsArticle",
3709
+ "AnatomicalStructure",
3710
+ "AnatomicalSystem",
3711
+ "AnimalShelter",
3712
+ "Answer",
3713
+ "Apartment",
3714
+ "ApartmentComplex",
3715
+ "AppendAction",
3716
+ "ApplyAction",
3717
+ "ApprovedIndication",
3718
+ "Aquarium",
3719
+ "ArchiveComponent",
3720
+ "ArchiveOrganization",
3721
+ "ArriveAction",
3722
+ "ArtGallery",
3723
+ "Artery",
3724
+ "Article",
3725
+ "AskAction",
3726
+ "AskPublicNewsArticle",
3727
+ "AssessAction",
3728
+ "AssignAction",
3729
+ "Atlas",
3730
+ "Attorney",
3731
+ "Audience",
3732
+ "AudioObject",
3733
+ "AudioObjectSnapshot",
3734
+ "Audiobook",
3735
+ "AuthenticateAction",
3736
+ "AuthorizeAction",
3737
+ "AutoBodyShop",
3738
+ "AutoDealer",
3739
+ "AutoPartsStore",
3740
+ "AutoRental",
3741
+ "AutoRepair",
3742
+ "AutoWash",
3743
+ "AutomatedTeller",
3744
+ "AutomotiveBusiness",
3745
+ "BackgroundNewsArticle",
3746
+ "Bakery",
3747
+ "BankAccount",
3748
+ "BankOrCreditUnion",
3749
+ "BarOrPub",
3750
+ "Barcode",
3751
+ "Beach",
3752
+ "BeautySalon",
3753
+ "BedAndBreakfast",
3754
+ "BedDetails",
3755
+ "BedType",
3756
+ "BefriendAction",
3757
+ "BikeStore",
3758
+ "BioChemEntity",
3759
+ "Blog",
3760
+ "BlogPosting",
3761
+ "BloodTest",
3762
+ "BoardingPolicyType",
3763
+ "BoatReservation",
3764
+ "BoatTerminal",
3765
+ "BoatTrip",
3766
+ "BodyMeasurementTypeEnumeration",
3767
+ "BodyOfWater",
3768
+ "Bone",
3769
+ "Book",
3770
+ "BookFormatType",
3771
+ "BookSeries",
3772
+ "BookStore",
3773
+ "BookmarkAction",
3774
+ "Boolean",
3775
+ "BorrowAction",
3776
+ "BowlingAlley",
3777
+ "BrainStructure",
3778
+ "Brand",
3779
+ "BreadcrumbList",
3780
+ "Brewery",
3781
+ "Bridge",
3782
+ "BroadcastChannel",
3783
+ "BroadcastEvent",
3784
+ "BroadcastFrequencySpecification",
3785
+ "BroadcastService",
3786
+ "BrokerageAccount",
3787
+ "BuddhistTemple",
3788
+ "BusOrCoach",
3789
+ "BusReservation",
3790
+ "BusStation",
3791
+ "BusStop",
3792
+ "BusTrip",
3793
+ "BusinessAudience",
3794
+ "BusinessEntityType",
3795
+ "BusinessEvent",
3796
+ "BusinessFunction",
3797
+ "BuyAction",
3798
+ "CDCPMDRecord",
3799
+ "CableOrSatelliteService",
3800
+ "CafeOrCoffeeShop",
3801
+ "Campground",
3802
+ "CampingPitch",
3803
+ "Canal",
3804
+ "CancelAction",
3805
+ "Car",
3806
+ "CarUsageType",
3807
+ "Casino",
3808
+ "CategoryCode",
3809
+ "CategoryCodeSet",
3810
+ "CatholicChurch",
3811
+ "Cemetery",
3812
+ "Certification",
3813
+ "CertificationStatusEnumeration",
3814
+ "Chapter",
3815
+ "CheckAction",
3816
+ "CheckInAction",
3817
+ "CheckOutAction",
3818
+ "CheckoutPage",
3819
+ "ChemicalSubstance",
3820
+ "ChildCare",
3821
+ "ChildrensEvent",
3822
+ "ChooseAction",
3823
+ "Church",
3824
+ "City",
3825
+ "CityHall",
3826
+ "CivicStructure",
3827
+ "Claim",
3828
+ "ClaimReview",
3829
+ "Class",
3830
+ "Clip",
3831
+ "ClothingStore",
3832
+ "Code",
3833
+ "Collection",
3834
+ "CollectionPage",
3835
+ "CollegeOrUniversity",
3836
+ "ComedyClub",
3837
+ "ComedyEvent",
3838
+ "ComicCoverArt",
3839
+ "ComicIssue",
3840
+ "ComicSeries",
3841
+ "ComicStory",
3842
+ "Comment",
3843
+ "CommentAction",
3844
+ "CommunicateAction",
3845
+ "CommunityHealth",
3846
+ "CompleteDataFeed",
3847
+ "CompoundPriceSpecification",
3848
+ "ComputerLanguage",
3849
+ "ComputerStore",
3850
+ "ConferenceEvent",
3851
+ "ConfirmAction",
3852
+ "Consortium",
3853
+ "ConstraintNode",
3854
+ "ConsumeAction",
3855
+ "ContactPage",
3856
+ "ContactPoint",
3857
+ "ContactPointOption",
3858
+ "Continent",
3859
+ "ControlAction",
3860
+ "ConvenienceStore",
3861
+ "Conversation",
3862
+ "CookAction",
3863
+ "Cooperative",
3864
+ "Corporation",
3865
+ "CorrectionComment",
3866
+ "Country",
3867
+ "Course",
3868
+ "CourseInstance",
3869
+ "Courthouse",
3870
+ "CoverArt",
3871
+ "CovidTestingFacility",
3872
+ "CreateAction",
3873
+ "CreativeWork",
3874
+ "CreativeWorkSeason",
3875
+ "CreativeWorkSeries",
3876
+ "Credential",
3877
+ "CreditCard",
3878
+ "Crematorium",
3879
+ "CriticReview",
3880
+ "CssSelectorType",
3881
+ "CurrencyConversionService",
3882
+ "DDxElement",
3883
+ "DENonprofitType",
3884
+ "DanceEvent",
3885
+ "DanceGroup",
3886
+ "DataCatalog",
3887
+ "DataDownload",
3888
+ "DataFeed",
3889
+ "DataFeedItem",
3890
+ "DataType",
3891
+ "Dataset",
3892
+ "Date",
3893
+ "DateTime",
3894
+ "DatedMoneySpecification",
3895
+ "DayOfWeek",
3896
+ "DaySpa",
3897
+ "DeactivateAction",
3898
+ "DefenceEstablishment",
3899
+ "DefinedRegion",
3900
+ "DefinedTerm",
3901
+ "DefinedTermSet",
3902
+ "DeleteAction",
3903
+ "DeliveryChargeSpecification",
3904
+ "DeliveryEvent",
3905
+ "DeliveryMethod",
3906
+ "DeliveryTimeSettings",
3907
+ "Demand",
3908
+ "Dentist",
3909
+ "DepartAction",
3910
+ "DepartmentStore",
3911
+ "DepositAccount",
3912
+ "Dermatology",
3913
+ "DiagnosticLab",
3914
+ "DiagnosticProcedure",
3915
+ "Diet",
3916
+ "DietNutrition",
3917
+ "DietarySupplement",
3918
+ "DigitalDocument",
3919
+ "DigitalDocumentPermission",
3920
+ "DigitalDocumentPermissionType",
3921
+ "DigitalPlatformEnumeration",
3922
+ "DisagreeAction",
3923
+ "DiscoverAction",
3924
+ "DiscussionForumPosting",
3925
+ "DislikeAction",
3926
+ "Distance",
3927
+ "Distillery",
3928
+ "DonateAction",
3929
+ "DoseSchedule",
3930
+ "DownloadAction",
3931
+ "DrawAction",
3932
+ "Drawing",
3933
+ "DrinkAction",
3934
+ "DriveWheelConfigurationValue",
3935
+ "Drug",
3936
+ "DrugClass",
3937
+ "DrugCost",
3938
+ "DrugCostCategory",
3939
+ "DrugLegalStatus",
3940
+ "DrugPregnancyCategory",
3941
+ "DrugPrescriptionStatus",
3942
+ "DrugStrength",
3943
+ "DryCleaningOrLaundry",
3944
+ "Duration",
3945
+ "EUEnergyEfficiencyEnumeration",
3946
+ "EatAction",
3947
+ "EducationEvent",
3948
+ "EducationalAudience",
3949
+ "EducationalOccupationalCredential",
3950
+ "EducationalOccupationalProgram",
3951
+ "EducationalOrganization",
3952
+ "Electrician",
3953
+ "ElectronicsStore",
3954
+ "ElementarySchool",
3955
+ "EmailMessage",
3956
+ "Embassy",
3957
+ "Emergency",
3958
+ "EmergencyService",
3959
+ "EmployeeRole",
3960
+ "EmployerAggregateRating",
3961
+ "EmployerReview",
3962
+ "EmploymentAgency",
3963
+ "EndorseAction",
3964
+ "EndorsementRating",
3965
+ "Energy",
3966
+ "EnergyConsumptionDetails",
3967
+ "EnergyEfficiencyEnumeration",
3968
+ "EnergyStarEnergyEfficiencyEnumeration",
3969
+ "EngineSpecification",
3970
+ "EntertainmentBusiness",
3971
+ "EntryPoint",
3972
+ "Enumeration",
3973
+ "Episode",
3974
+ "Error",
3975
+ "Event",
3976
+ "EventAttendanceModeEnumeration",
3977
+ "EventReservation",
3978
+ "EventSeries",
3979
+ "EventStatusType",
3980
+ "EventVenue",
3981
+ "ExchangeRateSpecification",
3982
+ "ExerciseAction",
3983
+ "ExerciseGym",
3984
+ "ExercisePlan",
3985
+ "ExhibitionEvent",
3986
+ "FAQPage",
3987
+ "FMRadioChannel",
3988
+ "FastFoodRestaurant",
3989
+ "Festival",
3990
+ "FilmAction",
3991
+ "FinancialIncentive",
3992
+ "FinancialProduct",
3993
+ "FinancialService",
3994
+ "FindAction",
3995
+ "FireStation",
3996
+ "Flight",
3997
+ "FlightReservation",
3998
+ "Float",
3999
+ "FloorPlan",
4000
+ "Florist",
4001
+ "FollowAction",
4002
+ "FoodEstablishment",
4003
+ "FoodEstablishmentReservation",
4004
+ "FoodEvent",
4005
+ "FoodService",
4006
+ "FulfillmentTypeEnumeration",
4007
+ "FundingAgency",
4008
+ "FundingScheme",
4009
+ "FurnitureStore",
4010
+ "Game",
4011
+ "GameAvailabilityEnumeration",
4012
+ "GamePlayMode",
4013
+ "GameServer",
4014
+ "GameServerStatus",
4015
+ "GardenStore",
4016
+ "GasStation",
4017
+ "GatedResidenceCommunity",
4018
+ "GenderType",
4019
+ "Gene",
4020
+ "GeneralContractor",
4021
+ "GeoCircle",
4022
+ "GeoCoordinates",
4023
+ "GeoShape",
4024
+ "GeospatialGeometry",
4025
+ "Geriatric",
4026
+ "GiveAction",
4027
+ "GolfCourse",
4028
+ "GovernmentBenefitsType",
4029
+ "GovernmentBuilding",
4030
+ "GovernmentOffice",
4031
+ "GovernmentOrganization",
4032
+ "GovernmentPermit",
4033
+ "GovernmentService",
4034
+ "Grant",
4035
+ "GroceryStore",
4036
+ "Guide",
4037
+ "Gynecologic",
4038
+ "HVACBusiness",
4039
+ "Hackathon",
4040
+ "HairSalon",
4041
+ "HardwareStore",
4042
+ "HealthAndBeautyBusiness",
4043
+ "HealthAspectEnumeration",
4044
+ "HealthClub",
4045
+ "HealthInsurancePlan",
4046
+ "HealthPlanCostSharingSpecification",
4047
+ "HealthPlanFormulary",
4048
+ "HealthPlanNetwork",
4049
+ "HealthTopicContent",
4050
+ "HighSchool",
4051
+ "HinduTemple",
4052
+ "HobbyShop",
4053
+ "HomeAndConstructionBusiness",
4054
+ "HomeGoodsStore",
4055
+ "Hospital",
4056
+ "Hostel",
4057
+ "Hotel",
4058
+ "HotelRoom",
4059
+ "House",
4060
+ "HousePainter",
4061
+ "HowTo",
4062
+ "HowToDirection",
4063
+ "HowToItem",
4064
+ "HowToSection",
4065
+ "HowToStep",
4066
+ "HowToSupply",
4067
+ "HowToTip",
4068
+ "HowToTool",
4069
+ "HyperToc",
4070
+ "HyperTocEntry",
4071
+ "IPTCDigitalSourceEnumeration",
4072
+ "ITNonprofitType",
4073
+ "IceCreamShop",
4074
+ "IgnoreAction",
4075
+ "ImageGallery",
4076
+ "ImageObject",
4077
+ "ImageObjectSnapshot",
4078
+ "ImagingTest",
4079
+ "IncentiveQualifiedExpenseType",
4080
+ "IncentiveStatus",
4081
+ "IncentiveType",
4082
+ "IndividualPhysician",
4083
+ "IndividualProduct",
4084
+ "InfectiousAgentClass",
4085
+ "InfectiousDisease",
4086
+ "InformAction",
4087
+ "InsertAction",
4088
+ "InstallAction",
4089
+ "InstantaneousEvent",
4090
+ "InsuranceAgency",
4091
+ "Intangible",
4092
+ "Integer",
4093
+ "InteractAction",
4094
+ "InteractionCounter",
4095
+ "InternetCafe",
4096
+ "InvestmentFund",
4097
+ "InvestmentOrDeposit",
4098
+ "InviteAction",
4099
+ "Invoice",
4100
+ "ItemAvailability",
4101
+ "ItemList",
4102
+ "ItemListOrderType",
4103
+ "ItemPage",
4104
+ "JewelryStore",
4105
+ "JobPosting",
4106
+ "JoinAction",
4107
+ "Joint",
4108
+ "LakeBodyOfWater",
4109
+ "Landform",
4110
+ "LandmarksOrHistoricalBuildings",
4111
+ "Language",
4112
+ "LearningResource",
4113
+ "LeaveAction",
4114
+ "LegalForceStatus",
4115
+ "LegalService",
4116
+ "LegalValueLevel",
4117
+ "Legislation",
4118
+ "LegislationObject",
4119
+ "LegislativeBuilding",
4120
+ "LendAction",
4121
+ "Library",
4122
+ "LibrarySystem",
4123
+ "LifestyleModification",
4124
+ "Ligament",
4125
+ "LikeAction",
4126
+ "LinkRole",
4127
+ "LiquorStore",
4128
+ "ListItem",
4129
+ "ListenAction",
4130
+ "LiteraryEvent",
4131
+ "LiveBlogPosting",
4132
+ "LoanOrCredit",
4133
+ "LocalBusiness",
4134
+ "LocationFeatureSpecification",
4135
+ "Locksmith",
4136
+ "LodgingBusiness",
4137
+ "LodgingReservation",
4138
+ "LoginAction",
4139
+ "LoseAction",
4140
+ "LymphaticVessel",
4141
+ "Manuscript",
4142
+ "Map",
4143
+ "MapCategoryType",
4144
+ "MarryAction",
4145
+ "Mass",
4146
+ "MathSolver",
4147
+ "MaximumDoseSchedule",
4148
+ "MeasurementMethodEnum",
4149
+ "MeasurementTypeEnumeration",
4150
+ "MediaEnumeration",
4151
+ "MediaGallery",
4152
+ "MediaManipulationRatingEnumeration",
4153
+ "MediaObject",
4154
+ "MediaReview",
4155
+ "MediaReviewItem",
4156
+ "MediaSubscription",
4157
+ "MedicalAudience",
4158
+ "MedicalAudienceType",
4159
+ "MedicalBusiness",
4160
+ "MedicalCause",
4161
+ "MedicalClinic",
4162
+ "MedicalCode",
4163
+ "MedicalCondition",
4164
+ "MedicalConditionStage",
4165
+ "MedicalContraindication",
4166
+ "MedicalDevice",
4167
+ "MedicalDevicePurpose",
4168
+ "MedicalEntity",
4169
+ "MedicalEnumeration",
4170
+ "MedicalEvidenceLevel",
4171
+ "MedicalGuideline",
4172
+ "MedicalGuidelineContraindication",
4173
+ "MedicalGuidelineRecommendation",
4174
+ "MedicalImagingTechnique",
4175
+ "MedicalIndication",
4176
+ "MedicalIntangible",
4177
+ "MedicalObservationalStudy",
4178
+ "MedicalObservationalStudyDesign",
4179
+ "MedicalOrganization",
4180
+ "MedicalProcedure",
4181
+ "MedicalProcedureType",
4182
+ "MedicalRiskCalculator",
4183
+ "MedicalRiskEstimator",
4184
+ "MedicalRiskFactor",
4185
+ "MedicalRiskScore",
4186
+ "MedicalScholarlyArticle",
4187
+ "MedicalSign",
4188
+ "MedicalSignOrSymptom",
4189
+ "MedicalSpecialty",
4190
+ "MedicalStudy",
4191
+ "MedicalStudyStatus",
4192
+ "MedicalSymptom",
4193
+ "MedicalTest",
4194
+ "MedicalTestPanel",
4195
+ "MedicalTherapy",
4196
+ "MedicalTrial",
4197
+ "MedicalTrialDesign",
4198
+ "MedicalWebPage",
4199
+ "MedicineSystem",
4200
+ "MeetingRoom",
4201
+ "MemberProgram",
4202
+ "MemberProgramTier",
4203
+ "MensClothingStore",
4204
+ "Menu",
4205
+ "MenuItem",
4206
+ "MenuSection",
4207
+ "MerchantReturnEnumeration",
4208
+ "MerchantReturnPolicy",
4209
+ "MerchantReturnPolicySeasonalOverride",
4210
+ "Message",
4211
+ "MiddleSchool",
4212
+ "Midwifery",
4213
+ "MobileApplication",
4214
+ "MobilePhoneStore",
4215
+ "MolecularEntity",
4216
+ "MonetaryAmount",
4217
+ "MonetaryAmountDistribution",
4218
+ "MonetaryGrant",
4219
+ "MoneyTransfer",
4220
+ "MortgageLoan",
4221
+ "Mosque",
4222
+ "Motel",
4223
+ "Motorcycle",
4224
+ "MotorcycleDealer",
4225
+ "MotorcycleRepair",
4226
+ "MotorizedBicycle",
4227
+ "Mountain",
4228
+ "MoveAction",
4229
+ "Movie",
4230
+ "MovieClip",
4231
+ "MovieRentalStore",
4232
+ "MovieSeries",
4233
+ "MovieTheater",
4234
+ "MovingCompany",
4235
+ "Muscle",
4236
+ "Museum",
4237
+ "MusicAlbum",
4238
+ "MusicAlbumProductionType",
4239
+ "MusicAlbumReleaseType",
4240
+ "MusicComposition",
4241
+ "MusicEvent",
4242
+ "MusicGroup",
4243
+ "MusicPlaylist",
4244
+ "MusicRecording",
4245
+ "MusicRelease",
4246
+ "MusicReleaseFormatType",
4247
+ "MusicStore",
4248
+ "MusicVenue",
4249
+ "MusicVideoObject",
4250
+ "NGO",
4251
+ "NLNonprofitType",
4252
+ "NailSalon",
4253
+ "Nerve",
4254
+ "NewsArticle",
4255
+ "NewsMediaOrganization",
4256
+ "Newspaper",
4257
+ "NightClub",
4258
+ "NonprofitType",
4259
+ "Notary",
4260
+ "NoteDigitalDocument",
4261
+ "Number",
4262
+ "Nursing",
4263
+ "NutritionInformation",
4264
+ "Observation",
4265
+ "Obstetric",
4266
+ "Occupation",
4267
+ "OccupationalExperienceRequirements",
4268
+ "OccupationalTherapy",
4269
+ "OceanBodyOfWater",
4270
+ "Offer",
4271
+ "OfferCatalog",
4272
+ "OfferForLease",
4273
+ "OfferForPurchase",
4274
+ "OfferItemCondition",
4275
+ "OfferShippingDetails",
4276
+ "OfficeEquipmentStore",
4277
+ "OnDemandEvent",
4278
+ "Oncologic",
4279
+ "OnlineBusiness",
4280
+ "OnlineMarketplace",
4281
+ "OnlineStore",
4282
+ "OpeningHoursSpecification",
4283
+ "OperatingSystem",
4284
+ "OpinionNewsArticle",
4285
+ "Optician",
4286
+ "Optometric",
4287
+ "Order",
4288
+ "OrderAction",
4289
+ "OrderItem",
4290
+ "OrderStatus",
4291
+ "Organization",
4292
+ "OrganizationRole",
4293
+ "OrganizeAction",
4294
+ "Otolaryngologic",
4295
+ "OutletStore",
4296
+ "OwnershipInfo",
4297
+ "PaintAction",
4298
+ "Painting",
4299
+ "PalliativeProcedure",
4300
+ "ParcelDelivery",
4301
+ "ParentAudience",
4302
+ "Park",
4303
+ "ParkingFacility",
4304
+ "PathologyTest",
4305
+ "Patient",
4306
+ "PawnShop",
4307
+ "PayAction",
4308
+ "PaymentCard",
4309
+ "PaymentChargeSpecification",
4310
+ "PaymentMethod",
4311
+ "PaymentMethodType",
4312
+ "PaymentService",
4313
+ "PaymentStatusType",
4314
+ "Pediatric",
4315
+ "PeopleAudience",
4316
+ "PerformAction",
4317
+ "PerformanceRole",
4318
+ "PerformingArtsEvent",
4319
+ "PerformingArtsTheater",
4320
+ "PerformingGroup",
4321
+ "Periodical",
4322
+ "Permit",
4323
+ "Person",
4324
+ "PetStore",
4325
+ "Pharmacy",
4326
+ "Photograph",
4327
+ "PhotographAction",
4328
+ "PhysicalActivity",
4329
+ "PhysicalActivityCategory",
4330
+ "PhysicalExam",
4331
+ "PhysicalTherapy",
4332
+ "Physician",
4333
+ "PhysiciansOffice",
4334
+ "Physiotherapy",
4335
+ "Place",
4336
+ "PlaceOfWorship",
4337
+ "PlanAction",
4338
+ "PlasticSurgery",
4339
+ "Play",
4340
+ "PlayAction",
4341
+ "PlayGameAction",
4342
+ "Playground",
4343
+ "Plumber",
4344
+ "PodcastEpisode",
4345
+ "PodcastSeason",
4346
+ "PodcastSeries",
4347
+ "Podiatric",
4348
+ "PoliceStation",
4349
+ "PoliticalParty",
4350
+ "Pond",
4351
+ "PostOffice",
4352
+ "PostalAddress",
4353
+ "PostalCodeRangeSpecification",
4354
+ "Poster",
4355
+ "PreOrderAction",
4356
+ "PrependAction",
4357
+ "Preschool",
4358
+ "PresentationDigitalDocument",
4359
+ "PreventionIndication",
4360
+ "PriceComponentTypeEnumeration",
4361
+ "PriceSpecification",
4362
+ "PriceTypeEnumeration",
4363
+ "PrimaryCare",
4364
+ "Product",
4365
+ "ProductCollection",
4366
+ "ProductGroup",
4367
+ "ProductModel",
4368
+ "ProductReturnEnumeration",
4369
+ "ProductReturnPolicy",
4370
+ "ProfessionalService",
4371
+ "ProfilePage",
4372
+ "ProgramMembership",
4373
+ "Project",
4374
+ "PronounceableText",
4375
+ "Property",
4376
+ "PropertyValue",
4377
+ "PropertyValueSpecification",
4378
+ "Protein",
4379
+ "Psychiatric",
4380
+ "PsychologicalTreatment",
4381
+ "PublicHealth",
4382
+ "PublicSwimmingPool",
4383
+ "PublicToilet",
4384
+ "PublicationEvent",
4385
+ "PublicationIssue",
4386
+ "PublicationVolume",
4387
+ "PurchaseType",
4388
+ "QAPage",
4389
+ "QualitativeValue",
4390
+ "QuantitativeValue",
4391
+ "QuantitativeValueDistribution",
4392
+ "Quantity",
4393
+ "Question",
4394
+ "Quiz",
4395
+ "Quotation",
4396
+ "QuoteAction",
4397
+ "RVPark",
4398
+ "RadiationTherapy",
4399
+ "RadioBroadcastService",
4400
+ "RadioChannel",
4401
+ "RadioClip",
4402
+ "RadioEpisode",
4403
+ "RadioSeason",
4404
+ "RadioSeries",
4405
+ "RadioStation",
4406
+ "Rating",
4407
+ "ReactAction",
4408
+ "ReadAction",
4409
+ "RealEstateAgent",
4410
+ "RealEstateListing",
4411
+ "ReceiveAction",
4412
+ "Recipe",
4413
+ "Recommendation",
4414
+ "RecommendedDoseSchedule",
4415
+ "RecyclingCenter",
4416
+ "RefundTypeEnumeration",
4417
+ "RegisterAction",
4418
+ "RejectAction",
4419
+ "RentAction",
4420
+ "RentalCarReservation",
4421
+ "RepaymentSpecification",
4422
+ "ReplaceAction",
4423
+ "ReplyAction",
4424
+ "Report",
4425
+ "ReportageNewsArticle",
4426
+ "ReportedDoseSchedule",
4427
+ "ResearchOrganization",
4428
+ "ResearchProject",
4429
+ "Researcher",
4430
+ "Reservation",
4431
+ "ReservationPackage",
4432
+ "ReservationStatusType",
4433
+ "ReserveAction",
4434
+ "Reservoir",
4435
+ "ResetPasswordAction",
4436
+ "Residence",
4437
+ "Resort",
4438
+ "RespiratoryTherapy",
4439
+ "Restaurant",
4440
+ "RestrictedDiet",
4441
+ "ResumeAction",
4442
+ "ReturnAction",
4443
+ "ReturnFeesEnumeration",
4444
+ "ReturnLabelSourceEnumeration",
4445
+ "ReturnMethodEnumeration",
4446
+ "Review",
4447
+ "ReviewAction",
4448
+ "ReviewNewsArticle",
4449
+ "RiverBodyOfWater",
4450
+ "Role",
4451
+ "RoofingContractor",
4452
+ "Room",
4453
+ "RsvpAction",
4454
+ "RsvpResponseType",
4455
+ "RuntimePlatform",
4456
+ "SaleEvent",
4457
+ "SatiricalArticle",
4458
+ "Schedule",
4459
+ "ScheduleAction",
4460
+ "ScholarlyArticle",
4461
+ "School",
4462
+ "SchoolDistrict",
4463
+ "ScreeningEvent",
4464
+ "Sculpture",
4465
+ "SeaBodyOfWater",
4466
+ "SearchAction",
4467
+ "SearchRescueOrganization",
4468
+ "SearchResultsPage",
4469
+ "Season",
4470
+ "Seat",
4471
+ "SeekToAction",
4472
+ "SelfStorage",
4473
+ "SellAction",
4474
+ "SendAction",
4475
+ "SequentialArt",
4476
+ "Series",
4477
+ "Service",
4478
+ "ServiceChannel",
4479
+ "ServicePeriod",
4480
+ "ShareAction",
4481
+ "SheetMusic",
4482
+ "ShippingConditions",
4483
+ "ShippingDeliveryTime",
4484
+ "ShippingRateSettings",
4485
+ "ShippingService",
4486
+ "ShoeStore",
4487
+ "ShoppingCenter",
4488
+ "ShortStory",
4489
+ "SingleFamilyResidence",
4490
+ "SiteNavigationElement",
4491
+ "SizeGroupEnumeration",
4492
+ "SizeSpecification",
4493
+ "SizeSystemEnumeration",
4494
+ "SkiResort",
4495
+ "SocialEvent",
4496
+ "SocialMediaPosting",
4497
+ "SoftwareApplication",
4498
+ "SoftwareSourceCode",
4499
+ "SolveMathAction",
4500
+ "SomeProducts",
4501
+ "SpeakableSpecification",
4502
+ "SpecialAnnouncement",
4503
+ "Specialty",
4504
+ "SportingGoodsStore",
4505
+ "SportsActivityLocation",
4506
+ "SportsClub",
4507
+ "SportsEvent",
4508
+ "SportsOrganization",
4509
+ "SportsTeam",
4510
+ "SpreadsheetDigitalDocument",
4511
+ "StadiumOrArena",
4512
+ "State",
4513
+ "Statement",
4514
+ "StatisticalPopulation",
4515
+ "StatisticalVariable",
4516
+ "StatusEnumeration",
4517
+ "SteeringPositionValue",
4518
+ "Store",
4519
+ "StructuredValue",
4520
+ "StupidType",
4521
+ "SubscribeAction",
4522
+ "Substance",
4523
+ "SubwayStation",
4524
+ "Suite",
4525
+ "SuperficialAnatomy",
4526
+ "SurgicalProcedure",
4527
+ "SuspendAction",
4528
+ "Syllabus",
4529
+ "Synagogue",
4530
+ "TVClip",
4531
+ "TVEpisode",
4532
+ "TVSeason",
4533
+ "TVSeries",
4534
+ "Table",
4535
+ "TakeAction",
4536
+ "TattooParlor",
4537
+ "Taxi",
4538
+ "TaxiReservation",
4539
+ "TaxiService",
4540
+ "TaxiStand",
4541
+ "Taxon",
4542
+ "TechArticle",
4543
+ "TelevisionChannel",
4544
+ "TelevisionStation",
4545
+ "TennisComplex",
4546
+ "Text",
4547
+ "TextDigitalDocument",
4548
+ "TextObject",
4549
+ "TheaterEvent",
4550
+ "TheaterGroup",
4551
+ "TherapeuticProcedure",
4552
+ "Thesis",
4553
+ "Thing",
4554
+ "Ticket",
4555
+ "TieAction",
4556
+ "TierBenefitEnumeration",
4557
+ "Time",
4558
+ "TipAction",
4559
+ "TireShop",
4560
+ "TouristAttraction",
4561
+ "TouristDestination",
4562
+ "TouristInformationCenter",
4563
+ "TouristTrip",
4564
+ "ToyStore",
4565
+ "TrackAction",
4566
+ "TradeAction",
4567
+ "TrainReservation",
4568
+ "TrainStation",
4569
+ "TrainTrip",
4570
+ "TransferAction",
4571
+ "TravelAction",
4572
+ "TravelAgency",
4573
+ "TreatmentIndication",
4574
+ "Trip",
4575
+ "TypeAndQuantityNode",
4576
+ "UKNonprofitType",
4577
+ "URL",
4578
+ "USNonprofitType",
4579
+ "UnRegisterAction",
4580
+ "UnitPriceSpecification",
4581
+ "UpdateAction",
4582
+ "UseAction",
4583
+ "UserBlocks",
4584
+ "UserCheckins",
4585
+ "UserComments",
4586
+ "UserDownloads",
4587
+ "UserInteraction",
4588
+ "UserLikes",
4589
+ "UserPageVisits",
4590
+ "UserPlays",
4591
+ "UserPlusOnes",
4592
+ "UserReview",
4593
+ "UserTweets",
4594
+ "VacationRental",
4595
+ "Vehicle",
4596
+ "Vein",
4597
+ "Vessel",
4598
+ "VeterinaryCare",
4599
+ "VideoGallery",
4600
+ "VideoGame",
4601
+ "VideoGameClip",
4602
+ "VideoGameSeries",
4603
+ "VideoObject",
4604
+ "VideoObjectSnapshot",
4605
+ "ViewAction",
4606
+ "VirtualLocation",
4607
+ "VisualArtsEvent",
4608
+ "VisualArtwork",
4609
+ "VitalSign",
4610
+ "Volcano",
4611
+ "VoteAction",
4612
+ "WPAdBlock",
4613
+ "WPFooter",
4614
+ "WPHeader",
4615
+ "WPSideBar",
4616
+ "WantAction",
4617
+ "WarrantyPromise",
4618
+ "WarrantyScope",
4619
+ "WatchAction",
4620
+ "Waterfall",
4621
+ "WearAction",
4622
+ "WearableMeasurementTypeEnumeration",
4623
+ "WearableSizeGroupEnumeration",
4624
+ "WearableSizeSystemEnumeration",
4625
+ "WebAPI",
4626
+ "WebApplication",
4627
+ "WebContent",
4628
+ "WebPage",
4629
+ "WebPageElement",
4630
+ "WebSite",
4631
+ "WholesaleStore",
4632
+ "WinAction",
4633
+ "Winery",
4634
+ "WorkBasedProgram",
4635
+ "WorkersUnion",
4636
+ "WriteAction",
4637
+ "XPathType",
4638
+ "Zoo",
4639
+ "iflastandards_info_ns_lrm_lrmoo_F31_Performance",
4640
+ "purl_bioontology_org_ontology_SNOMEDCT_105590001",
4641
+ "purl_bioontology_org_ontology_SNOMEDCT_116154003",
4642
+ "purl_bioontology_org_ontology_SNOMEDCT_277132007",
4643
+ "purl_bioontology_org_ontology_SNOMEDCT_387713003",
4644
+ "purl_bioontology_org_ontology_SNOMEDCT_410942007",
4645
+ "purl_bioontology_org_ontology_SNOMEDCT_50731006",
4646
+ "purl_bioontology_org_ontology_SNOMEDCT_51114001",
4647
+ "purl_bioontology_org_ontology_SNOMEDCT_63653004",
4648
+ "purl_org_dc_dcmitype_Dataset",
4649
+ "purl_org_dc_dcmitype_Event",
4650
+ "purl_org_dc_dcmitype_Image",
4651
+ "purl_org_dc_dcmitype_Text",
4652
+ "purl_org_ontology_bibo_Issue",
4653
+ "purl_org_ontology_bibo_Periodical",
4654
+ "rdfs_org_ns_void_Dataset",
4655
+ "ref_gs1_org_voc_CertificationDetails",
4656
+ "ref_gs1_org_voc_ContactPoint",
4657
+ "ref_gs1_org_voc_Country",
4658
+ "ref_gs1_org_voc_Organization",
4659
+ "ref_gs1_org_voc_PostalAddress",
4660
+ "sarif_info_Result",
4661
+ "spec_edmcouncil_org_fibo_ontology_BE_Corporations_Corporations_Corporation",
4662
+ "spec_edmcouncil_org_fibo_ontology_BE_LegalEntities_CorporateBodies_CooperativeSociety",
4663
+ "spec_edmcouncil_org_fibo_ontology_BE_NotForProfitOrganizations_NotForProfitOrganizations_NonGovernmentalOrganization",
4664
+ "spec_edmcouncil_org_fibo_ontology_FBC_ProductsAndServices_FinancialProductsAndServices_BankAccount",
4665
+ "spec_edmcouncil_org_fibo_ontology_FBC_ProductsAndServices_FinancialProductsAndServices_PaymentMechanism",
4666
+ "spec_edmcouncil_org_fibo_ontology_FND_Agreements_Contracts_MutualContractualAgreement",
4667
+ "spec_edmcouncil_org_fibo_ontology_FND_Arrangements_Documents_Certificate",
4668
+ "spec_edmcouncil_org_fibo_ontology_FND_Arrangements_Documents_Document",
4669
+ "spec_edmcouncil_org_fibo_ontology_FND_Arrangements_Documents_LegalDocument",
4670
+ "spec_edmcouncil_org_fibo_ontology_FND_DatesAndTimes_Occurrences_Occurrence",
4671
+ "spec_edmcouncil_org_fibo_ontology_FND_Organizations_Organizations_ContactPoint",
4672
+ "spec_edmcouncil_org_fibo_ontology_FND_Organizations_Organizations_Organization",
4673
+ "spec_edmcouncil_org_fibo_ontology_FND_Places_Addresses_PostalAddress",
4674
+ "spec_edmcouncil_org_fibo_ontology_FND_Places_Locations_Municipality",
4675
+ "spec_edmcouncil_org_fibo_ontology_FND_ProductsAndServices_ProductsAndServices_Offer",
4676
+ "spec_edmcouncil_org_fibo_ontology_FND_ProductsAndServices_ProductsAndServices_Price",
4677
+ "spec_edmcouncil_org_fibo_ontology_FND_ProductsAndServices_ProductsAndServices_Product",
4678
+ "spec_edmcouncil_org_fibo_ontology_PAY_PaymentServices_PaymentServices_PaymentService",
4679
+ "unece_org_vocab_AmountType",
4680
+ "unece_org_vocab_BrandName",
4681
+ "unece_org_vocab_Country",
4682
+ "unece_org_vocab_ElectronicDocument",
4683
+ "unece_org_vocab_FinancialCard",
4684
+ "unece_org_vocab_GeographicalCoordinate",
4685
+ "unece_org_vocab_Invoice",
4686
+ "unece_org_vocab_LineTradeAgreement",
4687
+ "unece_org_vocab_Offer",
4688
+ "unece_org_vocab_Order",
4689
+ "unece_org_vocab_PaymentMeans",
4690
+ "unece_org_vocab_RequestForQuotation",
4691
+ "unece_org_vocab_SpecifiedCertificate",
4692
+ "unece_org_vocab_SpecifiedTradeProduct",
4693
+ "unece_org_vocab_TradeAddress",
4694
+ "unece_org_vocab_TradeProduct",
4695
+ "unece_org_vocab_TransportMethod",
4696
+ "www_omg_org_spec_Commons_Classifiers_Classifier",
4697
+ "www_omg_org_spec_Commons_Collections_Collection",
4698
+ "www_omg_org_spec_Commons_DatesAndTimes_Date",
4699
+ "www_omg_org_spec_Commons_DatesAndTimes_DateTime",
4700
+ "www_omg_org_spec_Commons_DatesAndTimes_Duration",
4701
+ "www_omg_org_spec_Commons_GeopoliticalEntities_GeopoliticalEntity",
4702
+ "www_omg_org_spec_Commons_GeopoliticalEntities_Subdivision",
4703
+ "www_omg_org_spec_Commons_Locations_Address",
4704
+ "www_omg_org_spec_Commons_Locations_GeographicCoordinate",
4705
+ "www_omg_org_spec_Commons_Locations_Location",
4706
+ "www_omg_org_spec_LCC_Countries_CountryRepresentation_Continent",
4707
+ "www_omg_org_spec_LCC_Countries_CountryRepresentation_Country",
4708
+ "www_w3_org_2006_vcard_ns_VCard",
4709
+ "www_w3_org_ns_dcat_Catalog",
4710
+ "www_w3_org_ns_dcat_Dataset",
4711
+ "www_w3_org_ns_dcat_Distribution",
4712
+ "www_w3_org_ns_hydra_core_Error",
4713
+ "www_w3_org_ns_prov_InstantaneousEvent",
4714
+ "www_w3_org_ns_prov_atTime",
4715
+ "xmlns_com_foaf_0_1_Person"
4716
+ ]);
4717
+
3660
4718
  // src/rules/seo/json-ld-validity.ts
4719
+ var SCHEMA_ORG_CONTEXT_RE = /^https?:\/\/schema\.org\/?$/;
4720
+ var LOWERCASE_TO_CANONICAL = new Map(
4721
+ [...SCHEMA_ORG_TYPES].map((name) => [name.toLowerCase(), name])
4722
+ );
4723
+ function isSchemaOrgContextValue(v) {
4724
+ if (typeof v === "string") return SCHEMA_ORG_CONTEXT_RE.test(v);
4725
+ if (Array.isArray(v)) return v.every((m) => typeof m === "string" && SCHEMA_ORG_CONTEXT_RE.test(m));
4726
+ return false;
4727
+ }
4728
+ function isSchemaOrgOnly(nodes) {
4729
+ const contexts = contextValues(nodes);
4730
+ return contexts.length > 0 && contexts.every(isSchemaOrgContextValue);
4731
+ }
4732
+ function isBareTypeName(name) {
4733
+ return !name.includes(":") && !name.includes("/");
4734
+ }
4735
+ function unknownTypeNames(nodes) {
4736
+ const seen = /* @__PURE__ */ new Set();
4737
+ for (const name of collectValues(nodes, /* @__PURE__ */ new Set(["@type"]))) {
4738
+ if (isBareTypeName(name) && !SCHEMA_ORG_TYPES.has(name)) seen.add(name);
4739
+ }
4740
+ return [...seen];
4741
+ }
4742
+ function unknownTypeMessage(name) {
4743
+ const canonical = LOWERCASE_TO_CANONICAL.get(name.toLowerCase());
4744
+ return canonical ? `Unknown @type '${name}' \u2014 not a schema.org type. Did you mean '${canonical}'?` : `Unknown @type '${name}' \u2014 not a schema.org type.`;
4745
+ }
3661
4746
  var seoJsonLdValidity = {
3662
4747
  id: "seo/json-ld-validity",
3663
4748
  title: "JSON-LD validity",
3664
4749
  category: "seo",
3665
4750
  severity: "warning",
3666
4751
  scope: "route",
3667
- rationale: "Invalid JSON-LD \u2014 unparseable, or missing @context/@type \u2014 is silently ignored by search engines, so the structured data does nothing.",
4752
+ rationale: "Invalid JSON-LD \u2014 unparseable, missing @context/@type, or declaring a @type that is not a real schema.org type \u2014 is silently ignored by search engines, so the structured data does nothing.",
3668
4753
  fix: {
3669
4754
  description: "Make the JSON-LD valid: parseable JSON with both @context (schema.org) and @type.",
3670
4755
  snippet: '<svelte:head>\n <script type="application/ld+json">\n {"@context":"https://schema.org","@type":"WebPage","name":"\u2026"}\n </script>\n</svelte:head>',
@@ -3680,6 +4765,25 @@ var seoJsonLdValidity = {
3680
4765
  if (!parsed.ok) problem = "JSON-LD is not valid JSON";
3681
4766
  else if (!parsed.nodes.some((n) => "@context" in n)) problem = "JSON-LD is missing @context";
3682
4767
  else if (!parsed.nodes.some((n) => typeOf(n).length > 0)) problem = "JSON-LD is missing @type";
4768
+ if (!problem && isSchemaOrgOnly(parsed.nodes)) {
4769
+ const unknown = unknownTypeNames(parsed.nodes);
4770
+ if (unknown.length > 0) {
4771
+ for (const name of unknown) {
4772
+ out.push({
4773
+ id: "seo/json-ld-validity",
4774
+ category: "seo",
4775
+ severity: "warning",
4776
+ detection: PENALIZED,
4777
+ route: head.route,
4778
+ location: tag.file ?? head.file,
4779
+ message: unknownTypeMessage(name),
4780
+ recommendation: "Use the exact schema.org type name (case-sensitive), e.g. 'Article', 'Product'.",
4781
+ docsUrl: docsUrl12
4782
+ });
4783
+ }
4784
+ continue;
4785
+ }
4786
+ }
3683
4787
  out.push(
3684
4788
  problem ? {
3685
4789
  id: "seo/json-ld-validity",
@@ -3687,7 +4791,7 @@ var seoJsonLdValidity = {
3687
4791
  severity: "warning",
3688
4792
  detection: PENALIZED,
3689
4793
  route: head.route,
3690
- location: head.file,
4794
+ location: tag.file ?? head.file,
3691
4795
  message: problem,
3692
4796
  recommendation: "Make the JSON-LD valid JSON with both @context and @type.",
3693
4797
  docsUrl: docsUrl12,
@@ -3700,7 +4804,7 @@ var seoJsonLdValidity = {
3700
4804
  route: head.route,
3701
4805
  // Same `location` the penalized branch above uses (design
3702
4806
  // 2026-08-08-pass-result-location-design.md).
3703
- location: head.file,
4807
+ location: tag.file ?? head.file,
3704
4808
  message: "JSON-LD validity",
3705
4809
  recommendation: "Make the JSON-LD valid JSON with both @context and @type.",
3706
4810
  docsUrl: docsUrl12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svelte-vitals/core",
3
- "version": "0.40.0",
3
+ "version": "0.41.0",
4
4
  "description": "Shared, runtime-agnostic core for svelte-vitals (types, rule engine, scorer, reporter).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,7 +28,8 @@
28
28
  "svelte": "^5.56.8"
29
29
  },
30
30
  "devDependencies": {
31
- "@types/estree": "^1.0.9"
31
+ "@types/estree": "^1.0.9",
32
+ "schema-dts": "^2.0.0"
32
33
  },
33
34
  "exports": {
34
35
  ".": {
@@ -42,6 +43,7 @@
42
43
  "scripts": {
43
44
  "build": "tsup",
44
45
  "typecheck": "tsc --noEmit",
45
- "test": "vitest run"
46
+ "test": "vitest run",
47
+ "gen:schema-vocab": "node scripts/gen-schema-vocab.mjs"
46
48
  }
47
49
  }