sicua
Version:
A tool for analyzing project structure and dependencies
149 lines (148 loc) • 5.84 kB
JavaScript
;
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;