UNPKG

sicua

Version:

A tool for analyzing project structure and dependencies

149 lines (148 loc) 5.84 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SchemaUtils = void 0; const typescript_1 = __importDefault(require("typescript")); const seoRelatedUtils_1 = require("../../../utils/common/seoRelatedUtils"); const jsxUtils_1 = require("./jsxUtils"); /** * Utility functions for structured data (Schema.org) analysis */ class SchemaUtils { /** * Finds structured data in a source file */ static findStructuredData(sourceFile) { let result; const visitNode = (node) => { if (typescript_1.default.isJsxElement(node)) { // Look for script tags with JSON-LD if (seoRelatedUtils_1.SeoRelated.getJsxTagName(node) === "script" && jsxUtils_1.JsxUtils.getAttribute(node, "type") === "application/ld+json") { const content = node.children .filter(typescript_1.default.isJsxText) .map((child) => child.text) .join(""); try { const parsed = JSON.parse(content); if (parsed["@graph"]) { result = parsed; } else { result = parsed; } } catch (e) { console.warn("Invalid JSON-LD structure:", e); } } } typescript_1.default.forEachChild(node, visitNode); }; visitNode(sourceFile); return result; } /** * Gets the schema type from a structured data object */ static getSchemaType(schema) { if (seoRelatedUtils_1.SeoRelated.isGraph(schema)) { return Array.from(new Set(schema["@graph"].map((item) => seoRelatedUtils_1.SeoRelated.isThingWithType(item) ? seoRelatedUtils_1.SeoRelated.getTypeFromThing(item) : "Unknown"))).join(", "); } return seoRelatedUtils_1.SeoRelated.getTypeFromThing(schema); } /** * Calculates the coverage/completeness of a schema */ static calculateSchemaCoverage(schema) { const requiredProperties = new Set(["@context", "@type"]); const recommendedProperties = new Set([ "name", "description", "url", "image", ]); if (seoRelatedUtils_1.SeoRelated.isGraph(schema)) { const coverages = schema["@graph"] .filter(seoRelatedUtils_1.SeoRelated.isThingWithType) .map((item) => this.calculateItemCoverage(item, requiredProperties, recommendedProperties)); return coverages.length > 0 ? coverages.reduce((a, b) => a + b, 0) / coverages.length : 0; } return this.calculateItemCoverage(schema, requiredProperties, recommendedProperties); } /** * Calculates coverage score for a single schema item */ static calculateItemCoverage(item, required, recommended) { // Convert to unknown first, then to Record to satisfy TypeScript const itemProperties = new Set(Object.keys(item)); const requiredCount = Array.from(required).filter((prop) => itemProperties.has(prop)).length; const recommendedCount = Array.from(recommended).filter((prop) => itemProperties.has(prop)).length; const totalRequired = required.size; const totalRecommended = recommended.size; const score = (requiredCount / totalRequired) * 0.7 + (recommendedCount / totalRecommended) * 0.3; return Math.round(score * 100); } /** * Gets required and recommended properties for specific schema types */ static getSchemaProperties(schemaType) { // Default properties const defaultProperties = { required: ["@context", "@type"], recommended: ["name", "description", "url", "image"], }; // Type-specific properties const typeProperties = { Product: { required: [...defaultProperties.required, "name"], recommended: [ ...defaultProperties.recommended, "brand", "offers", "review", "aggregateRating", ], }, Article: { required: [...defaultProperties.required, "headline", "author"], recommended: [ ...defaultProperties.recommended, "datePublished", "dateModified", "publisher", ], }, LocalBusiness: { required: [...defaultProperties.required, "name", "address"], recommended: [ ...defaultProperties.recommended, "telephone", "openingHours", "priceRange", ], }, WebPage: { required: [...defaultProperties.required, "name"], recommended: [ ...defaultProperties.recommended, "breadcrumb", "mainEntity", ], }, FAQPage: { required: [...defaultProperties.required, "mainEntity"], recommended: [...defaultProperties.recommended], }, }; return typeProperties[schemaType] || defaultProperties; } } exports.SchemaUtils = SchemaUtils;