aeo.js 0.0.6 → 0.0.8

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.
Files changed (67) hide show
  1. package/dist/angular.d.mts +1 -1
  2. package/dist/angular.d.ts +1 -1
  3. package/dist/angular.js +65 -11
  4. package/dist/angular.js.map +1 -1
  5. package/dist/angular.mjs +65 -11
  6. package/dist/angular.mjs.map +1 -1
  7. package/dist/astro.d.mts +1 -1
  8. package/dist/astro.d.ts +1 -1
  9. package/dist/astro.js +74 -16
  10. package/dist/astro.js.map +1 -1
  11. package/dist/astro.mjs +74 -16
  12. package/dist/astro.mjs.map +1 -1
  13. package/dist/cli.js +80 -25
  14. package/dist/cli.js.map +1 -1
  15. package/dist/cli.mjs +80 -25
  16. package/dist/cli.mjs.map +1 -1
  17. package/dist/index.d.mts +2 -2
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +85 -27
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +85 -27
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/next.d.mts +1 -1
  24. package/dist/next.d.ts +1 -1
  25. package/dist/next.js +65 -11
  26. package/dist/next.js.map +1 -1
  27. package/dist/next.mjs +65 -11
  28. package/dist/next.mjs.map +1 -1
  29. package/dist/nuxt.d.mts +1 -1
  30. package/dist/nuxt.d.ts +1 -1
  31. package/dist/nuxt.js +65 -11
  32. package/dist/nuxt.js.map +1 -1
  33. package/dist/nuxt.mjs +65 -11
  34. package/dist/nuxt.mjs.map +1 -1
  35. package/dist/react.d.mts +1 -1
  36. package/dist/react.d.ts +1 -1
  37. package/dist/react.js +61 -9
  38. package/dist/react.js.map +1 -1
  39. package/dist/react.mjs +61 -9
  40. package/dist/react.mjs.map +1 -1
  41. package/dist/{types-Cn_Qbkmg.d.mts → types-BlLNcw-X.d.mts} +2 -0
  42. package/dist/{types-Cn_Qbkmg.d.ts → types-BlLNcw-X.d.ts} +2 -0
  43. package/dist/vite.d.mts +1 -1
  44. package/dist/vite.d.ts +1 -1
  45. package/dist/vite.js +90 -18
  46. package/dist/vite.js.map +1 -1
  47. package/dist/vite.mjs +90 -18
  48. package/dist/vite.mjs.map +1 -1
  49. package/dist/vue.d.mts +1 -1
  50. package/dist/vue.d.ts +1 -1
  51. package/dist/vue.js +61 -9
  52. package/dist/vue.js.map +1 -1
  53. package/dist/vue.mjs +61 -9
  54. package/dist/vue.mjs.map +1 -1
  55. package/dist/webpack.d.mts +1 -1
  56. package/dist/webpack.d.ts +1 -1
  57. package/dist/webpack.js +65 -11
  58. package/dist/webpack.js.map +1 -1
  59. package/dist/webpack.mjs +65 -11
  60. package/dist/webpack.mjs.map +1 -1
  61. package/dist/widget.d.mts +1 -1
  62. package/dist/widget.d.ts +1 -1
  63. package/dist/widget.js +61 -9
  64. package/dist/widget.js.map +1 -1
  65. package/dist/widget.mjs +61 -9
  66. package/dist/widget.mjs.map +1 -1
  67. package/package.json +1 -1
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FrameworkInfo, R as ResolvedAeoConfig, A as AeoConfig, P as PageEntry } from './types-Cn_Qbkmg.mjs';
2
- export { a as AIIndexEntry, b as AeoManifest, D as DocEntry, c as FrameworkType, M as ManifestEntry, d as MarkdownFile } from './types-Cn_Qbkmg.mjs';
1
+ import { F as FrameworkInfo, R as ResolvedAeoConfig, A as AeoConfig, P as PageEntry } from './types-BlLNcw-X.mjs';
2
+ export { a as AIIndexEntry, b as AeoManifest, D as DocEntry, c as FrameworkType, M as ManifestEntry, d as MarkdownFile } from './types-BlLNcw-X.mjs';
3
3
 
