@svelte-vitals/core 0.41.0 → 0.42.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.
Files changed (3) hide show
  1. package/dist/index.d.ts +76 -24
  2. package/dist/index.js +280 -1352
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -35,36 +35,29 @@ var CHILD_NODE_KEYS = [
35
35
  "catch",
36
36
  "fallback"
37
37
  ];
38
+ var hasExpression = (nodes) => nodes.some((n) => n?.type === "ExpressionTag");
39
+ function joinText(nodes) {
40
+ return nodes.filter((n) => n?.type === "Text").map((n) => String(n.data ?? "")).join("");
41
+ }
38
42
  function valueFromNodes(nodes) {
39
43
  if (!Array.isArray(nodes)) return "absent";
40
- if (nodes.some((n) => n?.type === "ExpressionTag")) return "dynamic";
41
- const text = nodes.filter((n) => n?.type === "Text").map((n) => String(n.data ?? "")).join("");
42
- return text.trim().length > 0 ? "static" : "absent";
44
+ if (hasExpression(nodes)) return "dynamic";
45
+ return joinText(nodes).trim().length > 0 ? "static" : "absent";
43
46
  }
44
47
  function textFromNodes(nodes) {
45
- if (!Array.isArray(nodes) || nodes.some((n) => n?.type === "ExpressionTag")) return void 0;
46
- const text = nodes.filter((n) => n?.type === "Text").map((n) => String(n.data ?? "")).join("");
48
+ if (!Array.isArray(nodes) || hasExpression(nodes)) return void 0;
49
+ const text = joinText(nodes);
47
50
  return text.trim().length > 0 ? text : void 0;
48
51
  }
49
52
  function attrText(attributes, name) {
50
- const attr = findAttr(attributes, name);
51
- if (!attr) return void 0;
52
- const v = attr.value;
53
+ const v = findAttr(attributes, name)?.value;
53
54
  if (v === true) return "";
54
- if (Array.isArray(v)) {
55
- if (v.some((n) => n?.type === "ExpressionTag")) return void 0;
56
- return v.filter((n) => n?.type === "Text").map((n) => String(n.data ?? "")).join("");
57
- }
58
- return void 0;
55
+ if (!Array.isArray(v) || hasExpression(v)) return void 0;
56
+ return joinText(v);
59
57
  }
60
58
  function attrValue(attributes, name) {
61
59
  const attr = findAttr(attributes, name);
62
- if (!attr) return "absent";
63
- const v = attr.value;
64
- if (v === true) return "absent";
65
- if (Array.isArray(v)) return valueFromNodes(v);
66
- if (v && v.type === "ExpressionTag") return "dynamic";
67
- return "absent";
60
+ return attr ? attrValueOf(attr) : "absent";
68
61
  }
