@lynxflow/seo-engine 1.8.1 → 1.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/connectors/wordpress/lynxseo-admin-app.js +25 -0
- package/connectors/wordpress/lynxseo-connector.php +24 -0
- package/connectors/wordpress/lynxseo-connector.zip +0 -0
- package/dist/extended-schemas.d.ts +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +747 -177
- package/dist/index.mjs +360 -7
- package/dist/power-words-psychology.d.ts +35 -0
- package/package.json +1 -1
- package/src/extended-schemas.ts +8 -4
- package/src/index.ts +1 -0
- package/src/og-image-generator.ts +5 -5
- package/src/power-words-psychology.ts +369 -0
package/dist/index.mjs
CHANGED
|
@@ -3084,10 +3084,13 @@ class ExtendedSchemaGraphBuilder {
|
|
|
3084
3084
|
};
|
|
3085
3085
|
}
|
|
3086
3086
|
static buildAggregateRating(opts) {
|
|
3087
|
+
if (!opts.ratingValue || !opts.reviewCount || opts.reviewCount <= 0) {
|
|
3088
|
+
return null;
|
|
3089
|
+
}
|
|
3087
3090
|
return {
|
|
3088
3091
|
"@type": "AggregateRating",
|
|
3089
|
-
ratingValue: opts.ratingValue
|
|
3090
|
-
reviewCount: opts.reviewCount
|
|
3092
|
+
ratingValue: opts.ratingValue,
|
|
3093
|
+
reviewCount: opts.reviewCount,
|
|
3091
3094
|
bestRating: opts.bestRating ?? 5,
|
|
3092
3095
|
worstRating: opts.worstRating ?? 1,
|
|
3093
3096
|
itemReviewed: {
|
|
@@ -3305,8 +3308,8 @@ class OgImageGenerator {
|
|
|
3305
3308
|
const badge = opts.badgeText || "OFFICIAL";
|
|
3306
3309
|
const title = opts.title.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
3307
3310
|
const loc = opts.locationName ? `\uD83D\uDCCD ${opts.locationName}` : "⚡ Instant Cloud Setup";
|
|
3308
|
-
const rating = opts.ratingValue
|
|
3309
|
-
const reviews = opts.reviewCount
|
|
3311
|
+
const rating = opts.ratingValue;
|
|
3312
|
+
const reviews = opts.reviewCount;
|
|
3310
3313
|
const accent = opts.brandColor || "#6366F1";
|
|
3311
3314
|
return `<svg width="1200" height="630" viewBox="0 0 1200 630" xmlns="http://www.w3.org/2000/svg">
|
|
3312
3315
|
<defs>
|
|
@@ -3349,12 +3352,12 @@ class OgImageGenerator {
|
|
|
3349
3352
|
${title.length > 38 ? `<tspan x="80" dy="68">${title.slice(38, 80)}</tspan>` : ""}
|
|
3350
3353
|
</text>
|
|
3351
3354
|
|
|
3352
|
-
<!-- Trust Stars & Social Proof -->
|
|
3353
|
-
|
|
3355
|
+
<!-- Trust Stars & Social Proof (Only if real verified reviews exist) -->
|
|
3356
|
+
${rating && reviews ? `<g transform="translate(80, 470)">
|
|
3354
3357
|
<text x="0" y="32" fill="#FBBF24" font-size="24">★★★★★</text>
|
|
3355
3358
|
<text x="140" y="30" fill="#F8FAFC" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="20" font-weight="800">${rating} / 5</text>
|
|
3356
3359
|
<text x="210" y="30" fill="#64748B" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="500">(${reviews.toLocaleString()} verified reviews)</text>
|
|
3357
|
-
</g
|
|
3360
|
+
</g>` : ""}
|
|
3358
3361
|
|
|
3359
3362
|
<!-- Footer Brand -->
|
|
3360
3363
|
<g transform="translate(80, 540)">
|
|
@@ -7232,6 +7235,354 @@ class VideoYouTubeAnalyzer {
|
|
|
7232
7235
|
`.trim();
|
|
7233
7236
|
}
|
|
7234
7237
|
}
|
|
7238
|
+
// src/power-words-psychology.ts
|
|
7239
|
+
var MULTILINGUAL_POWER_WORDS = {
|
|
7240
|
+
fr: {
|
|
7241
|
+
authority: [
|
|
7242
|
+
"officiel",
|
|
7243
|
+
"guide",
|
|
7244
|
+
"expert",
|
|
7245
|
+
"complet",
|
|
7246
|
+
"certifié",
|
|
7247
|
+
"ultime",
|
|
7248
|
+
"meilleur",
|
|
7249
|
+
"meilleurs",
|
|
7250
|
+
"comparatif",
|
|
7251
|
+
"maîtriser",
|
|
7252
|
+
"spécialiste",
|
|
7253
|
+
"leader",
|
|
7254
|
+
"professionnel",
|
|
7255
|
+
"authentique",
|
|
7256
|
+
"infaillible",
|
|
7257
|
+
"reconnu",
|
|
7258
|
+
"démontré"
|
|
7259
|
+
],
|
|
7260
|
+
urgency: [
|
|
7261
|
+
"rapide",
|
|
7262
|
+
"instantané",
|
|
7263
|
+
"maintenant",
|
|
7264
|
+
"immédiat",
|
|
7265
|
+
"express",
|
|
7266
|
+
"2026",
|
|
7267
|
+
"dernière minute",
|
|
7268
|
+
"urgent",
|
|
7269
|
+
"dépêchez-vous",
|
|
7270
|
+
"en 5 min",
|
|
7271
|
+
"en 10 min",
|
|
7272
|
+
"aujourd'hui",
|
|
7273
|
+
"débloquer"
|
|
7274
|
+
],
|
|
7275
|
+
value: [
|
|
7276
|
+
"gratuit",
|
|
7277
|
+
"économique",
|
|
7278
|
+
"rentable",
|
|
7279
|
+
"offert",
|
|
7280
|
+
"sans engagement",
|
|
7281
|
+
"garanti",
|
|
7282
|
+
"facile",
|
|
7283
|
+
"clé en main",
|
|
7284
|
+
"rentabilité",
|
|
7285
|
+
"gain",
|
|
7286
|
+
"économisez",
|
|
7287
|
+
"inclus",
|
|
7288
|
+
"accessible",
|
|
7289
|
+
"inédit"
|
|
7290
|
+
],
|
|
7291
|
+
curiosity: [
|
|
7292
|
+
"exclusif",
|
|
7293
|
+
"secret",
|
|
7294
|
+
"astuces",
|
|
7295
|
+
"révélé",
|
|
7296
|
+
"inédit",
|
|
7297
|
+
"top",
|
|
7298
|
+
"méthode",
|
|
7299
|
+
"pourquoi",
|
|
7300
|
+
"comment",
|
|
7301
|
+
"découvrir",
|
|
7302
|
+
"choc",
|
|
7303
|
+
"incontournable",
|
|
7304
|
+
"mystère",
|
|
7305
|
+
"incroyable"
|
|
7306
|
+
],
|
|
7307
|
+
sentimentPositive: [
|
|
7308
|
+
"parfait",
|
|
7309
|
+
"incroyable",
|
|
7310
|
+
"magnifique",
|
|
7311
|
+
"puissant",
|
|
7312
|
+
"réussi",
|
|
7313
|
+
"génial",
|
|
7314
|
+
"exceptionnel",
|
|
7315
|
+
"facile",
|
|
7316
|
+
"meilleur",
|
|
7317
|
+
"succès",
|
|
7318
|
+
"brillant",
|
|
7319
|
+
"splendide",
|
|
7320
|
+
"radieux",
|
|
7321
|
+
"magique",
|
|
7322
|
+
"sublime"
|
|
7323
|
+
],
|
|
7324
|
+
sentimentNegative: [
|
|
7325
|
+
"erreur",
|
|
7326
|
+
"piège",
|
|
7327
|
+
"danger",
|
|
7328
|
+
"éviter",
|
|
7329
|
+
"pire",
|
|
7330
|
+
"arnaque",
|
|
7331
|
+
"catastrophe",
|
|
7332
|
+
"risqué",
|
|
7333
|
+
"menace",
|
|
7334
|
+
"perte"
|
|
7335
|
+
]
|
|
7336
|
+
},
|
|
7337
|
+
en: {
|
|
7338
|
+
authority: [
|
|
7339
|
+
"ultimate",
|
|
7340
|
+
"complete",
|
|
7341
|
+
"definitive",
|
|
7342
|
+
"guide",
|
|
7343
|
+
"expert",
|
|
7344
|
+
"official",
|
|
7345
|
+
"proven",
|
|
7346
|
+
"master",
|
|
7347
|
+
"certified",
|
|
7348
|
+
"best",
|
|
7349
|
+
"top",
|
|
7350
|
+
"authority",
|
|
7351
|
+
"case study",
|
|
7352
|
+
"benchmark",
|
|
7353
|
+
"professional"
|
|
7354
|
+
],
|
|
7355
|
+
urgency: [
|
|
7356
|
+
"instant",
|
|
7357
|
+
"fast",
|
|
7358
|
+
"quick",
|
|
7359
|
+
"now",
|
|
7360
|
+
"today",
|
|
7361
|
+
"2026",
|
|
7362
|
+
"deadline",
|
|
7363
|
+
"last chance",
|
|
7364
|
+
"step-by-step",
|
|
7365
|
+
"overnight",
|
|
7366
|
+
"rapid",
|
|
7367
|
+
"minutes"
|
|
7368
|
+
],
|
|
7369
|
+
value: [
|
|
7370
|
+
"free",
|
|
7371
|
+
"affordable",
|
|
7372
|
+
"guaranteed",
|
|
7373
|
+
"save",
|
|
7374
|
+
"profit",
|
|
7375
|
+
"profitable",
|
|
7376
|
+
"bonus",
|
|
7377
|
+
"cheap",
|
|
7378
|
+
"priceless",
|
|
7379
|
+
"effortless",
|
|
7380
|
+
"lifetime",
|
|
7381
|
+
"budget"
|
|
7382
|
+
],
|
|
7383
|
+
curiosity: [
|
|
7384
|
+
"secret",
|
|
7385
|
+
"secrets",
|
|
7386
|
+
"exclusive",
|
|
7387
|
+
"revealed",
|
|
7388
|
+
"hacks",
|
|
7389
|
+
"tricks",
|
|
7390
|
+
"hacks",
|
|
7391
|
+
"behind the scenes",
|
|
7392
|
+
"uncovered",
|
|
7393
|
+
"surprising",
|
|
7394
|
+
"insider",
|
|
7395
|
+
"confidential",
|
|
7396
|
+
"jaw-dropping"
|
|
7397
|
+
],
|
|
7398
|
+
sentimentPositive: [
|
|
7399
|
+
"amazing",
|
|
7400
|
+
"awesome",
|
|
7401
|
+
"brilliant",
|
|
7402
|
+
"epic",
|
|
7403
|
+
"legendary",
|
|
7404
|
+
"superb",
|
|
7405
|
+
"stunning",
|
|
7406
|
+
"perfect",
|
|
7407
|
+
"powerful",
|
|
7408
|
+
"triumph",
|
|
7409
|
+
"miracle",
|
|
7410
|
+
"flawless"
|
|
7411
|
+
],
|
|
7412
|
+
sentimentNegative: [
|
|
7413
|
+
"mistake",
|
|
7414
|
+
"warning",
|
|
7415
|
+
"deadly",
|
|
7416
|
+
"worst",
|
|
7417
|
+
"danger",
|
|
7418
|
+
"toxic",
|
|
7419
|
+
"destroy",
|
|
7420
|
+
"ruin",
|
|
7421
|
+
"scam",
|
|
7422
|
+
"nightmare"
|
|
7423
|
+
]
|
|
7424
|
+
},
|
|
7425
|
+
es: {
|
|
7426
|
+
authority: ["guía", "completo", "definitivo", "experto", "oficial", "mejor", "mejores", "certificado", "profesional", "maestro"],
|
|
7427
|
+
urgency: ["rápido", "ahora", "inmediato", "2026", "hoy", "urgente", "en minutos", "paso a paso"],
|
|
7428
|
+
value: ["gratis", "gratuito", "económico", "garantizado", "ahorra", "rentable", "oferta", "sin riesgo"],
|
|
7429
|
+
curiosity: ["secreto", "exclusivo", "revelado", "trucos", "increíble", "top", "método", "descubre"],
|
|
7430
|
+
sentimentPositive: ["increíble", "fantástico", "perfecto", "excelente", "maravilloso", "potente", "éxito"],
|
|
7431
|
+
sentimentNegative: ["error", "peligro", "evitar", "peor", "estafa", "trampa", "arruinar"]
|
|
7432
|
+
},
|
|
7433
|
+
de: {
|
|
7434
|
+
authority: ["leitfaden", "komplett", "experte", "offiziell", "beste", "bester", "zertifiziert", "vergleich", "meister"],
|
|
7435
|
+
urgency: ["schnell", "jetzt", "sofort", "2026", "heute", "schritt-für-schritt", "in 5 minuten"],
|
|
7436
|
+
value: ["kostenlos", "gratis", "sparen", "garantiert", "günstig", "rendite", "ohne risiko"],
|
|
7437
|
+
curiosity: ["geheim", "exklusiv", "tipps", "tricks", "enthüllt", "top", "warum", "entdecken"],
|
|
7438
|
+
sentimentPositive: ["perfekt", "genial", "hervorragend", "leistungsstark", "erfolg", "wunderbar"],
|
|
7439
|
+
sentimentNegative: ["fehler", "gefahr", "vermeiden", "schlimmste", "falle", "risiko"]
|
|
7440
|
+
},
|
|
7441
|
+
it: {
|
|
7442
|
+
authority: ["guida", "completa", "esperto", "ufficiale", "migliore", "migliori", "certificato", "professionale"],
|
|
7443
|
+
urgency: ["veloce", "ora", "subito", "2026", "oggi", "passo dopo passo", "in pochi minuti"],
|
|
7444
|
+
value: ["gratis", "gratuito", "economico", "garantito", "risparmio", "conveniente", "senza rischi"],
|
|
7445
|
+
curiosity: ["segreto", "esclusivo", "trucchi", "rivelato", "top", "metodo", "scopri"],
|
|
7446
|
+
sentimentPositive: ["perfetto", "fantastico", "eccellente", "potente", "successo", "incredibile"],
|
|
7447
|
+
sentimentNegative: ["errore", "pericolo", "evitare", "peggiore", "truffa", "trappola"]
|
|
7448
|
+
},
|
|
7449
|
+
nl: {
|
|
7450
|
+
authority: ["gids", "compleet", "expert", "officieel", "beste", "gecertificeerd", "professioneel"],
|
|
7451
|
+
urgency: ["snel", "nu", "direct", "2026", "vandaag", "stap voor stap"],
|
|
7452
|
+
value: ["gratis", "goedkoop", "gegarandeerd", "bespaar", "rendement", "zonder risico"],
|
|
7453
|
+
curiosity: ["geheim", "exclusief", "tips", "onthuld", "top", "ontdek"],
|
|
7454
|
+
sentimentPositive: ["perfect", "geweldig", "uitstekend", "krachtig", "succes"],
|
|
7455
|
+
sentimentNegative: ["fout", "gevaar", "vermijden", "slechtste", "valkuil"]
|
|
7456
|
+
},
|
|
7457
|
+
pt: {
|
|
7458
|
+
authority: ["guia", "completo", "definitivo", "especialista", "oficial", "melhor", "melhores", "certificado"],
|
|
7459
|
+
urgency: ["rápido", "agora", "imediato", "2026", "hoje", "passo a passo"],
|
|
7460
|
+
value: ["grátis", "gratuito", "econômico", "garantido", "economize", "sem risco"],
|
|
7461
|
+
curiosity: ["segredo", "exclusivo", "revelado", "truques", "top", "descubra"],
|
|
7462
|
+
sentimentPositive: ["incrível", "perfeito", "excelente", "poderoso", "sucesso"],
|
|
7463
|
+
sentimentNegative: ["erro", "perigo", "evitar", "pior", "golpe"]
|
|
7464
|
+
}
|
|
7465
|
+
};
|
|
7466
|
+
|
|
7467
|
+
class PowerWordsPsychologyEngine {
|
|
7468
|
+
static analyzeTitlePsychology(title, lang = "fr") {
|
|
7469
|
+
const cleanTitle = title.toLowerCase();
|
|
7470
|
+
const dict = MULTILINGUAL_POWER_WORDS[lang] || MULTILINGUAL_POWER_WORDS.fr;
|
|
7471
|
+
const detectedPowerWords = [];
|
|
7472
|
+
let score = 30;
|
|
7473
|
+
const hasAuthority = dict.authority.some((w) => {
|
|
7474
|
+
if (cleanTitle.includes(w)) {
|
|
7475
|
+
detectedPowerWords.push(w);
|
|
7476
|
+
return true;
|
|
7477
|
+
}
|
|
7478
|
+
return false;
|
|
7479
|
+
});
|
|
7480
|
+
if (hasAuthority)
|
|
7481
|
+
score += 20;
|
|
7482
|
+
const hasUrgency = dict.urgency.some((w) => {
|
|
7483
|
+
if (cleanTitle.includes(w)) {
|
|
7484
|
+
detectedPowerWords.push(w);
|
|
7485
|
+
return true;
|
|
7486
|
+
}
|
|
7487
|
+
return false;
|
|
7488
|
+
});
|
|
7489
|
+
if (hasUrgency)
|
|
7490
|
+
score += 15;
|
|
7491
|
+
const hasValue = dict.value.some((w) => {
|
|
7492
|
+
if (cleanTitle.includes(w)) {
|
|
7493
|
+
detectedPowerWords.push(w);
|
|
7494
|
+
return true;
|
|
7495
|
+
}
|
|
7496
|
+
return false;
|
|
7497
|
+
});
|
|
7498
|
+
if (hasValue)
|
|
7499
|
+
score += 15;
|
|
7500
|
+
const hasCuriosity = dict.curiosity.some((w) => {
|
|
7501
|
+
if (cleanTitle.includes(w)) {
|
|
7502
|
+
detectedPowerWords.push(w);
|
|
7503
|
+
return true;
|
|
7504
|
+
}
|
|
7505
|
+
return false;
|
|
7506
|
+
});
|
|
7507
|
+
if (hasCuriosity)
|
|
7508
|
+
score += 10;
|
|
7509
|
+
const hasNumber = /\d+/.test(title);
|
|
7510
|
+
if (hasNumber)
|
|
7511
|
+
score += 10;
|
|
7512
|
+
const currentYear = new Date().getFullYear().toString();
|
|
7513
|
+
const hasYear = title.includes(currentYear) || title.includes("2026");
|
|
7514
|
+
let sentiment = "neutre";
|
|
7515
|
+
const hasPositive = dict.sentimentPositive.some((w) => cleanTitle.includes(w));
|
|
7516
|
+
const hasNegative = dict.sentimentNegative.some((w) => cleanTitle.includes(w));
|
|
7517
|
+
if (hasPositive) {
|
|
7518
|
+
sentiment = "positif";
|
|
7519
|
+
} else if (hasNegative) {
|
|
7520
|
+
sentiment = "negatif";
|
|
7521
|
+
}
|
|
7522
|
+
const recommendations = [];
|
|
7523
|
+
if (!detectedPowerWords.length) {
|
|
7524
|
+
recommendations.push("Ajoutez au moins un mot d'impact (*Power Word*) comme 'Guide Complet', 'Meilleur' ou 'Ultime'.");
|
|
7525
|
+
}
|
|
7526
|
+
if (!hasNumber) {
|
|
7527
|
+
recommendations.push("Intégrez un chiffre ou l'année en cours (ex: '7 astuces', '2026') pour booster le taux de clic de +36%.");
|
|
7528
|
+
}
|
|
7529
|
+
if (title.length < 35) {
|
|
7530
|
+
recommendations.push("Titre trop court : enrichissez votre promesse de valeur pour occuper les 600px de la SERP Google.");
|
|
7531
|
+
}
|
|
7532
|
+
const suggestedTitles = [];
|
|
7533
|
+
if (lang === "fr") {
|
|
7534
|
+
suggestedTitles.push(`${title} : Guide Ultime 2026`);
|
|
7535
|
+
suggestedTitles.push(`Les 5 Meilleurs ${title} (Comparatif & Avis)`);
|
|
7536
|
+
suggestedTitles.push(`${title} — Solution Rapide & Complète`);
|
|
7537
|
+
} else {
|
|
7538
|
+
suggestedTitles.push(`${title}: The Ultimate 2026 Guide`);
|
|
7539
|
+
suggestedTitles.push(`Top 5 Best ${title} (Full Review & Comparison)`);
|
|
7540
|
+
suggestedTitles.push(`${title} — Proven & Fast Method`);
|
|
7541
|
+
}
|
|
7542
|
+
return {
|
|
7543
|
+
score: Math.min(100, score),
|
|
7544
|
+
powerWordsDetected: Array.from(new Set(detectedPowerWords)),
|
|
7545
|
+
sentiment,
|
|
7546
|
+
hasNumber,
|
|
7547
|
+
hasYear,
|
|
7548
|
+
hasCuriosityTrigger: hasCuriosity,
|
|
7549
|
+
hasUrgencyTrigger: hasUrgency,
|
|
7550
|
+
hasAuthorityTrigger: hasAuthority,
|
|
7551
|
+
recommendations,
|
|
7552
|
+
suggestedTitles
|
|
7553
|
+
};
|
|
7554
|
+
}
|
|
7555
|
+
static enrichProgrammaticTitle(service, locationOrCompetitor, type = "geo", lang = "fr") {
|
|
7556
|
+
const year = "2026";
|
|
7557
|
+
if (lang === "fr") {
|
|
7558
|
+
if (type === "geo") {
|
|
7559
|
+
return `Meilleur ${service} à ${locationOrCompetitor} : Guide Complet ${year}`;
|
|
7560
|
+
} else if (type === "vs") {
|
|
7561
|
+
return `${service} vs ${locationOrCompetitor} : Le Comparatif Ultime & Avis`;
|
|
7562
|
+
} else {
|
|
7563
|
+
return `Top 5 Alternatives à ${locationOrCompetitor} : Comparatif ${year}`;
|
|
7564
|
+
}
|
|
7565
|
+
} else if (lang === "en") {
|
|
7566
|
+
if (type === "geo") {
|
|
7567
|
+
return `Best ${service} in ${locationOrCompetitor}: Ultimate ${year} Guide`;
|
|
7568
|
+
} else if (type === "vs") {
|
|
7569
|
+
return `${service} vs ${locationOrCompetitor}: Definitive Comparison`;
|
|
7570
|
+
} else {
|
|
7571
|
+
return `Top 5 Alternatives to ${locationOrCompetitor} (${year} Review)`;
|
|
7572
|
+
}
|
|
7573
|
+
} else if (lang === "es") {
|
|
7574
|
+
if (type === "geo") {
|
|
7575
|
+
return `Mejor ${service} en ${locationOrCompetitor}: Guía Completa ${year}`;
|
|
7576
|
+
} else {
|
|
7577
|
+
return `${service} vs ${locationOrCompetitor}: Comparativa Definitiva`;
|
|
7578
|
+
}
|
|
7579
|
+
} else if (lang === "de") {
|
|
7580
|
+
return `Beste ${service} in ${locationOrCompetitor}: Kompletter Leitfaden ${year}`;
|
|
7581
|
+
} else {
|
|
7582
|
+
return `${service} in ${locationOrCompetitor} (${year})`;
|
|
7583
|
+
}
|
|
7584
|
+
}
|
|
7585
|
+
}
|
|
7235
7586
|
// src/index.ts
|
|
7236
7587
|
function createLynxSeoEngine(config) {
|
|
7237
7588
|
return new LynxSeoEngine(config);
|
|
@@ -7310,12 +7661,14 @@ export {
|
|
|
7310
7661
|
RealReviewsSyncEngine,
|
|
7311
7662
|
RankMathParityEngine,
|
|
7312
7663
|
PseoMatrixEngine,
|
|
7664
|
+
PowerWordsPsychologyEngine,
|
|
7313
7665
|
PSEO_AGENT_SYSTEM_PROMPT,
|
|
7314
7666
|
OgImageGenerator,
|
|
7315
7667
|
NGramDensityAnalyzer,
|
|
7316
7668
|
McpSeoServerHub,
|
|
7317
7669
|
MasterMarketingEngine,
|
|
7318
7670
|
MULTILINGUAL_STOP_WORDS,
|
|
7671
|
+
MULTILINGUAL_POWER_WORDS,
|
|
7319
7672
|
MULTILINGUAL_DISCLAIMERS,
|
|
7320
7673
|
MULTILINGUAL_BANNED_DISPARAGING_WORDS,
|
|
7321
7674
|
LynxSeoEngine,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🧠 Multilingual Power Words & Click Psychology Engine
|
|
3
|
+
* High-Converting CTR Optimizers & Sentiment Analysis across FR, EN, ES, DE, IT
|
|
4
|
+
*/
|
|
5
|
+
export type LanguageCode = "fr" | "en" | "es" | "de" | "it" | "nl" | "pt";
|
|
6
|
+
export interface PsychologyAnalysisResult {
|
|
7
|
+
score: number;
|
|
8
|
+
powerWordsDetected: string[];
|
|
9
|
+
sentiment: "positif" | "negatif" | "neutre";
|
|
10
|
+
hasNumber: boolean;
|
|
11
|
+
hasYear: boolean;
|
|
12
|
+
hasCuriosityTrigger: boolean;
|
|
13
|
+
hasUrgencyTrigger: boolean;
|
|
14
|
+
hasAuthorityTrigger: boolean;
|
|
15
|
+
recommendations: string[];
|
|
16
|
+
suggestedTitles: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare const MULTILINGUAL_POWER_WORDS: Record<LanguageCode, {
|
|
19
|
+
authority: string[];
|
|
20
|
+
urgency: string[];
|
|
21
|
+
value: string[];
|
|
22
|
+
curiosity: string[];
|
|
23
|
+
sentimentPositive: string[];
|
|
24
|
+
sentimentNegative: string[];
|
|
25
|
+
}>;
|
|
26
|
+
export declare class PowerWordsPsychologyEngine {
|
|
27
|
+
/**
|
|
28
|
+
* Analyzes headline/title psychology, CTR triggers, sentiment, and Google SERP potential
|
|
29
|
+
*/
|
|
30
|
+
static analyzeTitlePsychology(title: string, lang?: LanguageCode): PsychologyAnalysisResult;
|
|
31
|
+
/**
|
|
32
|
+
* Automatically enriches a programmatic title with high-converting click psychology power words
|
|
33
|
+
*/
|
|
34
|
+
static enrichProgrammaticTitle(service: string, locationOrCompetitor: string, type?: "geo" | "vs" | "alt", lang?: LanguageCode): string;
|
|
35
|
+
}
|
package/package.json
CHANGED
package/src/extended-schemas.ts
CHANGED
|
@@ -278,7 +278,7 @@ export class ExtendedSchemaGraphBuilder {
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
/**
|
|
281
|
-
* 7. AggregateRating (Google Gold Stars in SERPs) -
|
|
281
|
+
* 7. AggregateRating (Google Gold Stars in SERPs) - Strictly Dynamic (No Fake Defaults)
|
|
282
282
|
*/
|
|
283
283
|
static buildAggregateRating(opts: {
|
|
284
284
|
ratingValue?: number;
|
|
@@ -286,11 +286,15 @@ export class ExtendedSchemaGraphBuilder {
|
|
|
286
286
|
bestRating?: number;
|
|
287
287
|
worstRating?: number;
|
|
288
288
|
itemReviewedName: string;
|
|
289
|
-
}): Record<string, unknown> {
|
|
289
|
+
}): Record<string, unknown> | null {
|
|
290
|
+
// Google Strict Compliance: Never emit fake or default hardcoded reviews
|
|
291
|
+
if (!opts.ratingValue || !opts.reviewCount || opts.reviewCount <= 0) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
290
294
|
return {
|
|
291
295
|
"@type": "AggregateRating",
|
|
292
|
-
ratingValue: opts.ratingValue
|
|
293
|
-
reviewCount: opts.reviewCount
|
|
296
|
+
ratingValue: opts.ratingValue,
|
|
297
|
+
reviewCount: opts.reviewCount,
|
|
294
298
|
bestRating: opts.bestRating ?? 5,
|
|
295
299
|
worstRating: opts.worstRating ?? 1,
|
|
296
300
|
itemReviewed: {
|
package/src/index.ts
CHANGED
|
@@ -65,6 +65,7 @@ export * from "./team-rbac";
|
|
|
65
65
|
export * from "./real-reviews-sync";
|
|
66
66
|
export * from "./google-business-profile";
|
|
67
67
|
export * from "./video-youtube-analyzer";
|
|
68
|
+
export * from "./power-words-psychology";
|
|
68
69
|
|
|
69
70
|
import { LynxSeoEngine, type EngineConfig } from "./engine";
|
|
70
71
|
import { ApiKeyGuardian } from "./auth-key";
|
|
@@ -46,8 +46,8 @@ export class OgImageGenerator {
|
|
|
46
46
|
const badge = opts.badgeText || "OFFICIAL";
|
|
47
47
|
const title = opts.title.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
48
48
|
const loc = opts.locationName ? `📍 ${opts.locationName}` : "⚡ Instant Cloud Setup";
|
|
49
|
-
const rating = opts.ratingValue
|
|
50
|
-
const reviews = opts.reviewCount
|
|
49
|
+
const rating = opts.ratingValue;
|
|
50
|
+
const reviews = opts.reviewCount;
|
|
51
51
|
const accent = opts.brandColor || "#6366F1";
|
|
52
52
|
|
|
53
53
|
return `<svg width="1200" height="630" viewBox="0 0 1200 630" xmlns="http://www.w3.org/2000/svg">
|
|
@@ -91,12 +91,12 @@ export class OgImageGenerator {
|
|
|
91
91
|
${title.length > 38 ? `<tspan x="80" dy="68">${title.slice(38, 80)}</tspan>` : ""}
|
|
92
92
|
</text>
|
|
93
93
|
|
|
94
|
-
<!-- Trust Stars & Social Proof -->
|
|
95
|
-
|
|
94
|
+
<!-- Trust Stars & Social Proof (Only if real verified reviews exist) -->
|
|
95
|
+
${rating && reviews ? `<g transform="translate(80, 470)">
|
|
96
96
|
<text x="0" y="32" fill="#FBBF24" font-size="24">★★★★★</text>
|
|
97
97
|
<text x="140" y="30" fill="#F8FAFC" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="20" font-weight="800">${rating} / 5</text>
|
|
98
98
|
<text x="210" y="30" fill="#64748B" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="500">(${reviews.toLocaleString()} verified reviews)</text>
|
|
99
|
-
</g
|
|
99
|
+
</g>` : ""}
|
|
100
100
|
|
|
101
101
|
<!-- Footer Brand -->
|
|
102
102
|
<g transform="translate(80, 540)">
|