axyseo 2.1.0 → 2.1.2
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.
|
@@ -19,7 +19,7 @@ export default class FAQsAssessment extends Assessment {
|
|
|
19
19
|
const defaultConfig = {
|
|
20
20
|
id: FAQs_ASSESSMENT_ID,
|
|
21
21
|
ctaType: 'fix',
|
|
22
|
-
docUrl: 'https://
|
|
22
|
+
docUrl: 'https://blog.google/products/search/generative-ai-search/',
|
|
23
23
|
priority: 'high',
|
|
24
24
|
fixPosition: 'faqs',
|
|
25
25
|
title: 'FAQs Optimization',
|
|
@@ -158,5 +158,17 @@ export default class FAQsAssessment extends Assessment {
|
|
|
158
158
|
checkMinimumFAQs(faqs) {
|
|
159
159
|
return faqs.length >= 3;
|
|
160
160
|
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Checks whether the paper has text.
|
|
164
|
+
*
|
|
165
|
+
* @param {Paper} paper The paper to use for the assessment.
|
|
166
|
+
*
|
|
167
|
+
* @returns {boolean} True when there is text.
|
|
168
|
+
*/
|
|
169
|
+
isApplicable(paper) {
|
|
170
|
+
const data = paper.getData();
|
|
171
|
+
return 'faqs' in data;
|
|
172
|
+
}
|
|
161
173
|
}
|
|
162
174
|
//# sourceMappingURL=FAQsAssessment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FAQsAssessment.js","names":["merge","Assessment","AssessmentResult","FAQs_ASSESSMENT_ID","FAQsAssessment","constructor","config","defaultConfig","id","ctaType","docUrl","priority","fixPosition","title","content","good","improve","bad","details","hasSchema","hasProperStructure","hasQualityContent","hasRelevantQuestions","hasMinimumFAQs","identifier","_config","getResult","paper","researcher","calculatedResult","calculateResult","assessmentResult","setScore","score","setStatus","status","setData","data","faqs","getFAQs","length","hasFAQs","hasFAQsSchema","checkFAQStructure","checkFAQContent","checkRelevance","getKeyword","getRelatedKeywords","checkMinimumFAQs","criteriaMet","filter","Boolean","every","faq","question","answer","answerLength","keywords","some","toLowerCase","keyword","includes"],"sources":["../../../../src/scoring/assessments/seo/FAQsAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport Assessment from '../assessment';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport {FAQs_ASSESSMENT_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents an assessment that checks FAQs content and structure for SGE optimization.\n */\nexport default class FAQsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {Object} [config] The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: FAQs_ASSESSMENT_ID,\n ctaType: 'fix',\n docUrl: 'https://
|
|
1
|
+
{"version":3,"file":"FAQsAssessment.js","names":["merge","Assessment","AssessmentResult","FAQs_ASSESSMENT_ID","FAQsAssessment","constructor","config","defaultConfig","id","ctaType","docUrl","priority","fixPosition","title","content","good","improve","bad","details","hasSchema","hasProperStructure","hasQualityContent","hasRelevantQuestions","hasMinimumFAQs","identifier","_config","getResult","paper","researcher","calculatedResult","calculateResult","assessmentResult","setScore","score","setStatus","status","setData","data","faqs","getFAQs","length","hasFAQs","hasFAQsSchema","checkFAQStructure","checkFAQContent","checkRelevance","getKeyword","getRelatedKeywords","checkMinimumFAQs","criteriaMet","filter","Boolean","every","faq","question","answer","answerLength","keywords","some","toLowerCase","keyword","includes","isApplicable","getData"],"sources":["../../../../src/scoring/assessments/seo/FAQsAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport Assessment from '../assessment';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport {FAQs_ASSESSMENT_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents an assessment that checks FAQs content and structure for SGE optimization.\n */\nexport default class FAQsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {Object} [config] The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: FAQs_ASSESSMENT_ID,\n ctaType: 'fix',\n docUrl: 'https://blog.google/products/search/generative-ai-search/',\n priority: 'high',\n fixPosition: 'faqs',\n title: 'FAQs Optimization',\n content: {\n good: 'FAQs are well-structured and optimized for Google SGE.',\n improve: 'FAQs could be improved to better match Google SGE requirements.',\n bad: 'FAQs need significant improvement to meet Google SGE standards.',\n details: {\n hasSchema: 'Missing FAQ schema markup',\n hasProperStructure: 'Empty questions or answers',\n hasQualityContent: 'Answer length must be between 50-1000 characters',\n hasRelevantQuestions: 'Missing keywords in FAQs',\n hasMinimumFAQs: 'Less than 3 FAQs'\n }\n }\n };\n\n this.identifier = FAQs_ASSESSMENT_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Executes the Assessment and returns a result.\n *\n * @param {Paper} paper The Paper object to assess.\n * @param {Researcher} researcher The Researcher object containing all available researches.\n *\n * @returns {AssessmentResult} The result of the assessment, containing both a score and a descriptive text.\n */\n getResult({paper, researcher}) {\n const calculatedResult = this.calculateResult(paper);\n\n const assessmentResult = new AssessmentResult({config: this._config});\n assessmentResult.setScore(calculatedResult.score);\n assessmentResult.setStatus(calculatedResult.status);\n assessmentResult.setData(calculatedResult.data);\n\n return assessmentResult;\n }\n\n /**\n *\n * @param paper\n * @returns {{score: number, status: string, data: {hasSchema: ((function(): *)|boolean), hasProperStructure: boolean, hasQualityContent: boolean, hasRelevantQuestions: boolean, hasMinimumFAQs: boolean}}|{score: number, status: string, data: {hasFAQs: boolean}}}\n */\n calculateResult(paper) {\n const faqs = paper.getFAQs();\n let status = 'bad';\n let score = 0;\n\n if (!faqs || faqs.length === 0) {\n return {score: 0, status: 'bad', data: {hasFAQs: false}};\n }\n\n // Check FAQ structure and content\n const hasSchema = paper.hasFAQsSchema();\n const hasProperStructure = this.checkFAQStructure(faqs);\n const hasQualityContent = this.checkFAQContent(faqs);\n const hasRelevantQuestions = this.checkRelevance(faqs, [\n paper.getKeyword(),\n ...paper.getRelatedKeywords()\n ]);\n const hasMinimumFAQs = this.checkMinimumFAQs(faqs);\n\n // Calculate score based on criteria\n const criteriaMet = [\n hasSchema,\n hasProperStructure,\n hasQualityContent,\n hasRelevantQuestions,\n hasMinimumFAQs\n ].filter(Boolean).length;\n\n if (criteriaMet === 5) {\n status = 'good';\n score = 18;\n } else if (criteriaMet >= 3) {\n status = 'improve';\n score = 12;\n } else {\n status = 'bad';\n score = 6;\n }\n\n return {\n score,\n status,\n data: {\n hasSchema,\n hasProperStructure,\n hasQualityContent,\n hasRelevantQuestions,\n hasMinimumFAQs\n }\n };\n }\n\n /**\n * Checks if FAQs have proper structure\n * @param {Array} faqs\n * @returns {boolean}\n */\n checkFAQStructure(faqs) {\n return faqs.every(faq => {\n return (\n faq.question &&\n faq.answer &&\n typeof faq.question === 'string' &&\n typeof faq.answer === 'string' &&\n faq.question.length > 0 &&\n faq.answer.length > 0\n );\n });\n }\n\n /**\n * Checks if FAQ content meets quality standards\n * @param {Array} faqs\n * @returns {boolean}\n */\n checkFAQContent(faqs) {\n return faqs.every(faq => {\n const answerLength = faq.answer.length;\n return answerLength >= 50 && answerLength <= 1000;\n });\n }\n\n /**\n * Checks if FAQs are relevant to the main content\n * @param {Array} faqs\n * @param {Array} keywords\n * @returns {boolean}\n */\n checkRelevance(faqs, keywords) {\n if (!keywords || keywords.length === 0) return true;\n\n return faqs.some(faq => {\n const question = faq.question.toLowerCase();\n return keywords.some(keyword => question.includes(keyword.toLowerCase()));\n });\n }\n\n /**\n * Checks if there are at least 3 FAQs\n * @param {Array} faqs\n * @returns {boolean}\n */\n checkMinimumFAQs(faqs) {\n return faqs.length >= 3;\n }\n\n /**\n * Checks whether the paper has text.\n *\n * @param {Paper} paper The paper to use for the assessment.\n *\n * @returns {boolean} True when there is text.\n */\n isApplicable(paper) {\n const data = paper.getData();\n return 'faqs' in data;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axyseo",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"scripts": {
|
|
6
|
+
"prepublishOnly": "npm run build ",
|
|
6
7
|
"build": "yarn clean && yarn build:js && yarn build:types",
|
|
7
8
|
"watch": "nodemon",
|
|
8
9
|
"build:js": "babel src --copy-files --source-maps --out-dir build",
|