4
4
  declare function detectFramework(projectRoot?: string): FrameworkInfo;
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FrameworkInfo, R as ResolvedAeoConfig, A as AeoConfig, P as PageEntry } from './types-Cn_Qbkmg.js';
2
- export { a as AIIndexEntry, b as AeoManifest, D as DocEntry, c as FrameworkType, M as ManifestEntry, d as MarkdownFile } from './types-Cn_Qbkmg.js';
1
+ import { F as FrameworkInfo, R as ResolvedAeoConfig, A as AeoConfig, P as PageEntry } from './types-BlLNcw-X.js';
2
+ export { a as AIIndexEntry, b as AeoManifest, D as DocEntry, c as FrameworkType, M as ManifestEntry, d as MarkdownFile } from './types-BlLNcw-X.js';
3
3
 
4
4
  declare function detectFramework(projectRoot?: string): FrameworkInfo;
5
5
 
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ function validateConfig(config) {
24
24
  return warnings;
25
25
  }
26
26
  function resolveConfig(config = {}) {
27
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M;
27
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N;
28
28
  const frameworkInfo = detectFramework();
29
29
  return {
30
30
  title: config.title || "My Site",
@@ -68,15 +68,16 @@ function resolveConfig(config = {}) {
68
68
  widget: {
69
69
  enabled: ((_A = config.widget) == null ? void 0 : _A.enabled) !== false,
70
70
  position: ((_B = config.widget) == null ? void 0 : _B.position) || "bottom-right",
71
+ size: ((_C = config.widget) == null ? void 0 : _C.size) || "default",
71
72
  theme: {
72
- background: ((_D = (_C = config.widget) == null ? void 0 : _C.theme) == null ? void 0 : _D.background) || "rgba(18, 18, 24, 0.9)",
73
- text: ((_F = (_E = config.widget) == null ? void 0 : _E.theme) == null ? void 0 : _F.text) || "#C0C0C5",
74
- accent: ((_H = (_G = config.widget) == null ? void 0 : _G.theme) == null ? void 0 : _H.accent) || "#E8E8EA",
75
- badge: ((_J = (_I = config.widget) == null ? void 0 : _I.theme) == null ? void 0 : _J.badge) || "#4ADE80"
73
+ background: ((_E = (_D = config.widget) == null ? void 0 : _D.theme) == null ? void 0 : _E.background) || "rgba(18, 18, 24, 0.9)",
74
+ text: ((_G = (_F = config.widget) == null ? void 0 : _F.theme) == null ? void 0 : _G.text) || "#C0C0C5",
75
+ accent: ((_I = (_H = config.widget) == null ? void 0 : _H.theme) == null ? void 0 : _I.accent) || "#E8E8EA",
76
+ badge: ((_K = (_J = config.widget) == null ? void 0 : _J.theme) == null ? void 0 : _K.badge) || "#4ADE80"
76
77
  },
77
- humanLabel: ((_K = config.widget) == null ? void 0 : _K.humanLabel) || "Human",
78
- aiLabel: ((_L = config.widget) == null ? void 0 : _L.aiLabel) || "AI",
79
- showBadge: ((_M = config.widget) == null ? void 0 : _M.showBadge) !== false
78
+ humanLabel: ((_L = config.widget) == null ? void 0 : _L.humanLabel) || "Human",
79
+ aiLabel: ((_M = config.widget) == null ? void 0 : _M.aiLabel) || "AI",
80
+ showBadge: ((_N = config.widget) == null ? void 0 : _N.showBadge) !== false
80
81
  }
81
82
  };
82
83
  }
@@ -269,10 +270,19 @@ function generateRobotsTxt(config) {
269
270
  }
270
271
  lines.push("# Default for all other bots");
271
272
  lines.push("User-agent: *");
272
- lines.push("Allow: /");
273
+ for (const path of config.robots.allow.length > 0 ? config.robots.allow : ["/"]) {
274
+ lines.push(`Allow: ${path}`);
275
+ }
276
+ for (const path of config.robots.disallow) {
277
+ lines.push(`Disallow: ${path}`);
278
+ }
279
+ if (config.robots.crawlDelay > 0) {
280
+ lines.push(`Crawl-delay: ${config.robots.crawlDelay}`);
281
+ }
273
282
  lines.push("");
274
- if (config.url) {
275
- lines.push(`Sitemap: ${config.url}/sitemap.xml`);
283
+ const sitemapUrl = config.robots.sitemap || (config.url ? `${config.url}/sitemap.xml` : "");
284
+ if (sitemapUrl) {
285
+ lines.push(`Sitemap: ${sitemapUrl}`);
276
286
  }
277
287
  lines.push("");
278
288
  lines.push("# AEO (Answer Engine Optimization) files");
@@ -861,6 +871,22 @@ function generatePageSchemas(page, config) {
861
871
  }))