69
62
  function lineOf(source, offset) {
70
63
  if (typeof offset !== "number" || offset < 0) return 0;
@@ -86,9 +79,7 @@ function attrValueOf(attr) {
86
79
  }
87
80
  function attrTextOf(attr) {
88
81
  const v = attr?.value;
89
- if (!Array.isArray(v) || v.some((n) => n?.type === "ExpressionTag")) return void 0;
90
- const text = v.filter((n) => n?.type === "Text").map((n) => String(n.data ?? "")).join("");
91
- return text.trim().length > 0 ? text : void 0;
82
+ return Array.isArray(v) ? textFromNodes(v) : void 0;
92
83
  }
93
84
 
94
85
  // src/component-parse.ts
@@ -2464,9 +2455,21 @@ function isPenalized(detection, treatDynamicAs) {
2464
2455
  async function runRules(rules, ctx) {
2465
2456
  const examined = {};
2466
2457
  const perRule = await Promise.all(
2467
- rules.map((rule) => rule.check({ ...ctx, recordExamined: (counts) => void (examined[rule.id] = counts) }))
2458
+ rules.map(async (rule) => {
2459
+ try {
2460
+ return await rule.check({ ...ctx, recordExamined: (counts) => void (examined[rule.id] = counts) });
2461
+ } catch (err) {
2462
+ return { id: rule.id, message: err instanceof Error ? err.message : String(err) };
2463
+ }
2464
+ })
2468
2465
  );
2469
- return { results: perRule.flat(), examined };
2466
+ const results = [];
2467
+ const failedRules = [];
2468
+ for (const outcome of perRule) {
2469
+ if (Array.isArray(outcome)) results.push(...outcome);
2470
+ else failedRules.push(outcome);
2471
+ }
2472
+ return { results, examined, failedRules };
2470
2473
  }
2471
2474
 
2472
2475
  // src/rules/seo/title-presence.ts
@@ -2737,56 +2740,56 @@ var seoHtmlLang = {
2737
2740
  }
2738
2741
  };
2739
2742
 
2743
+ // src/rules/detection.ts
2744
+ var PENALIZED = { presence: "none", value: "absent" };
2745
+ var PASS = { presence: "own", value: "static" };
2746
+
2740
2747
  // src/rules/perf/image-rule.ts
2741
- function imageRule(opts) {
2742
- const docsUrl12 = docsUrlFor(opts.id);
2743
- const category = opts.category ?? "performance";
2748
+ function routeItemRule(spec) {
2749
+ const docsUrl12 = docsUrlFor(spec.id);
2744
2750
  return {
2745
- id: opts.id,
2746
- title: opts.title,
2747
- category,
2748
- severity: opts.severity,
2751
+ id: spec.id,
2752
+ title: spec.title,
2753
+ category: spec.category,
2754
+ severity: spec.severity,
2749
2755
  scope: "route",
2750
- rationale: opts.rationale,
2751
- ...opts.fix ? { fix: opts.fix } : {},
2756
+ rationale: spec.rationale,
2757
+ ...spec.fix ? { fix: spec.fix } : {},
2752
2758
  async check(ctx) {
2753
2759
  const out = [];
2754
- for (const route of ctx.images ?? []) {
2755
- if (route.images.length === 0) continue;
2756
- const bad = route.images.filter((img) => !opts.ok(img));
2760
+ for (const g of spec.groups(ctx)) {
2761
+ if (g.items.length === 0) continue;
2762
+ const bad = g.items.filter((item) => !spec.ok(item));
2757
2763
  if (bad.length === 0) {
2758
2764
  out.push({
2759
- id: opts.id,
2760
- category,
2761
- severity: opts.severity,
2762
- detection: { presence: "own", value: "static" },
2763
- route: route.route,
2764
- // No single route-level file exists here (unlike ResolvedHead.file) — the
2765
- // route's first image stands in as its attributed file (design
2766
- // 2026-08-08-pass-result-location-design.md; this uncaught inline PASS literal
2767
- // was missed by the design spike's grep and added to its blast-radius table
2768
- // afterward, maintainer ruling, same date). `route.images.length === 0` already
2769
- // continued above, so `[0]` is always defined here.
2770
- location: route.images[0].file,
2771
- message: opts.label,
2772
- recommendation: opts.recommendation,
2765
+ id: spec.id,
2766
+ category: spec.category,
2767
+ severity: spec.severity,
2768
+ detection: PASS,
2769
+ route: g.route,
2770
+ location: g.passLocation,
2771
+ message: spec.label,
2772
+ recommendation: spec.recommendation,
2773
2773
  docsUrl: docsUrl12
2774
2774
  });
2775
2775
  continue;
2776
2776
  }
2777
- for (const img of bad) {
2777
+ for (const item of bad) {
2778
+ const line = spec.line?.(item);
2778
2779
  out.push({
2779
- id: opts.id,
2780
- category,
2781
- severity: opts.severity,
2782
- detection: { presence: "none", value: "absent" },
2783
- route: route.route,
2784
- location: img.file,
2785
- ...img.line > 0 ? { line: img.line } : {},
2786
- message: `Missing ${opts.label}`,
2787
- recommendation: opts.recommendation,
2780
+ id: spec.id,
2781
+ category: spec.category,
2782
+ severity: spec.severity,
2783
+ detection: PENALIZED,
2784
+ route: g.route,
2785
+ location: spec.location(item, g.passLocation),
2786
+ ...line !== void 0 && line > 0 ? { line } : {},
2787
+ message: `Missing ${spec.label}`,
2788
+ recommendation: spec.recommendation,
2788
2789
  docsUrl: docsUrl12,
2789
- ...opts.fix ? { fix: { ...opts.fix } } : {}
2790
+ // Copy per finding: spec.fix is a rule-level template shared across all
2791
+ // results this rule emits; a fresh object keeps findings independent.
2792
+ ...spec.fix ? { fix: { ...spec.fix } } : {}
2790
2793
  });
2791
2794
  }
2792
2795
  }
@@ -2794,6 +2797,18 @@ function imageRule(opts) {
2794
2797
  }
2795
2798
  };
2796
2799
  }
2800
+ function imageRule(opts) {
2801
+ return routeItemRule({
2802
+ ...opts,
2803
+ category: opts.category ?? "performance",
2804
+ // No single route-level file exists here (unlike ResolvedHead.file) — the route's
2805
+ // first image stands in as its attributed file; empty routes are filtered first,
2806
+ // so `[0]` is always defined.
2807
+ groups: (ctx) => (ctx.images ?? []).filter((r) => r.images.length > 0).map((r) => ({ route: r.route, items: r.images, passLocation: r.images[0].file })),
2808
+ location: (img) => img.file,
2809
+ line: (img) => img.line
2810
+ });
2811
+ }
2797
2812
 
2798
2813
  // src/rules/perf/image-dimensions.ts
2799
2814
  var performanceImageDimensions = imageRule({
@@ -2845,62 +2860,19 @@ var performanceResponsiveImage = imageRule({
2845
2860
 
2846
2861
  // src/rules/perf/link-rule.ts
2847
2862
  function linkRule(opts) {
2848
- const docsUrl12 = docsUrlFor(opts.id);
2849
- return {
2850
- id: opts.id,
2851
- title: opts.title,
2863
+ return routeItemRule({
2864
+ ...opts,
2852
2865
  category: "performance",
2853
- severity: opts.severity,
2854
- scope: "route",
2855
- rationale: opts.rationale,
2856
- ...opts.fix ? { fix: opts.fix } : {},
2857
- async check(ctx) {
2858
- const out = [];
2859
- for (const head of ctx.heads) {
2860
- const links = head.tags.filter((t) => t.kind === "link" && opts.relevant(t));
2861
- if (links.length === 0) continue;
2862
- const bad = links.filter((t) => !opts.ok(t));
2863
- if (bad.length === 0) {
2864
- out.push({
2865
- id: opts.id,
2866
- category: "performance",
2867
- severity: opts.severity,
2868
- detection: { presence: "own", value: "static" },
2869
- route: head.route,
2870
- // The route's own attributed file (design 2026-08-08-pass-result-location-design.md)
2871
- // — this uncaught inline PASS literal was missed by the design spike's grep and
2872
- // added to its blast-radius table afterward (maintainer ruling, same date). No
2873
- // single per-tag location applies here (many links can back one pass), so the
2874
- // route's own head file is the uniform attribution; per-tag penalized locations
2875
- // above remain per-tag.
2876
- location: head.file,
2877
- message: opts.label,
2878
- recommendation: opts.recommendation,
2879
- docsUrl: docsUrl12
2880
- });
2881
- continue;
2882
- }
2883
- for (const tag of bad) {
2884
- out.push({
2885
- id: opts.id,
2886
- category: "performance",
2887
- severity: opts.severity,
2888
- detection: { presence: "none", value: "absent" },
2889
- route: head.route,
2890
- // Point at the file the link actually came from (a layout in static
2891
- // mode); fall back to the route's representative file when the tag
2892
- // carries no file (rendered mode).
2893
- location: tag.file ?? head.file,
2894
- message: `Missing ${opts.label}`,
2895
- recommendation: opts.recommendation,
2896
- docsUrl: docsUrl12,
2897
- ...opts.fix ? { fix: { ...opts.fix } } : {}
2898
- });
2899
- }
2900
- }
2901
- return out;
2902
- }
2903
- };
2866
+ // The route's own head file is the PASS attribution (many links can back one pass).
2867
+ groups: (ctx) => ctx.heads.map((head) => ({
2868
+ route: head.route,
2869
+ items: head.tags.filter((t) => t.kind === "link" && opts.relevant(t)),
2870
+ passLocation: head.file
2871
+ })),
2872
+ // Point at the file the link actually came from (a layout in static mode); fall back
2873
+ // to the route's representative file when the tag carries no file (rendered mode).
2874
+ location: (tag, passLocation) => tag.file ?? passLocation
2875
+ });
2904
2876
  }
2905
2877
 
2906
2878
  // src/rules/perf/preload-missing-as.ts
@@ -3061,6 +3033,19 @@ function settingOptions(setting) {
3061
3033
  function selectRules(rules, config) {
3062
3034
  return rules.filter((rule) => settingSeverity(config.rules[rule.id]) !== "off");
3063
3035
  }
3036
+ function withFailedRulesOff(config, failedRuleIds) {
3037
+ if (failedRuleIds.length === 0) return config;
3038
+ return {
3039
+ ...config,
3040
+ rules: {
3041
+ ...config.rules,
3042
+ ...Object.fromEntries(failedRuleIds.map((id) => [id, "off"]))
3043
+ }
3044
+ };
3045
+ }
3046
+ function formatFailedRuleWarning(f) {
3047
+ return `rule ${f.id} failed and was skipped: ${f.message.split("\n")[0]}`;
3048
+ }
3064
3049
  function applyRuleSeverities(results, config) {
3065
3050
  return results.map((result) => {
3066
3051
  const severity = settingSeverity(config.rules[result.id]);
@@ -3461,10 +3446,6 @@ var seoSitemapInRobots = {
3461
3446
  }
3462
3447
  };
3463
3448
 
3464
- // src/rules/seo/detection.ts
3465
- var PENALIZED = { presence: "none", value: "absent" };
3466
- var PASS = { presence: "own", value: "static" };
3467
-
3468
3449
  // src/rules/seo/jsonld-engine.ts
3469
3450
  function parseJsonLd(raw) {
3470
3451
  let data;
@@ -3678,1048 +3659,50 @@ function jsonldRule(opts) {
3678
3659
  }
3679
3660
 
3680
3661
  // 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
- ]);
3662
+ var SCHEMA_ORG_TYPES = new Set(
3663
+ "3DModel AMRadioChannel APIReference AboutPage AcceptAction Accommodation AccountingService AchieveAction Action ActionAccessSpecification ActionStatusType ActivateAction AddAction AdministrativeArea AdultEntertainment AdultOrientedEnumeration AdvertiserContentArticle AggregateOffer AggregateRating AgreeAction Airline Airport AlignmentObject AllocateAction AmpStory AmusementPark AnalysisNewsArticle AnatomicalStructure AnatomicalSystem AnimalShelter Answer Apartment ApartmentComplex AppendAction ApplyAction ApprovedIndication Aquarium ArchiveComponent ArchiveOrganization ArriveAction ArtGallery Artery Article AskAction AskPublicNewsArticle AssessAction AssignAction Atlas Attorney Audience AudioObject AudioObjectSnapshot Audiobook AuthenticateAction AuthorizeAction AutoBodyShop AutoDealer AutoPartsStore AutoRental AutoRepair AutoWash AutomatedTeller AutomotiveBusiness BackgroundNewsArticle Bakery BankAccount BankOrCreditUnion BarOrPub Barcode Beach BeautySalon BedAndBreakfast BedDetails BedType BefriendAction BikeStore BioChemEntity Blog BlogPosting BloodTest BoardingPolicyType BoatReservation BoatTerminal BoatTrip BodyMeasurementTypeEnumeration BodyOfWater Bone Book BookFormatType BookSeries BookStore BookmarkAction Boolean BorrowAction BowlingAlley BrainStructure Brand BreadcrumbList Brewery Bridge BroadcastChannel BroadcastEvent BroadcastFrequencySpecification BroadcastService BrokerageAccount BuddhistTemple BusOrCoach BusReservation BusStation BusStop BusTrip BusinessAudience BusinessEntityType BusinessEvent BusinessFunction BuyAction CDCPMDRecord CableOrSatelliteService CafeOrCoffeeShop Campground CampingPitch Canal CancelAction Car CarUsageType Casino CategoryCode CategoryCodeSet CatholicChurch Cemetery Certification CertificationStatusEnumeration Chapter CheckAction CheckInAction CheckOutAction CheckoutPage ChemicalSubstance ChildCare ChildrensEvent ChooseAction Church City CityHall CivicStructure Claim ClaimReview Class Clip ClothingStore Code Collection CollectionPage CollegeOrUniversity ComedyClub ComedyEvent ComicCoverArt ComicIssue ComicSeries ComicStory Comment CommentAction CommunicateAction CommunityHealth CompleteDataFeed CompoundPriceSpecification ComputerLanguage ComputerStore ConferenceEvent ConfirmAction Consortium ConstraintNode ConsumeAction ContactPage ContactPoint ContactPointOption Continent ControlAction ConvenienceStore Conversation CookAction Cooperative Corporation CorrectionComment Country Course CourseInstance Courthouse CoverArt CovidTestingFacility CreateAction CreativeWork CreativeWorkSeason CreativeWorkSeries Credential CreditCard Crematorium CriticReview CssSelectorType CurrencyConversionService DDxElement DENonprofitType DanceEvent DanceGroup DataCatalog DataDownload DataFeed DataFeedItem DataType Dataset Date DateTime DatedMoneySpecification DayOfWeek DaySpa DeactivateAction DefenceEstablishment DefinedRegion DefinedTerm DefinedTermSet DeleteAction DeliveryChargeSpecification DeliveryEvent DeliveryMethod DeliveryTimeSettings Demand Dentist DepartAction DepartmentStore DepositAccount Dermatology DiagnosticLab DiagnosticProcedure Diet DietNutrition DietarySupplement DigitalDocument DigitalDocumentPermission DigitalDocumentPermissionType DigitalPlatformEnumeration DisagreeAction DiscoverAction DiscussionForumPosting DislikeAction Distance Distillery DonateAction DoseSchedule DownloadAction DrawAction Drawing DrinkAction DriveWheelConfigurationValue Drug DrugClass DrugCost DrugCostCategory DrugLegalStatus DrugPregnancyCategory DrugPrescriptionStatus DrugStrength DryCleaningOrLaundry Duration EUEnergyEfficiencyEnumeration EatAction EducationEvent EducationalAudience EducationalOccupationalCredential EducationalOccupationalProgram EducationalOrganization Electrician ElectronicsStore ElementarySchool EmailMessage Embassy Emergency EmergencyService EmployeeRole EmployerAggregateRating EmployerReview EmploymentAgency EndorseAction EndorsementRating Energy EnergyConsumptionDetails EnergyEfficiencyEnumeration EnergyStarEnergyEfficiencyEnumeration EngineSpecification EntertainmentBusiness EntryPoint Enumeration Episode Error Event EventAttendanceModeEnumeration EventReservation EventSeries EventStatusType EventVenue ExchangeRateSpecification ExerciseAction ExerciseGym ExercisePlan ExhibitionEvent FAQPage FMRadioChannel FastFoodRestaurant Festival FilmAction FinancialIncentive FinancialProduct FinancialService FindAction FireStation Flight FlightReservation Float FloorPlan Florist FollowAction FoodEstablishment FoodEstablishmentReservation FoodEvent FoodService FulfillmentTypeEnumeration FundingAgency FundingScheme FurnitureStore Game GameAvailabilityEnumeration GamePlayMode GameServer GameServerStatus GardenStore GasStation GatedResidenceCommunity GenderType Gene GeneralContractor GeoCircle GeoCoordinates GeoShape GeospatialGeometry Geriatric GiveAction GolfCourse GovernmentBenefitsType GovernmentBuilding GovernmentOffice GovernmentOrganization GovernmentPermit GovernmentService Grant GroceryStore Guide Gynecologic HVACBusiness Hackathon HairSalon HardwareStore HealthAndBeautyBusiness HealthAspectEnumeration HealthClub HealthInsurancePlan HealthPlanCostSharingSpecification HealthPlanFormulary HealthPlanNetwork HealthTopicContent HighSchool HinduTemple HobbyShop HomeAndConstructionBusiness HomeGoodsStore Hospital Hostel Hotel HotelRoom House HousePainter HowTo HowToDirection HowToItem HowToSection HowToStep HowToSupply HowToTip HowToTool HyperToc HyperTocEntry IPTCDigitalSourceEnumeration ITNonprofitType IceCreamShop IgnoreAction ImageGallery ImageObject ImageObjectSnapshot ImagingTest IncentiveQualifiedExpenseType IncentiveStatus IncentiveType IndividualPhysician IndividualProduct InfectiousAgentClass InfectiousDisease InformAction InsertAction InstallAction InstantaneousEvent InsuranceAgency Intangible Integer InteractAction InteractionCounter InternetCafe InvestmentFund InvestmentOrDeposit InviteAction Invoice ItemAvailability ItemList ItemListOrderType ItemPage JewelryStore JobPosting JoinAction Joint LakeBodyOfWater Landform LandmarksOrHistoricalBuildings Language LearningResource LeaveAction LegalForceStatus LegalService LegalValueLevel Legislation LegislationObject LegislativeBuilding LendAction Library LibrarySystem LifestyleModification Ligament LikeAction LinkRole LiquorStore ListItem ListenAction LiteraryEvent LiveBlogPosting LoanOrCredit LocalBusiness LocationFeatureSpecification Locksmith LodgingBusiness LodgingReservation LoginAction LoseAction LymphaticVessel Manuscript Map MapCategoryType MarryAction Mass MathSolver MaximumDoseSchedule MeasurementMethodEnum MeasurementTypeEnumeration MediaEnumeration MediaGallery MediaManipulationRatingEnumeration MediaObject MediaReview MediaReviewItem MediaSubscription MedicalAudience MedicalAudienceType MedicalBusiness MedicalCause MedicalClinic MedicalCode MedicalCondition MedicalConditionStage MedicalContraindication MedicalDevice MedicalDevicePurpose MedicalEntity MedicalEnumeration MedicalEvidenceLevel MedicalGuideline MedicalGuidelineContraindication MedicalGuidelineRecommendation MedicalImagingTechnique MedicalIndication MedicalIntangible MedicalObservationalStudy MedicalObservationalStudyDesign MedicalOrganization MedicalProcedure MedicalProcedureType MedicalRiskCalculator MedicalRiskEstimator MedicalRiskFactor MedicalRiskScore MedicalScholarlyArticle MedicalSign MedicalSignOrSymptom MedicalSpecialty MedicalStudy MedicalStudyStatus MedicalSymptom MedicalTest MedicalTestPanel MedicalTherapy MedicalTrial MedicalTrialDesign MedicalWebPage MedicineSystem MeetingRoom MemberProgram MemberProgramTier MensClothingStore Menu MenuItem MenuSection MerchantReturnEnumeration MerchantReturnPolicy MerchantReturnPolicySeasonalOverride Message MiddleSchool Midwifery MobileApplication MobilePhoneStore MolecularEntity MonetaryAmount MonetaryAmountDistribution MonetaryGrant MoneyTransfer MortgageLoan Mosque Motel Motorcycle MotorcycleDealer MotorcycleRepair MotorizedBicycle Mountain MoveAction Movie MovieClip MovieRentalStore MovieSeries MovieTheater MovingCompany Muscle Museum MusicAlbum MusicAlbumProductionType MusicAlbumReleaseType MusicComposition MusicEvent MusicGroup MusicPlaylist MusicRecording MusicRelease MusicReleaseFormatType MusicStore MusicVenue MusicVideoObject NGO NLNonprofitType NailSalon Nerve NewsArticle NewsMediaOrganization Newspaper NightClub NonprofitType Notary NoteDigitalDocument Number Nursing NutritionInformation Observation Obstetric Occupation OccupationalExperienceRequirements OccupationalTherapy OceanBodyOfWater Offer OfferCatalog OfferForLease OfferForPurchase OfferItemCondition OfferShippingDetails OfficeEquipmentStore OnDemandEvent Oncologic OnlineBusiness OnlineMarketplace OnlineStore OpeningHoursSpecification OperatingSystem OpinionNewsArticle Optician Optometric Order OrderAction OrderItem OrderStatus Organization OrganizationRole OrganizeAction Otolaryngologic OutletStore OwnershipInfo PaintAction Painting PalliativeProcedure ParcelDelivery ParentAudience Park ParkingFacility PathologyTest Patient PawnShop PayAction PaymentCard PaymentChargeSpecification PaymentMethod PaymentMethodType PaymentService PaymentStatusType Pediatric PeopleAudience PerformAction PerformanceRole PerformingArtsEvent PerformingArtsTheater PerformingGroup Periodical Permit Person PetStore Pharmacy Photograph PhotographAction PhysicalActivity PhysicalActivityCategory PhysicalExam PhysicalTherapy Physician PhysiciansOffice Physiotherapy Place PlaceOfWorship PlanAction PlasticSurgery Play PlayAction PlayGameAction Playground Plumber PodcastEpisode PodcastSeason PodcastSeries Podiatric PoliceStation PoliticalParty Pond PostOffice PostalAddress PostalCodeRangeSpecification Poster PreOrderAction PrependAction Preschool PresentationDigitalDocument PreventionIndication PriceComponentTypeEnumeration PriceSpecification PriceTypeEnumeration PrimaryCare Product ProductCollection ProductGroup ProductModel ProductReturnEnumeration ProductReturnPolicy ProfessionalService ProfilePage ProgramMembership Project PronounceableText Property PropertyValue PropertyValueSpecification Protein Psychiatric PsychologicalTreatment PublicHealth PublicSwimmingPool PublicToilet PublicationEvent PublicationIssue PublicationVolume PurchaseType QAPage QualitativeValue QuantitativeValue QuantitativeValueDistribution Quantity Question Quiz Quotation QuoteAction RVPark RadiationTherapy RadioBroadcastService RadioChannel RadioClip RadioEpisode RadioSeason RadioSeries RadioStation Rating ReactAction ReadAction RealEstateAgent RealEstateListing ReceiveAction Recipe Recommendation RecommendedDoseSchedule RecyclingCenter RefundTypeEnumeration RegisterAction RejectAction RentAction RentalCarReservation RepaymentSpecification ReplaceAction ReplyAction Report ReportageNewsArticle ReportedDoseSchedule ResearchOrganization ResearchProject Researcher Reservation ReservationPackage ReservationStatusType ReserveAction Reservoir ResetPasswordAction Residence Resort RespiratoryTherapy Restaurant RestrictedDiet ResumeAction ReturnAction ReturnFeesEnumeration ReturnLabelSourceEnumeration ReturnMethodEnumeration Review ReviewAction ReviewNewsArticle RiverBodyOfWater Role RoofingContractor Room RsvpAction RsvpResponseType RuntimePlatform SaleEvent SatiricalArticle Schedule ScheduleAction ScholarlyArticle School SchoolDistrict ScreeningEvent Sculpture SeaBodyOfWater SearchAction SearchRescueOrganization SearchResultsPage Season Seat SeekToAction SelfStorage SellAction SendAction SequentialArt Series Service ServiceChannel ServicePeriod ShareAction SheetMusic ShippingConditions ShippingDeliveryTime ShippingRateSettings ShippingService ShoeStore ShoppingCenter ShortStory SingleFamilyResidence SiteNavigationElement SizeGroupEnumeration SizeSpecification SizeSystemEnumeration SkiResort SocialEvent SocialMediaPosting SoftwareApplication SoftwareSourceCode SolveMathAction SomeProducts SpeakableSpecification SpecialAnnouncement Specialty SportingGoodsStore SportsActivityLocation SportsClub SportsEvent SportsOrganization SportsTeam SpreadsheetDigitalDocument StadiumOrArena State Statement StatisticalPopulation StatisticalVariable StatusEnumeration SteeringPositionValue Store StructuredValue StupidType SubscribeAction Substance SubwayStation Suite SuperficialAnatomy SurgicalProcedure SuspendAction Syllabus Synagogue TVClip TVEpisode TVSeason TVSeries Table TakeAction TattooParlor Taxi TaxiReservation TaxiService TaxiStand Taxon TechArticle TelevisionChannel TelevisionStation TennisComplex Text TextDigitalDocument TextObject TheaterEvent TheaterGroup TherapeuticProcedure Thesis Thing Ticket TieAction TierBenefitEnumeration Time TipAction TireShop TouristAttraction TouristDestination TouristInformationCenter TouristTrip ToyStore TrackAction TradeAction TrainReservation TrainStation TrainTrip TransferAction TravelAction TravelAgency TreatmentIndication Trip TypeAndQuantityNode UKNonprofitType URL USNonprofitType UnRegisterAction UnitPriceSpecification UpdateAction UseAction UserBlocks UserCheckins UserComments UserDownloads UserInteraction UserLikes UserPageVisits UserPlays UserPlusOnes UserReview UserTweets VacationRental Vehicle Vein Vessel VeterinaryCare VideoGallery VideoGame VideoGameClip VideoGameSeries VideoObject VideoObjectSnapshot ViewAction VirtualLocation VisualArtsEvent VisualArtwork VitalSign Volcano VoteAction WPAdBlock WPFooter WPHeader WPSideBar WantAction WarrantyPromise WarrantyScope WatchAction Waterfall WearAction WearableMeasurementTypeEnumeration WearableSizeGroupEnumeration WearableSizeSystemEnumeration WebAPI WebApplication WebContent WebPage WebPageElement WebSite WholesaleStore WinAction Winery WorkBasedProgram WorkersUnion WriteAction XPathType Zoo iflastandards_info_ns_lrm_lrmoo_F31_Performance purl_bioontology_org_ontology_SNOMEDCT_105590001 purl_bioontology_org_ontology_SNOMEDCT_116154003 purl_bioontology_org_ontology_SNOMEDCT_277132007 purl_bioontology_org_ontology_SNOMEDCT_387713003 purl_bioontology_org_ontology_SNOMEDCT_410942007 purl_bioontology_org_ontology_SNOMEDCT_50731006 purl_bioontology_org_ontology_SNOMEDCT_51114001 purl_bioontology_org_ontology_SNOMEDCT_63653004 purl_org_dc_dcmitype_Dataset purl_org_dc_dcmitype_Event purl_org_dc_dcmitype_Image purl_org_dc_dcmitype_Text purl_org_ontology_bibo_Issue purl_org_ontology_bibo_Periodical rdfs_org_ns_void_Dataset ref_gs1_org_voc_CertificationDetails ref_gs1_org_voc_ContactPoint ref_gs1_org_voc_Country ref_gs1_org_voc_Organization ref_gs1_org_voc_PostalAddress sarif_info_Result spec_edmcouncil_org_fibo_ontology_BE_Corporations_Corporations_Corporation spec_edmcouncil_org_fibo_ontology_BE_LegalEntities_CorporateBodies_CooperativeSociety spec_edmcouncil_org_fibo_ontology_BE_NotForProfitOrganizations_NotForProfitOrganizations_NonGovernmentalOrganization spec_edmcouncil_org_fibo_ontology_FBC_ProductsAndServices_FinancialProductsAndServices_BankAccount spec_edmcouncil_org_fibo_ontology_FBC_ProductsAndServices_FinancialProductsAndServices_PaymentMechanism spec_edmcouncil_org_fibo_ontology_FND_Agreements_Contracts_MutualContractualAgreement spec_edmcouncil_org_fibo_ontology_FND_Arrangements_Documents_Certificate spec_edmcouncil_org_fibo_ontology_FND_Arrangements_Documents_Document spec_edmcouncil_org_fibo_ontology_FND_Arrangements_Documents_LegalDocument spec_edmcouncil_org_fibo_ontology_FND_DatesAndTimes_Occurrences_Occurrence spec_edmcouncil_org_fibo_ontology_FND_Organizations_Organizations_ContactPoint spec_edmcouncil_org_fibo_ontology_FND_Organizations_Organizations_Organization spec_edmcouncil_org_fibo_ontology_FND_Places_Addresses_PostalAddress spec_edmcouncil_org_fibo_ontology_FND_Places_Locations_Municipality spec_edmcouncil_org_fibo_ontology_FND_ProductsAndServices_ProductsAndServices_Offer spec_edmcouncil_org_fibo_ontology_FND_ProductsAndServices_ProductsAndServices_Price spec_edmcouncil_org_fibo_ontology_FND_ProductsAndServices_ProductsAndServices_Product spec_edmcouncil_org_fibo_ontology_PAY_PaymentServices_PaymentServices_PaymentService unece_org_vocab_AmountType unece_org_vocab_BrandName unece_org_vocab_Country unece_org_vocab_ElectronicDocument unece_org_vocab_FinancialCard unece_org_vocab_GeographicalCoordinate unece_org_vocab_Invoice unece_org_vocab_LineTradeAgreement unece_org_vocab_Offer unece_org_vocab_Order unece_org_vocab_PaymentMeans unece_org_vocab_RequestForQuotation unece_org_vocab_SpecifiedCertificate unece_org_vocab_SpecifiedTradeProduct unece_org_vocab_TradeAddress unece_org_vocab_TradeProduct unece_org_vocab_TransportMethod www_omg_org_spec_Commons_Classifiers_Classifier www_omg_org_spec_Commons_Collections_Collection www_omg_org_spec_Commons_DatesAndTimes_Date www_omg_org_spec_Commons_DatesAndTimes_DateTime www_omg_org_spec_Commons_DatesAndTimes_Duration www_omg_org_spec_Commons_GeopoliticalEntities_GeopoliticalEntity www_omg_org_spec_Commons_GeopoliticalEntities_Subdivision www_omg_org_spec_Commons_Locations_Address www_omg_org_spec_Commons_Locations_GeographicCoordinate www_omg_org_spec_Commons_Locations_Location www_omg_org_spec_LCC_Countries_CountryRepresentation_Continent www_omg_org_spec_LCC_Countries_CountryRepresentation_Country www_w3_org_2006_vcard_ns_VCard www_w3_org_ns_dcat_Catalog www_w3_org_ns_dcat_Dataset www_w3_org_ns_dcat_Distribution www_w3_org_ns_hydra_core_Error www_w3_org_ns_prov_InstantaneousEvent www_w3_org_ns_prov_atTime xmlns_com_foaf_0_1_Person".split(
3664
+ " "
3665
+ )
3666
+ );
4717
3667
 
4718
3668
  // src/rules/seo/json-ld-validity.ts
4719
3669
  var SCHEMA_ORG_CONTEXT_RE = /^https?:\/\/schema\.org\/?$/;
4720
3670
  var LOWERCASE_TO_CANONICAL = new Map(
4721
3671
  [...SCHEMA_ORG_TYPES].map((name) => [name.toLowerCase(), name])
4722
3672
  );
3673
+ var SORTED_TYPES = [...SCHEMA_ORG_TYPES].sort();
3674
+ var MAX_SUGGEST_DISTANCE = 2;
3675
+ function levenshteinWithin(a, b, maxDistance) {
3676
+ if (Math.abs(a.length - b.length) > maxDistance) return maxDistance + 1;
3677
+ let prev = Array.from({ length: b.length + 1 }, (_, j) => j);
3678
+ for (let i = 1; i <= a.length; i++) {
3679
+ const curr = [i];
3680
+ let rowMin = i;
3681
+ for (let j = 1; j <= b.length; j++) {
3682
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
3683
+ const v = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);
3684
+ curr.push(v);
3685
+ if (v < rowMin) rowMin = v;
3686
+ }
3687
+ if (rowMin > maxDistance) return maxDistance + 1;
3688
+ prev = curr;
3689
+ }
3690
+ return prev[b.length];
3691
+ }
3692
+ function closestType(name, catalog) {
3693
+ const lower = name.toLowerCase();
3694
+ let best;
3695
+ let bestDistance = MAX_SUGGEST_DISTANCE + 1;
3696
+ for (const candidate of catalog) {
3697
+ if (Math.abs(candidate.length - name.length) > MAX_SUGGEST_DISTANCE) continue;
3698
+ const d = levenshteinWithin(lower, candidate.toLowerCase(), MAX_SUGGEST_DISTANCE);
3699
+ if (d < bestDistance) {
3700
+ bestDistance = d;
3701
+ best = candidate;
3702
+ }
3703
+ }
3704
+ return bestDistance <= MAX_SUGGEST_DISTANCE ? best : void 0;
3705
+ }
4723
3706
  function isSchemaOrgContextValue(v) {
4724
3707
  if (typeof v === "string") return SCHEMA_ORG_CONTEXT_RE.test(v);
4725
3708
  if (Array.isArray(v)) return v.every((m) => typeof m === "string" && SCHEMA_ORG_CONTEXT_RE.test(m));
@@ -4740,7 +3723,7 @@ function unknownTypeNames(nodes) {
4740
3723
  return [...seen];
4741
3724
  }
4742
3725
  function unknownTypeMessage(name) {
4743
- const canonical = LOWERCASE_TO_CANONICAL.get(name.toLowerCase());
3726
+ const canonical = LOWERCASE_TO_CANONICAL.get(name.toLowerCase()) ?? closestType(name, SORTED_TYPES);
4744
3727
  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
3728
  }
4746
3729
  var seoJsonLdValidity = {
@@ -5300,57 +4283,56 @@ var seoHeadingLevelSkip = {
5300
4283
  }
5301
4284
  };
5302
4285
 
5303
- // src/rules/kit-module-rule.ts
5304
- var PENALIZED2 = { presence: "none", value: "absent" };
5305
- var PASS2 = { presence: "own", value: "static" };
5306
- function isSuppressed(m, ruleId, line) {
5307
- return (m.suppressions ?? []).some((s) => s.line === line && (!s.ruleIds || s.ruleIds.includes(ruleId)));
4286
+ // src/rules/component-rule.ts
4287
+ function isSuppressed(suppressions, ruleId, line) {
4288
+ return (suppressions ?? []).some((s) => s.line === line && (!s.ruleIds || s.ruleIds.includes(ruleId)));
5308
4289
  }
5309
- function kitModuleRule(opts) {
5310
- const docsUrl12 = docsUrlFor(opts.id);
5311
- const severity = opts.severity ?? "warning";
4290
+ function fileRule(spec) {
4291
+ const docsUrl12 = docsUrlFor(spec.id);
5312
4292
  return {
5313
- id: opts.id,
5314
- title: opts.title,
5315
- category: opts.category,
5316
- severity,
4293
+ id: spec.id,
4294
+ title: spec.title,
4295
+ category: spec.category,
4296
+ severity: spec.severity,
5317
4297
  scope: "component",
5318
- rationale: opts.rationale,
5319
- ...opts.fix ? { fix: opts.fix } : {},
4298
+ rationale: spec.rationale,
4299
+ ...spec.fix ? { fix: spec.fix } : {},
4300
+ ...spec.options ? { options: spec.options } : {},
5320
4301
  async check(ctx) {
5321
4302
  const out = [];
5322
- for (const m of ctx.kitModules ?? []) {
5323
- if (!opts.applies(m, ctx)) continue;
5324
- const bad = opts.bad(m, ctx).filter((b) => !(b.line > 0 && isSuppressed(m, opts.id, b.line)));
4303
+ const compiled = compileOverrides(ctx.config);
4304
+ for (const f of spec.facts(ctx) ?? []) {
4305
+ const o = resolveRuleOptions(spec.id, spec.options, ctx.config, { route: f.file, file: f.file }, compiled);
4306
+ if (!spec.applies(f, o, ctx)) continue;
4307
+ const recommendation10 = typeof spec.recommendation === "function" ? spec.recommendation(o) : spec.recommendation;
4308
+ const bad = spec.bad(f, o, ctx).filter((b) => !(b.line > 0 && isSuppressed(f.suppressions, spec.id, b.line)));
5325
4309
  if (bad.length === 0) {
5326
4310
  out.push({
5327
- id: opts.id,
5328
- category: opts.category,
5329
- severity,
5330
- detection: PASS2,
5331
- route: m.file,
5332
- // Uniform PASS-result attribution (design 2026-08-08-pass-result-location-design.md):
5333
- // same location a penalized result for this file would carry.
5334
- location: m.file,
5335
- message: opts.label,
5336
- recommendation: opts.recommendation,
4311
+ id: spec.id,
4312
+ category: spec.category,
4313
+ severity: spec.severity,
4314
+ detection: PASS,
4315
+ route: f.file,
4316
+ location: f.file,
4317
+ message: spec.label,
4318
+ recommendation: recommendation10,
5337
4319
  docsUrl: docsUrl12
5338
4320
  });
5339
4321
  continue;
5340
4322
  }
5341
4323
  for (const b of bad) {
5342
4324
  out.push({
5343
- id: opts.id,
5344
- category: opts.category,
5345
- severity,
5346
- detection: PENALIZED2,
5347
- route: m.file,
5348
- location: m.file,
4325
+ id: spec.id,
4326
+ category: spec.category,
4327
+ severity: spec.severity,
4328
+ detection: PENALIZED,
4329
+ route: f.file,
4330
+ location: f.file,
5349
4331
  ...b.line > 0 ? { line: b.line } : {},
5350
4332
  message: b.message,
5351
- recommendation: opts.recommendation,
4333
+ recommendation: recommendation10,
5352
4334
  docsUrl: docsUrl12,
5353
- ...opts.fix ? { fix: { ...opts.fix } } : {}
4335
+ ...spec.fix ? { fix: { ...spec.fix } } : {}
5354
4336
  });
5355
4337
  }
5356
4338
  }
@@ -5358,6 +4340,24 @@ function kitModuleRule(opts) {
5358
4340
  }
5359
4341
  };
5360
4342
  }
4343
+ function componentRule(opts) {
4344
+ return fileRule({
4345
+ ...opts,
4346
+ severity: opts.severity ?? "warning",
4347
+ facts: (ctx) => ctx.components
4348
+ });
4349
+ }
4350
+
4351
+ // src/rules/kit-module-rule.ts
4352
+ function kitModuleRule(opts) {
4353
+ return fileRule({
4354
+ ...opts,
4355
+ severity: opts.severity ?? "warning",
4356
+ facts: (ctx) => ctx.kitModules,
4357
+ applies: (m, _o, ctx) => opts.applies(m, ctx),
4358
+ bad: (m, _o, ctx) => opts.bad(m, ctx)
4359
+ });
4360
+ }
5361
4361
 
5362
4362
  // src/rules/seo/ssr-disabled.ts
5363
4363
  var ROOT_LAYOUT_RE = /^src\/routes\/\+layout(\.server)?\.(ts|js)$/;
@@ -5378,69 +4378,6 @@ var seoSsrDisabled = kitModuleRule({
5378
4378
  ]
5379
4379
  });
5380
4380
 
5381
- // src/rules/component-rule.ts
5382
- var PENALIZED3 = { presence: "none", value: "absent" };
5383
- var PASS3 = { presence: "own", value: "static" };
5384
- function isSuppressed2(c, ruleId, line) {
5385
- return (c.suppressions ?? []).some((s) => s.line === line && (!s.ruleIds || s.ruleIds.includes(ruleId)));
5386
- }
5387
- function componentRule(opts) {
5388
- const docsUrl12 = docsUrlFor(opts.id);
5389
- const severity = opts.severity ?? "warning";
5390
- return {
5391
- id: opts.id,
5392
- title: opts.title,
5393
- category: opts.category,
5394
- severity,
5395
- scope: "component",
5396
- rationale: opts.rationale,
5397
- ...opts.fix ? { fix: opts.fix } : {},
5398
- ...opts.options ? { options: opts.options } : {},
5399
- async check(ctx) {
5400
- const out = [];
5401
- const compiled = compileOverrides(ctx.config);
5402
- for (const c of ctx.components ?? []) {
5403
- const o = resolveRuleOptions(opts.id, opts.options, ctx.config, { route: c.file, file: c.file }, compiled);
5404
- const recommendation10 = typeof opts.recommendation === "function" ? opts.recommendation(o) : opts.recommendation;
5405
- if (!opts.applies(c, o, ctx)) continue;
5406
- const bad = opts.bad(c, o, ctx).filter((b) => !(b.line > 0 && isSuppressed2(c, opts.id, b.line)));
5407
- if (bad.length === 0) {
5408
- out.push({
5409
- id: opts.id,
5410
- category: opts.category,
5411
- severity,
5412
- detection: PASS3,
5413
- route: c.file,
5414
- // Uniform PASS-result attribution (design 2026-08-08-pass-result-location-design.md):
5415
- // same location a penalized result for this file would carry.
5416
- location: c.file,
5417
- message: opts.label,
5418
- recommendation: recommendation10,
5419
- docsUrl: docsUrl12
5420
- });
5421
- continue;
5422
- }
5423
- for (const b of bad) {
5424
- out.push({
5425
- id: opts.id,
5426
- category: opts.category,
5427
- severity,
5428
- detection: PENALIZED3,
5429
- route: c.file,
5430
- location: c.file,
5431
- ...b.line > 0 ? { line: b.line } : {},
5432
- message: b.message,
5433
- recommendation: recommendation10,
5434
- docsUrl: docsUrl12,
5435
- ...opts.fix ? { fix: { ...opts.fix } } : {}
5436
- });
5437
- }
5438
- }
5439
- return out;
5440
- }
5441
- };
5442
- }
5443
-
5444
4381
  // src/rules/correctness/each-key.ts
5445
4382
  var correctnessEachKey = componentRule({
5446
4383
  id: "correctness/each-key",
@@ -5594,7 +4531,8 @@ var correctnessOrphanEffect = componentRule({
5594
4531
  rationale: "An $effect created outside component initialisation throws effect_orphan at runtime. The compiler does not catch it \u2014 the server compiler deletes $effect calls entirely, so SSR renders without error \u2014 and the crash happens client-side, when the module evaluates in the browser, breaking hydration rather than producing a server error.",
5595
4532
  // `orphanEffects` is typed required, but a facts object built by an older/external
5596
4533
  // constructor may omit it — default to empty rather than let `applies` throw and
5597
- // take the whole `runRules` Promise.all down with it.
4534
+ // surface this rule as failed (the engine isolates a throwing rule, but this one
4535
+ // can just work instead of getting flagged).
5598
4536
  applies: (c) => (c.orphanEffects ?? []).length > 0,
5599
4537
  bad: (c) => (c.orphanEffects ?? []).map((o) => ({
5600
4538
  line: o.line,
@@ -5603,8 +4541,6 @@ var correctnessOrphanEffect = componentRule({
5603
4541
  });
5604
4542
 
5605
4543
  // src/rules/correctness/orphan-lifecycle.ts
5606
- var PENALIZED4 = { presence: "none", value: "absent" };
5607
- var PASS4 = { presence: "own", value: "static" };
5608
4544
  var ID = "correctness/orphan-lifecycle";
5609
4545
  var DOCS_URL = docsUrlFor(ID);
5610
4546
  var LABEL = "Lifecycle-call context";
@@ -5618,17 +4554,14 @@ function kitLifecycleMessage(name, kind, inHandler) {
5618
4554
  }
5619
4555
  return inHandler ? `${name}() is called in a load/handler \u2014 it runs on every request, outside component initialisation, and throws lifecycle_outside_component at runtime` : `${name}() runs outside component initialisation (module evaluation or the init hook) \u2014 it throws lifecycle_outside_component at runtime`;
5620
4556
  }
5621
- function isSuppressed3(suppressions, line) {
5622
- return (suppressions ?? []).some((s) => s.line === line && (!s.ruleIds || s.ruleIds.includes(ID)));
5623
- }
5624
4557
  function emitFile(out, file, issues, suppressions) {
5625
- const bad = issues.filter((b) => !(b.line > 0 && isSuppressed3(suppressions, b.line)));
4558
+ const bad = issues.filter((b) => !(b.line > 0 && isSuppressed(suppressions, ID, b.line)));
5626
4559
  if (bad.length === 0) {
5627
4560
  out.push({
5628
4561
  id: ID,
5629
4562
  category: "correctness",
5630
4563
  severity: "critical",
5631
- detection: PASS4,
4564
+ detection: PASS,
5632
4565
  route: file,
5633
4566
  // Uniform PASS-result attribution (design 2026-08-08-pass-result-location-design.md):
5634
4567
  // same location a penalized result for this file would carry.
@@ -5644,7 +4577,7 @@ function emitFile(out, file, issues, suppressions) {
5644
4577
  id: ID,
5645
4578
  category: "correctness",
5646
4579
  severity: "critical",
5647
- detection: PENALIZED4,
4580
+ detection: PENALIZED,
5648
4581
  route: file,
5649
4582
  location: file,
5650
4583
  ...b.line > 0 ? { line: b.line } : {},
@@ -5694,8 +4627,6 @@ var correctnessOrphanLifecycle = {
5694
4627
  };
5695
4628
 
5696
4629
  // src/rules/correctness/base-path-navigation.ts
5697
- var PENALIZED5 = { presence: "none", value: "absent" };
5698
- var PASS5 = { presence: "own", value: "static" };
5699
4630
  var ID2 = "correctness/base-path-navigation";
5700
4631
  var DOCS_URL2 = docsUrlFor(ID2);
5701
4632
  var LABEL2 = "Base-path-aware navigation";
@@ -5712,17 +4643,14 @@ function messageFor2(link) {
5712
4643
  }
5713
4644
  return `redirect(\u2026, '${link.path}') is root-relative \u2014 the Location header points outside this project's kit.paths.base and 404s in production. Use resolve('${link.path}') from '$app/paths'.`;
5714
4645
  }
5715
- function isSuppressed4(suppressions, line) {
5716
- return (suppressions ?? []).some((s) => s.line === line && (!s.ruleIds || s.ruleIds.includes(ID2)));
5717
- }
5718
4646
  function emitFile2(out, file, links, suppressions) {
5719
- const bad = links.filter((l) => !(l.line > 0 && isSuppressed4(suppressions, l.line)));
4647
+ const bad = links.filter((l) => !(l.line > 0 && isSuppressed(suppressions, ID2, l.line)));
5720
4648
  if (bad.length === 0) {
5721
4649
  out.push({
5722
4650
  id: ID2,
5723
4651
  category: "correctness",
5724
4652
  severity: "warning",
5725
- detection: PASS5,
4653
+ detection: PASS,
5726
4654
  route: file,
5727
4655
  // Uniform PASS-result attribution (design 2026-08-08-pass-result-location-design.md):
5728
4656
  // same location a penalized result for this file would carry.
@@ -5738,7 +4666,7 @@ function emitFile2(out, file, links, suppressions) {
5738
4666
  id: ID2,
5739
4667
  category: "correctness",
5740
4668
  severity: "warning",
5741
- detection: PENALIZED5,
4669
+ detection: PENALIZED,
5742
4670
  route: file,
5743
4671
  location: file,
5744
4672
  ...l.line > 0 ? { line: l.line } : {},
@@ -5775,24 +4703,19 @@ var correctnessBasePathNavigation = {
5775
4703
  };
5776
4704
 
5777
4705
  // src/rules/correctness/server-browser-global.ts
5778
- var PENALIZED6 = { presence: "none", value: "absent" };
5779
- var PASS6 = { presence: "own", value: "static" };
5780
4706
  var ID3 = "correctness/server-browser-global";
5781
4707
  var DOCS_URL3 = docsUrlFor(ID3);
5782
4708
  var LABEL3 = "Server-safe module code";
5783
4709
  var RECOMMENDATION3 = "Move browser-only code into onMount or $effect (they never run on the server), or guard it with browser from $app/environment (or a typeof check).";
5784
4710
  var moduleMessage = (name) => `${name} is accessed at module scope \u2014 it does not exist on the server, so importing this file crashes SSR with "${name} is not defined"`;
5785
- function isSuppressed5(suppressions, line) {
5786
- return (suppressions ?? []).some((s) => s.line === line && (!s.ruleIds || s.ruleIds.includes(ID3)));
5787
- }
5788
4711
  function emitFile3(out, file, issues, suppressions) {
5789
- const bad = issues.filter((b) => !(b.line > 0 && isSuppressed5(suppressions, b.line)));
4712
+ const bad = issues.filter((b) => !(b.line > 0 && isSuppressed(suppressions, ID3, b.line)));
5790
4713
  if (bad.length === 0) {
5791
4714
  out.push({
5792
4715
  id: ID3,
5793
4716
  category: "correctness",
5794
4717
  severity: "critical",
5795
- detection: PASS6,
4718
+ detection: PASS,
5796
4719
  route: file,
5797
4720
  // Uniform PASS-result attribution (design 2026-08-08-pass-result-location-design.md):
5798
4721
  // same location a penalized result for this file would carry.
@@ -5808,7 +4731,7 @@ function emitFile3(out, file, issues, suppressions) {
5808
4731
  id: ID3,
5809
4732
  category: "correctness",
5810
4733
  severity: "critical",
5811
- detection: PENALIZED6,
4734
+ detection: PENALIZED,
5812
4735
  route: file,
5813
4736
  location: file,
5814
4737
  ...b.line > 0 ? { line: b.line } : {},
@@ -6066,7 +4989,7 @@ var architecturePrivateScopeImport = {
6066
4989
  }
6067
4990
  if (!sawScopedImport) continue;
6068
4991
  const visible = violations.filter(
6069
- (v) => !(v.line > 0 && isSuppressed2(c, "architecture/private-scope-import", v.line))
4992
+ (v) => !(v.line > 0 && isSuppressed(c.suppressions, "architecture/private-scope-import", v.line))
6070
4993
  );
6071
4994
  if (visible.length === 0) {
6072
4995
  out.push({
@@ -7036,7 +5959,7 @@ var performanceNamespaceImport = componentRule({
7036
5959
  });
7037
5960
 
7038
5961
  // src/rules/perf/minify-disabled.ts
7039
- var PENALIZED7 = { presence: "none", value: "absent" };
5962
+ var PENALIZED2 = { presence: "none", value: "absent" };
7040
5963
  var MINIFY_DISABLED_FIX = {
7041
5964
  description: "Remove the minify: false override from vite.config (Vite minifies by default), or scope it to non-production builds.",
7042
5965
  snippet: "export default defineConfig({\n build: {\n // minify: false \u2014 removed; Vite minifies production builds by default\n }\n});",
@@ -7060,7 +5983,7 @@ var performanceMinifyDisabled = {
7060
5983
  id: "performance/minify-disabled",
7061
5984
  category: "performance",
7062
5985
  severity: "warning",
7063
- detection: PENALIZED7,
5986
+ detection: PENALIZED2,
7064
5987
  ...hit.file !== void 0 ? { location: hit.file } : {},
7065
5988
  ...hit.line !== void 0 ? { line: hit.line } : {},
7066
5989
  message: "JS/CSS minification is disabled (build.minify: false) \u2014 production bundles ship unminified and several times larger." + provenance,
@@ -7397,6 +6320,20 @@ function scoreColor(p, score) {
7397
6320
  return p.red;
7398
6321
  }
7399
6322
 
6323
+ // src/reporter/sanitize.ts
6324
+ function inlineCode(text) {
6325
+ const longestRun = Math.max(0, ...(text.match(/`+/g) ?? []).map((run) => run.length));
6326
+ const fence = "`".repeat(longestRun + 1);
6327
+ const pad = text.startsWith("`") || text.endsWith("`") ? " " : "";
6328
+ return `${fence}${pad}${text}${pad}${fence}`;
6329
+ }
6330
+ function mdEscape(text) {
6331
+ return text.replace(/\r\n|\r|\n/g, " ").replace(/<[^>]+>/g, (tag) => inlineCode(tag)).replace(/\[([^\]]*)\]\(([^)]*)\)/g, "[$1]\\($2\\)");
6332
+ }
6333
+ function terminalSafe(text) {
6334
+ return text.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)?/g, "").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "").replace(/[\x00-\x08\x0b-\x1f\x7f]/g, "");
6335
+ }
6336
+
7400
6337
  // src/reporter/console.ts
7401
6338
  var RULE = "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500";
7402
6339
  var SEVERITY_TITLE = {
@@ -7404,14 +6341,7 @@ var SEVERITY_TITLE = {
7404
6341
  warning: "Warnings",
7405
6342
  info: "Info"
7406
6343
  };
7407
- var CATEGORY_LABEL = {
7408
- seo: "SEO",
7409
- performance: "Performance",
7410
- correctness: "Correctness",
7411
- security: "Security",
7412
- architecture: "Architecture"
7413
- };
7414
- var CATEGORY_ORDER = ["seo", "performance", "correctness", "security", "architecture"];
6344
+ var categoryLabel = (c) => c === "seo" ? "SEO" : c.charAt(0).toUpperCase() + c.slice(1);
7415
6345
  var MAX_RULE_GROUPS_PER_BUCKET = 5;
7416
6346
  function groupByRule(results) {
7417
6347
  const groups = /* @__PURE__ */ new Map();
@@ -7445,9 +6375,9 @@ function byRouteTree(p, results, config, verbose) {
7445
6375
  const shown = verbose ? scored : scored.slice(0, MAX_ROUTES_BY_ROUTE);
7446
6376
  const lines = [p.bold("By route"), p.dim(RULE)];
7447
6377
  for (const { route, rs, score } of shown) {
7448
- lines.push(`${route.padEnd(28)} ${scoreColor(p, score)(`${score}`)}`);
6378
+ lines.push(`${terminalSafe(route).padEnd(28)} ${scoreColor(p, score)(`${score}`)}`);
7449
6379
  for (const r of rs.filter((x) => classify(x, config) === "fail")) {
7450
- lines.push(` ${p.red("\u2717")} ${r.id} ${r.message}`);
6380
+ lines.push(` ${p.red("\u2717")} ${r.id} ${terminalSafe(r.message)}`);
7451
6381
  }
7452
6382
  }
7453
6383
  if (!verbose && scored.length > MAX_ROUTES_BY_ROUTE) {
@@ -7466,7 +6396,7 @@ function formatConsoleReport(results, config, options = {}) {
7466
6396
  const p = options.palette ?? noColorPalette;
7467
6397
  const summary = summarize(results, config);
7468
6398
  const { health, categories: byCat } = computeHealth(results, config);
7469
- const present3 = CATEGORY_ORDER.filter((c) => byCat[c] !== void 0);
6399
+ const present3 = CATEGORIES.filter((c) => byCat[c] !== void 0);
7470
6400
  const lines = [];
7471
6401
  if (!options.omitHeader) {
7472
6402
  lines.push(
@@ -7476,7 +6406,7 @@ function formatConsoleReport(results, config, options = {}) {
7476
6406
  );
7477
6407
  }
7478
6408
  for (const c of present3) {
7479
- lines.push(scoreLine(p, CATEGORY_LABEL[c] ?? c, byCat[c]));
6409
+ lines.push(scoreLine(p, categoryLabel(c), byCat[c]));
7480
6410
  }
7481
6411
  lines.push("");
7482
6412
  const SEVERITY_COLOR = {
@@ -7491,18 +6421,18 @@ function formatConsoleReport(results, config, options = {}) {
7491
6421
  lines.push(SEVERITY_COLOR[severity](`${SEVERITY_TITLE[severity]} (${bucket.length})`), p.dim(RULE));
7492
6422
  if (options.verbose) {
7493
6423
  for (const r of bucket) {
7494
- lines.push(`${p.red("\u2717")} ${r.id} ${r.message}`);
7495
- if (r.route) lines.push(p.dim(` ${r.route}`));
7496
- if (r.location) lines.push(p.dim(` ${r.location}${r.line ? `:${r.line}` : ""}`));
6424
+ lines.push(`${p.red("\u2717")} ${r.id} ${terminalSafe(r.message)}`);
6425
+ if (r.route) lines.push(p.dim(` ${terminalSafe(r.route)}`));
6426
+ if (r.location) lines.push(p.dim(` ${terminalSafe(r.location)}${r.line ? `:${r.line}` : ""}`));
7497
6427
  }
7498
6428
  } else {
7499
6429
  const groups = groupByRule(bucket);
7500
6430
  const shownGroups = groups.slice(0, MAX_RULE_GROUPS_PER_BUCKET);
7501
6431
  for (const group of shownGroups) {
7502
6432
  const r = group.results[0];
7503
- lines.push(`${p.red("\u2717")} ${r.id} ${r.message}`);
7504
- if (r.route) lines.push(p.dim(` ${r.route}`));
7505
- if (r.location) lines.push(p.dim(` ${r.location}${r.line ? `:${r.line}` : ""}`));
6433
+ lines.push(`${p.red("\u2717")} ${r.id} ${terminalSafe(r.message)}`);
6434
+ if (r.route) lines.push(p.dim(` ${terminalSafe(r.route)}`));
6435
+ if (r.location) lines.push(p.dim(` ${terminalSafe(r.location)}${r.line ? `:${r.line}` : ""}`));
7506
6436
  if (group.results.length > 1) {
7507
6437
  lines.push(p.dim(` \u2026and ${group.results.length - 1} more`));
7508
6438
  }
@@ -7523,8 +6453,8 @@ function formatConsoleReport(results, config, options = {}) {
7523
6453
  for (const r of passed) {
7524
6454
  const marker = classify(r, config) === "dynamic" ? p.cyan(" \u21AF dynamic") : "";
7525
6455
  const where = r.location ?? r.route;
7526
- const suffix = where ? ` ${where}` : "";
7527
- lines.push(`${p.green("\u2713")} ${r.id} ${r.message}${marker}${suffix}`);
6456
+ const suffix = where ? ` ${terminalSafe(where)}` : "";
6457
+ lines.push(`${p.green("\u2713")} ${r.id} ${terminalSafe(r.message)}${marker}${suffix}`);
7528
6458
  }
7529
6459
  }
7530
6460
  lines.push("");
@@ -7605,11 +6535,25 @@ function formatJsonReport(results, config, meta, ruleIds, examined) {
7605
6535
  return JSON.stringify(buildJsonReport(results, config, meta, ruleIds, examined), null, 2);
7606
6536
  }
7607
6537
 
7608
- // src/reporter/agent.ts
6538
+ // src/reporter/shared.ts
7609
6539
  var SEVERITY_RANK = { critical: 0, warning: 1, info: 2 };
7610
- function mdTags(text) {
7611
- return text.replace(/<[^>]+>/g, (tag) => `\`${tag}\``);
6540
+ function severityToSarifLevel(sev) {
6541
+ return sev === "critical" ? "error" : sev === "warning" ? "warning" : "note";
6542
+ }
6543
+ function severityToGithubLevel(sev) {
6544
+ return sev === "critical" ? "error" : sev === "warning" ? "warning" : "notice";
6545
+ }
6546
+ function messageText(result) {
6547
+ return result.recommendation ? `${result.message} ${result.recommendation}` : result.message;
6548
+ }
6549
+ var RULE_META = new Map(
6550
+ allRules.map((r) => [r.id, { title: r.title, severity: r.severity, docsUrl: docsUrlFor(r.id) }])
6551
+ );
6552
+ function ruleMetaById(id) {
6553
+ return RULE_META.get(id);
7612
6554
  }
6555
+
6556
+ // src/reporter/agent.ts
7613
6557
  function formatAgentReport(results, config) {
7614
6558
  const failing = results.filter((r) => classify(r, config) === "fail");
7615
6559
  const { health } = computeHealth(results, config);
@@ -7636,39 +6580,22 @@ function formatAgentReport(results, config) {
7636
6580
  rs.sort(
7637
6581
  (x, y) => SEVERITY_RANK[effectiveSeverity(x, config)] - SEVERITY_RANK[effectiveSeverity(y, config)] || x.id.localeCompare(y.id)
7638
6582
  );
7639
- lines.push(`## ${loc}`, "");
6583
+ lines.push(`## ${mdEscape(loc)}`, "");
7640
6584
  for (const r of rs) {
7641
- lines.push(`### ${r.id} \xB7 ${mdTags(r.message)} (${effectiveSeverity(r, config)})`);
6585
+ lines.push(`### ${r.id} \xB7 ${mdEscape(r.message)} (${effectiveSeverity(r, config)})`);
7642
6586
  if (r.fix) {
7643
- lines.push(`- Fix: ${mdTags(r.fix.description)}`);
6587
+ lines.push(`- Fix: ${mdEscape(r.fix.description)}`);
7644
6588
  if (r.fix.snippet) lines.push("", "```" + (r.fix.lang ?? "svelte"), r.fix.snippet, "```");
7645
6589
  } else if (r.recommendation) {
7646
- lines.push(`- Fix: ${mdTags(r.recommendation)}`);
6590
+ lines.push(`- Fix: ${mdEscape(r.recommendation)}`);
7647
6591
  }
7648
6592
  if (r.docsUrl) lines.push(`- Docs: ${r.docsUrl}`);
7649
- lines.push(`- Accept: re-run svelte-vitals; ${r.id} passes${r.route ? ` for ${r.route}` : ""}.`, "");
6593
+ lines.push(`- Accept: re-run svelte-vitals; ${r.id} passes${r.route ? ` for ${mdEscape(r.route)}` : ""}.`, "");
7650
6594
  }
7651
6595
  }
7652
6596
  return lines.join("\n").replace(/\n+$/, "\n");
7653
6597
  }
7654
6598
 
7655
- // src/reporter/shared.ts
7656
- function severityToSarifLevel(sev) {
7657
- return sev === "critical" ? "error" : sev === "warning" ? "warning" : "note";
7658
- }
7659
- function severityToGithubLevel(sev) {
7660
- return sev === "critical" ? "error" : sev === "warning" ? "warning" : "notice";
7661
- }
7662
- function messageText(result) {
7663
- return result.recommendation ? `${result.message} ${result.recommendation}` : result.message;
7664
- }
7665
- var RULE_META = new Map(
7666
- allRules.map((r) => [r.id, { title: r.title, severity: r.severity, docsUrl: docsUrlFor(r.id) }])
7667
- );
7668
- function ruleMetaById(id) {
7669
- return RULE_META.get(id);
7670
- }
7671
-
7672
6599
  // src/reporter/sarif.ts
7673
6600
  function formatSarifReport(results, config, meta) {
7674
6601
  const penalized = results.filter((r) => isPenalized(r.detection, config.treatDynamicAs));
@@ -7755,9 +6682,8 @@ function formatGithubReport(results, config) {
7755
6682
  // src/reporter/markdown.ts
7756
6683
  var MAX_FINDINGS = 50;
7757
6684
  var SEVERITY_EMOJI = { critical: "\u{1F534}", warning: "\u{1F7E1}", info: "\u{1F535}" };
7758
- var SEVERITY_RANK2 = { critical: 0, warning: 1, info: 2 };
7759
6685
  function escapeCell(s) {
7760
- return s.replace(/\|/g, "\\|").replace(/\r\n|\r|\n/g, " ");
6686
+ return mdEscape(s).replace(/(\\*)\|/g, (_, bs) => bs + bs + "\\|");
7761
6687
  }
7762
6688
  function locationOf(issue, route) {
7763
6689
  if (issue.location) return issue.line !== void 0 ? `${issue.location}:${issue.line}` : issue.location;
@@ -7786,7 +6712,7 @@ function flattenFindings(report) {
7786
6712
  message: messageWithRecommendation(issue)
7787
6713
  });
7788
6714
  }
7789
- return findings.map((f, index) => ({ f, index })).sort((a, b) => SEVERITY_RANK2[a.f.severity] - SEVERITY_RANK2[b.f.severity] || a.index - b.index).map(({ f }) => f);
6715
+ return findings.map((f, index) => ({ f, index })).sort((a, b) => SEVERITY_RANK[a.f.severity] - SEVERITY_RANK[b.f.severity] || a.index - b.index).map(({ f }) => f);
7790
6716
  }
7791
6717
  function categoryRows(categories) {
7792
6718
  const names = Object.keys(categories).sort();
@@ -7836,6 +6762,24 @@ function formatMarkdownReport(results, config, meta) {
7836
6762
  }
7837
6763
 
7838
6764
  // src/reporter/app-shell.ts
6765
+ var BAND_COLOR = {
6766
+ good: "#2FA968",
6767
+ warn: "#E8A317",
6768
+ poor: "#E5484D"
6769
+ };
6770
+ function scoreBand(score) {
6771
+ return score >= 90 ? "good" : score >= 50 ? "warn" : "poor";
6772
+ }
6773
+ function escapeHtml(s) {
6774
+ return s.replace(
6775
+ /[&<>"']/g,
6776
+ (c) => c === "&" ? "&amp;" : c === "<" ? "&lt;" : c === ">" ? "&gt;" : c === '"' ? "&quot;" : "&#39;"
6777
+ );
6778
+ }
6779
+ function safeHref(url) {
6780
+ const normalized = url.replace(/\s/g, "").toLowerCase();
6781
+ return /^https?:\/\//.test(normalized) ? url : null;
6782
+ }
7839
6783
  function embedJson(value) {
7840
6784
  return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
7841
6785
  }
@@ -8508,26 +7452,6 @@ function buildHtmlDocument(report, meta) {
8508
7452
  function formatHtmlReport(results, config, meta) {
8509
7453
  return buildHtmlDocument(buildJsonReport(results, config, meta), meta);
8510
7454
  }
8511
-
8512
- // src/reporter/html.ts
8513
- var BAND_COLOR = {
8514
- good: "#2FA968",
8515
- warn: "#E8A317",
8516
- poor: "#E5484D"
8517
- };
8518
- function scoreBand(score) {
8519
- return score >= 90 ? "good" : score >= 50 ? "warn" : "poor";
8520
- }
8521
- function escapeHtml(s) {
8522
- return s.replace(
8523
- /[&<>"']/g,
8524
- (c) => c === "&" ? "&amp;" : c === "<" ? "&lt;" : c === ">" ? "&gt;" : c === '"' ? "&quot;" : "&#39;"
8525
- );
8526
- }
8527
- function safeHref(url) {
8528
- const normalized = url.replace(/\s/g, "").toLowerCase();
8529
- return /^https?:\/\//.test(normalized) ? url : null;
8530
- }
8531
7455
  export {
8532
7456
  APP_SCRIPT,
8533
7457
  APP_STYLE,
@@ -8593,6 +7517,7 @@ export {
8593
7517
  findMinifyDisabled,
8594
7518
  formatAgentReport,
8595
7519
  formatConsoleReport,
7520
+ formatFailedRuleWarning,
8596
7521
  formatGithubReport,
8597
7522
  formatHtmlReport,
8598
7523
  formatJsonReport,
@@ -8629,6 +7554,7 @@ export {
8629
7554
  renderAppShell,
8630
7555
  resolveKitAliases,
8631
7556
  resolveKitPathsBase,
7557
+ resolveRepoLocalPath,
8632
7558
  resolveRuleOptions,
8633
7559
  resolveRunesModuleSpecifier,
8634
7560
  runRules,
@@ -8677,8 +7603,10 @@ export {
8677
7603
  settingSeverity,
8678
7604
  shouldSkipRangeCheck,
8679
7605
  summarize,
7606
+ terminalSafe,
8680
7607
  textFromNodes,
8681
7608
  validateRuleOptions,
8682
7609
  validateRuleSetting,
8683
- valueFromNodes
7610
+ valueFromNodes,
7611
+ withFailedRulesOff
8684
7612
  };