@lynxflow/seo-engine 1.3.0 → 1.4.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.
- package/dist/engine.d.ts +2 -0
- package/dist/index.js +41 -4
- package/dist/index.mjs +41 -4
- package/package.json +1 -1
- package/src/engine.ts +45 -4
package/dist/engine.d.ts
CHANGED
|
@@ -63,6 +63,8 @@ export declare class LynxSeoEngine {
|
|
|
63
63
|
private buildIndustryPage;
|
|
64
64
|
private buildRolePage;
|
|
65
65
|
private buildIntegrationPage;
|
|
66
|
+
private buildUseCasePage;
|
|
67
|
+
private buildToolPage;
|
|
66
68
|
private assemblePage;
|
|
67
69
|
/**
|
|
68
70
|
* Returns the exact count of distinct unique programmatic pages currently active.
|
package/dist/index.js
CHANGED
|
@@ -1453,12 +1453,14 @@ class LynxSeoEngine {
|
|
|
1453
1453
|
return this.buildRolePage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
1454
1454
|
}
|
|
1455
1455
|
if ((pathParts[0] === "cas-usage" || pathParts[0] === "use-cases") && pathParts.length >= 2) {
|
|
1456
|
-
const
|
|
1457
|
-
|
|
1456
|
+
const raw = pathParts[1].replace(/-(pour|for)-/i, "-");
|
|
1457
|
+
const { service, remainder } = detectServiceFromSlug(raw);
|
|
1458
|
+
return this.buildUseCasePage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
1458
1459
|
}
|
|
1459
1460
|
if ((pathParts[0] === "outils" || pathParts[0] === "tools") && pathParts.length >= 2) {
|
|
1460
|
-
const
|
|
1461
|
-
|
|
1461
|
+
const raw = pathParts[1].replace(/^simulateur-roi-/i, "");
|
|
1462
|
+
const { service, remainder } = detectServiceFromSlug(raw);
|
|
1463
|
+
return this.buildToolPage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
1462
1464
|
}
|
|
1463
1465
|
return this.buildGeoPage(defaultService, "FR", "Paris", domain, t0, locale, cleanPath);
|
|
1464
1466
|
}
|
|
@@ -1600,6 +1602,41 @@ class LynxSeoEngine {
|
|
|
1600
1602
|
t0
|
|
1601
1603
|
});
|
|
1602
1604
|
}
|
|
1605
|
+
buildUseCasePage(service, topic, domain, t0, locale = "fr", path = `cas-usage/${topic.toLowerCase().replace(/\s+/g, "-")}`) {
|
|
1606
|
+
const topicName = topic.charAt(0).toUpperCase() + topic.slice(1);
|
|
1607
|
+
const title = `${service.name} pour ${topicName} — ${this.config.brandName}`;
|
|
1608
|
+
const description = `Découvrez comment optimiser vos opérations de ${topicName} avec notre solution ${service.name}. Déploiement en 10 minutes.`;
|
|
1609
|
+
const h1 = `${service.name} : ${topicName}`;
|
|
1610
|
+
const directAnswer = `${this.config.brandName} (${service.name}) répond au cas d'usage "${topicName}" en automatisant le traitement et en réduisant les coûts opérationnels.`;
|
|
1611
|
+
return this.assemblePage({
|
|
1612
|
+
url: `${domain}/${path}`,
|
|
1613
|
+
title,
|
|
1614
|
+
description,
|
|
1615
|
+
h1,
|
|
1616
|
+
directAnswer,
|
|
1617
|
+
service,
|
|
1618
|
+
locale,
|
|
1619
|
+
path,
|
|
1620
|
+
t0
|
|
1621
|
+
});
|
|
1622
|
+
}
|
|
1623
|
+
buildToolPage(service, tool, domain, t0, locale = "fr", path = `outils/${tool.toLowerCase().replace(/\s+/g, "-")}`) {
|
|
1624
|
+
const title = `Simulateur & Calculateur ROI : ${service.name} — ${this.config.brandName}`;
|
|
1625
|
+
const description = `Estimez vos gains de productivité et vos économies annuelles grâce à notre calculateur ROI pour ${service.name}.`;
|
|
1626
|
+
const h1 = `Simulateur de Rentabilité & ROI : ${service.name}`;
|
|
1627
|
+
const directAnswer = `Utilisez le simulateur ROI de ${this.config.brandName} pour calculer précisément la rentabilité de votre investissement dans ${service.name} (amortissement en moins de 30 jours).`;
|
|
1628
|
+
return this.assemblePage({
|
|
1629
|
+
url: `${domain}/${path}`,
|
|
1630
|
+
title,
|
|
1631
|
+
description,
|
|
1632
|
+
h1,
|
|
1633
|
+
directAnswer,
|
|
1634
|
+
service,
|
|
1635
|
+
locale,
|
|
1636
|
+
path,
|
|
1637
|
+
t0
|
|
1638
|
+
});
|
|
1639
|
+
}
|
|
1603
1640
|
assemblePage(opts) {
|
|
1604
1641
|
const dict = getDictionary(opts.locale);
|
|
1605
1642
|
const domain = this.config.domain.replace(/\/$/, "");
|
package/dist/index.mjs
CHANGED
|
@@ -1453,12 +1453,14 @@ class LynxSeoEngine {
|
|
|
1453
1453
|
return this.buildRolePage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
1454
1454
|
}
|
|
1455
1455
|
if ((pathParts[0] === "cas-usage" || pathParts[0] === "use-cases") && pathParts.length >= 2) {
|
|
1456
|
-
const
|
|
1457
|
-
|
|
1456
|
+
const raw = pathParts[1].replace(/-(pour|for)-/i, "-");
|
|
1457
|
+
const { service, remainder } = detectServiceFromSlug(raw);
|
|
1458
|
+
return this.buildUseCasePage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
1458
1459
|
}
|
|
1459
1460
|
if ((pathParts[0] === "outils" || pathParts[0] === "tools") && pathParts.length >= 2) {
|
|
1460
|
-
const
|
|
1461
|
-
|
|
1461
|
+
const raw = pathParts[1].replace(/^simulateur-roi-/i, "");
|
|
1462
|
+
const { service, remainder } = detectServiceFromSlug(raw);
|
|
1463
|
+
return this.buildToolPage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
1462
1464
|
}
|
|
1463
1465
|
return this.buildGeoPage(defaultService, "FR", "Paris", domain, t0, locale, cleanPath);
|
|
1464
1466
|
}
|
|
@@ -1600,6 +1602,41 @@ class LynxSeoEngine {
|
|
|
1600
1602
|
t0
|
|
1601
1603
|
});
|
|
1602
1604
|
}
|
|
1605
|
+
buildUseCasePage(service, topic, domain, t0, locale = "fr", path = `cas-usage/${topic.toLowerCase().replace(/\s+/g, "-")}`) {
|
|
1606
|
+
const topicName = topic.charAt(0).toUpperCase() + topic.slice(1);
|
|
1607
|
+
const title = `${service.name} pour ${topicName} — ${this.config.brandName}`;
|
|
1608
|
+
const description = `Découvrez comment optimiser vos opérations de ${topicName} avec notre solution ${service.name}. Déploiement en 10 minutes.`;
|
|
1609
|
+
const h1 = `${service.name} : ${topicName}`;
|
|
1610
|
+
const directAnswer = `${this.config.brandName} (${service.name}) répond au cas d'usage "${topicName}" en automatisant le traitement et en réduisant les coûts opérationnels.`;
|
|
1611
|
+
return this.assemblePage({
|
|
1612
|
+
url: `${domain}/${path}`,
|
|
1613
|
+
title,
|
|
1614
|
+
description,
|
|
1615
|
+
h1,
|
|
1616
|
+
directAnswer,
|
|
1617
|
+
service,
|
|
1618
|
+
locale,
|
|
1619
|
+
path,
|
|
1620
|
+
t0
|
|
1621
|
+
});
|
|
1622
|
+
}
|
|
1623
|
+
buildToolPage(service, tool, domain, t0, locale = "fr", path = `outils/${tool.toLowerCase().replace(/\s+/g, "-")}`) {
|
|
1624
|
+
const title = `Simulateur & Calculateur ROI : ${service.name} — ${this.config.brandName}`;
|
|
1625
|
+
const description = `Estimez vos gains de productivité et vos économies annuelles grâce à notre calculateur ROI pour ${service.name}.`;
|
|
1626
|
+
const h1 = `Simulateur de Rentabilité & ROI : ${service.name}`;
|
|
1627
|
+
const directAnswer = `Utilisez le simulateur ROI de ${this.config.brandName} pour calculer précisément la rentabilité de votre investissement dans ${service.name} (amortissement en moins de 30 jours).`;
|
|
1628
|
+
return this.assemblePage({
|
|
1629
|
+
url: `${domain}/${path}`,
|
|
1630
|
+
title,
|
|
1631
|
+
description,
|
|
1632
|
+
h1,
|
|
1633
|
+
directAnswer,
|
|
1634
|
+
service,
|
|
1635
|
+
locale,
|
|
1636
|
+
path,
|
|
1637
|
+
t0
|
|
1638
|
+
});
|
|
1639
|
+
}
|
|
1603
1640
|
assemblePage(opts) {
|
|
1604
1641
|
const dict = getDictionary(opts.locale);
|
|
1605
1642
|
const domain = this.config.domain.replace(/\/$/, "");
|
package/package.json
CHANGED
package/src/engine.ts
CHANGED
|
@@ -252,14 +252,16 @@ export class LynxSeoEngine {
|
|
|
252
252
|
|
|
253
253
|
// 7. Use Cases: /cas-usage/{topic}
|
|
254
254
|
if ((pathParts[0] === "cas-usage" || pathParts[0] === "use-cases") && pathParts.length >= 2) {
|
|
255
|
-
const
|
|
256
|
-
|
|
255
|
+
const raw = pathParts[1].replace(/-(pour|for)-/i, "-");
|
|
256
|
+
const { service, remainder } = detectServiceFromSlug(raw);
|
|
257
|
+
return this.buildUseCasePage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
257
258
|
}
|
|
258
259
|
|
|
259
260
|
// 8. Tools / Calculators: /outils/{tool}
|
|
260
261
|
if ((pathParts[0] === "outils" || pathParts[0] === "tools") && pathParts.length >= 2) {
|
|
261
|
-
const
|
|
262
|
-
|
|
262
|
+
const raw = pathParts[1].replace(/^simulateur-roi-/i, "");
|
|
263
|
+
const { service, remainder } = detectServiceFromSlug(raw);
|
|
264
|
+
return this.buildToolPage(service, remainder.replace(/-/g, " "), domain, t0, locale, cleanPath);
|
|
263
265
|
}
|
|
264
266
|
|
|
265
267
|
// Fallback: local geo
|
|
@@ -434,6 +436,45 @@ export class LynxSeoEngine {
|
|
|
434
436
|
});
|
|
435
437
|
}
|
|
436
438
|
|
|
439
|
+
private buildUseCasePage(service: LynxServiceDefinition, topic: string, domain: string, t0: number, locale = "fr", path = `cas-usage/${topic.toLowerCase().replace(/\s+/g, "-")}`): LynxResolvedPage {
|
|
440
|
+
const topicName = topic.charAt(0).toUpperCase() + topic.slice(1);
|
|
441
|
+
const title = `${service.name} pour ${topicName} — ${this.config.brandName}`;
|
|
442
|
+
const description = `Découvrez comment optimiser vos opérations de ${topicName} avec notre solution ${service.name}. Déploiement en 10 minutes.`;
|
|
443
|
+
const h1 = `${service.name} : ${topicName}`;
|
|
444
|
+
const directAnswer = `${this.config.brandName} (${service.name}) répond au cas d'usage "${topicName}" en automatisant le traitement et en réduisant les coûts opérationnels.`;
|
|
445
|
+
|
|
446
|
+
return this.assemblePage({
|
|
447
|
+
url: `${domain}/${path}`,
|
|
448
|
+
title,
|
|
449
|
+
description,
|
|
450
|
+
h1,
|
|
451
|
+
directAnswer,
|
|
452
|
+
service,
|
|
453
|
+
locale,
|
|
454
|
+
path,
|
|
455
|
+
t0,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
private buildToolPage(service: LynxServiceDefinition, tool: string, domain: string, t0: number, locale = "fr", path = `outils/${tool.toLowerCase().replace(/\s+/g, "-")}`): LynxResolvedPage {
|
|
460
|
+
const title = `Simulateur & Calculateur ROI : ${service.name} — ${this.config.brandName}`;
|
|
461
|
+
const description = `Estimez vos gains de productivité et vos économies annuelles grâce à notre calculateur ROI pour ${service.name}.`;
|
|
462
|
+
const h1 = `Simulateur de Rentabilité & ROI : ${service.name}`;
|
|
463
|
+
const directAnswer = `Utilisez le simulateur ROI de ${this.config.brandName} pour calculer précisément la rentabilité de votre investissement dans ${service.name} (amortissement en moins de 30 jours).`;
|
|
464
|
+
|
|
465
|
+
return this.assemblePage({
|
|
466
|
+
url: `${domain}/${path}`,
|
|
467
|
+
title,
|
|
468
|
+
description,
|
|
469
|
+
h1,
|
|
470
|
+
directAnswer,
|
|
471
|
+
service,
|
|
472
|
+
locale,
|
|
473
|
+
path,
|
|
474
|
+
t0,
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
|
|
437
478
|
private assemblePage(opts: { url: string; title: string; description: string; h1: string; directAnswer: string; service: LynxServiceDefinition; locale: string; path: string; t0: number }): LynxResolvedPage {
|
|
438
479
|
const dict = getDictionary(opts.locale);
|
|
439
480
|
const domain = this.config.domain.replace(/\/$/, "");
|