862
872
  });
863
873
  }
874
+ if (faqItems.length === 0) {
875
+ const howToSteps = detectHowToSteps(page.content || "");
876
+ if (howToSteps.length > 0) {
877
+ schemas.push({
878
+ "@context": "https://schema.org",
879
+ "@type": "HowTo",
880
+ name: page.title || config.title,
881
+ step: howToSteps.map((s, i) => ({
882
+ "@type": "HowToStep",
883
+ position: i + 1,
884
+ name: s.name,
885
+ text: s.text
886
+ }))
887
+ });
888
+ }
889
+ }
864
890
  const pageType = config.schema.defaultType;
865
891
  const pageSchema = {
866
892
  "@context": "https://schema.org",
@@ -937,12 +963,43 @@ function detectFaqPatterns(content) {
937
963
  }
938
964
  return items;
939
965
  }
966
+ function serializeJsonForHtml(value) {
967
+ return JSON.stringify(value).replace(/</g, "\\u003C").replace(/>/g, "\\u003E").replace(/&/g, "\\u0026").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
968
+ }
969
+ function detectHowToSteps(content) {
970
+ const steps = [];
971
+ const lines = content.split("\n");
972
+ for (let i = 0; i < lines.length; i++) {
973
+ const line = lines[i].trim();
974
+ const stepMatch = line.match(/^#{1,6}\s+(?:Step\s+\d+[\s:.-]*|(\d+)[.)]\s*)(.+)$/i);
975
+ if (stepMatch) {
976
+ const name = (stepMatch[2] || stepMatch[1] || "").trim();
977
+ const bodyLines = [];
978
+ for (let j = i + 1; j < lines.length; j++) {
979
+ const nextLine = lines[j].trim();
980
+ if (!nextLine) {
981
+ if (bodyLines.length > 0) break;
982
+ continue;
983
+ }
984
+ if (/^#{1,6}\s/.test(nextLine)) break;
985
+ bodyLines.push(nextLine);
986
+ }
987
+ if (name) {
988
+ steps.push({
989
+ name,
990
+ text: bodyLines.join(" ").slice(0, 500)
991
+ });
992
+ }
993
+ }
994
+ }
995
+ return steps.length >= 2 ? steps : [];
996
+ }
940
997
  function generateJsonLdScript(schemas) {
941
998
  if (schemas.length === 0) return "";
942
999
  if (schemas.length === 1) {
943
- return `<script type="application/ld+json">${JSON.stringify(schemas[0])}</script>`;
1000
+ return `<script type="application/ld+json">${serializeJsonForHtml(schemas[0])}</script>`;
944
1001
  }
945
- return schemas.map((s) => `<script type="application/ld+json">${JSON.stringify(s)}</script>`).join("\n");
1002
+ return schemas.map((s) => `<script type="application/ld+json">${serializeJsonForHtml(s)}</script>`).join("\n");
946
1003
  }
947
1004
  async function generateAEOFiles(configOrRoot, maybeConfig) {
948
1005
  var _a;
@@ -1275,15 +1332,18 @@ function auditSchemaPresence(config, issues, suggestions) {
1275
1332
  if (!hasLogo) {
1276
1333
  suggestions.push("Add schema.organization.logo for richer search results and AI knowledge");
1277
1334
  }
1278
- const hasSameAs = config.schema.organization.sameAs.length > 0;
1279
- checks.push({ label: "Social profiles linked (sameAs)", passed: hasSameAs, points: hasSameAs ? 4 : 0 });
1280
- if (!hasSameAs) {
1281
- issues.push({ category: "Schema Presence", severity: "warning", message: "No social profiles (sameAs) \u2014 critical for GEO/E-E-A-T signals", fix: "Add schema.organization.sameAs with social profile URLs" });
1335
+ const hasFaqOrHowTo = config.pages.some((p) => {
1336
+ const content = p.content || "";
1337
+ return /^#{1,6}\s+.+\?\s*$/m.test(content) || /^#{1,6}\s+(?:Step\s+\d+[\s:.-]|How\s+to)/im.test(content);
1338
+ });
1339
+ checks.push({ label: "FAQPage or HowTo schema", passed: hasFaqOrHowTo, points: hasFaqOrHowTo ? 4 : 0 });
1340
+ if (!hasFaqOrHowTo) {
1341
+ suggestions.push("Add FAQ sections (question headings) or step-by-step content to auto-generate FAQPage/HowTo schema");
1282
1342
  }
1283
- const hasRealUrl = config.url !== "https://example.com" && config.url !== "";
1284
- checks.push({ label: "Site URL is configured (not default)", passed: hasRealUrl, points: hasRealUrl ? 4 : 0 });
1285
- if (!hasRealUrl) {
1286
- issues.push({ category: "Schema Presence", severity: "error", message: "Site URL is still the default (https://example.com)", fix: "Set url to your actual site URL" });
1343
+ const hasArticleOrWebPage = schemaEnabled && (config.schema.defaultType === "Article" || config.schema.defaultType === "WebPage");
1344
+ checks.push({ label: "Article/WebPage schema", passed: hasArticleOrWebPage, points: hasArticleOrWebPage ? 4 : 0 });
1345
+ if (!hasArticleOrWebPage && schemaEnabled) {
1346
+ suggestions.push('Set schema.defaultType to "Article" or "WebPage" for per-page structured data');
1287
1347
  }
1288
1348
  return {
1289
1349
  name: "Schema Presence",
@@ -1322,12 +1382,10 @@ function auditMetaQuality(config, issues, suggestions) {
1322
1382
  if (!goodTitleCoverage && config.pages.length > 0) {
1323
1383
  issues.push({ category: "Meta Quality", severity: "warning", message: `Only ${pagesWithTitles.length}/${config.pages.length} pages have titles`, fix: "Add titles to all pages" });
1324
1384
  }
1325
- const pagesWithDesc = config.pages.filter((p) => p.description && p.description.length > 0);
1326
- const descCoverage = config.pages.length > 0 ? pagesWithDesc.length / config.pages.length : 0;
1327
- const goodDescCoverage = descCoverage >= 0.5;
1328
- checks.push({ label: "50%+ of pages have descriptions", passed: goodDescCoverage, points: goodDescCoverage ? 4 : 0 });
1329
- if (!goodDescCoverage && config.pages.length > 0) {
1330
- suggestions.push(`Only ${pagesWithDesc.length}/${config.pages.length} pages have descriptions \u2014 add per-page descriptions`);
1385
+ const hasOgImage = !!config.og.image;
1386
+ checks.push({ label: "OG image configured", passed: hasOgImage, points: hasOgImage ? 4 : 0 });
1387
+ if (!hasOgImage) {
1388
+ suggestions.push("Set og.image for richer social sharing previews and AI citation cards");
1331
1389
  }
1332
1390
  return {
1333
1391
  name: "Meta Quality",