@actuate-media/cms-core 0.89.0 → 0.90.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.
Files changed (126) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/api/route-helpers.d.ts.map +1 -1
  3. package/dist/api/route-helpers.js +1 -0
  4. package/dist/api/route-helpers.js.map +1 -1
  5. package/dist/api/routes/ai-seo.d.ts.map +1 -1
  6. package/dist/api/routes/ai-seo.js +65 -16
  7. package/dist/api/routes/ai-seo.js.map +1 -1
  8. package/dist/api/routes/media.d.ts.map +1 -1
  9. package/dist/api/routes/media.js +3 -0
  10. package/dist/api/routes/media.js.map +1 -1
  11. package/dist/api/routes/redirects.d.ts.map +1 -1
  12. package/dist/api/routes/redirects.js +185 -106
  13. package/dist/api/routes/redirects.js.map +1 -1
  14. package/dist/api/routes/saved-sections.d.ts.map +1 -1
  15. package/dist/api/routes/saved-sections.js +35 -3
  16. package/dist/api/routes/saved-sections.js.map +1 -1
  17. package/dist/api/routes/seo-public.d.ts.map +1 -1
  18. package/dist/api/routes/seo-public.js +42 -56
  19. package/dist/api/routes/seo-public.js.map +1 -1
  20. package/dist/api/routes/seo.d.ts.map +1 -1
  21. package/dist/api/routes/seo.js +325 -30
  22. package/dist/api/routes/seo.js.map +1 -1
  23. package/dist/api/routes/url-resolution.d.ts.map +1 -1
  24. package/dist/api/routes/url-resolution.js +1 -0
  25. package/dist/api/routes/url-resolution.js.map +1 -1
  26. package/dist/client.d.ts +1 -0
  27. package/dist/client.d.ts.map +1 -1
  28. package/dist/client.js +1 -0
  29. package/dist/client.js.map +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/media/index.d.ts +1 -0
  35. package/dist/media/index.d.ts.map +1 -1
  36. package/dist/media/index.js +1 -0
  37. package/dist/media/index.js.map +1 -1
  38. package/dist/media/optimize.d.ts +24 -2
  39. package/dist/media/optimize.d.ts.map +1 -1
  40. package/dist/media/optimize.js +55 -36
  41. package/dist/media/optimize.js.map +1 -1
  42. package/dist/redirects/fix-link.d.ts +15 -0
  43. package/dist/redirects/fix-link.d.ts.map +1 -0
  44. package/dist/redirects/fix-link.js +66 -0
  45. package/dist/redirects/fix-link.js.map +1 -0
  46. package/dist/redirects/index.d.ts +10 -0
  47. package/dist/redirects/index.d.ts.map +1 -1
  48. package/dist/redirects/index.js +6 -0
  49. package/dist/redirects/index.js.map +1 -1
  50. package/dist/redirects/legitimacy.d.ts +23 -0
  51. package/dist/redirects/legitimacy.d.ts.map +1 -0
  52. package/dist/redirects/legitimacy.js +64 -0
  53. package/dist/redirects/legitimacy.js.map +1 -0
  54. package/dist/redirects/recovery.d.ts +85 -0
  55. package/dist/redirects/recovery.d.ts.map +1 -0
  56. package/dist/redirects/recovery.js +176 -0
  57. package/dist/redirects/recovery.js.map +1 -0
  58. package/dist/redirects/rerank.d.ts +24 -0
  59. package/dist/redirects/rerank.d.ts.map +1 -0
  60. package/dist/redirects/rerank.js +82 -0
  61. package/dist/redirects/rerank.js.map +1 -0
  62. package/dist/redirects/suggest.d.ts +2 -0
  63. package/dist/redirects/suggest.d.ts.map +1 -1
  64. package/dist/redirects/suggest.js +25 -0
  65. package/dist/redirects/suggest.js.map +1 -1
  66. package/dist/redirects/typo.d.ts +10 -0
  67. package/dist/redirects/typo.d.ts.map +1 -0
  68. package/dist/redirects/typo.js +51 -0
  69. package/dist/redirects/typo.js.map +1 -0
  70. package/dist/redirects/validate-destination.d.ts +13 -0
  71. package/dist/redirects/validate-destination.d.ts.map +1 -0
  72. package/dist/redirects/validate-destination.js +51 -0
  73. package/dist/redirects/validate-destination.js.map +1 -0
  74. package/dist/sections/validate.d.ts +2 -0
  75. package/dist/sections/validate.d.ts.map +1 -1
  76. package/dist/sections/validate.js +23 -0
  77. package/dist/sections/validate.js.map +1 -1
  78. package/dist/seo/audit-engine.d.ts +4 -0
  79. package/dist/seo/audit-engine.d.ts.map +1 -1
  80. package/dist/seo/audit-engine.js +28 -3
  81. package/dist/seo/audit-engine.js.map +1 -1
  82. package/dist/seo/audit-runner.d.ts.map +1 -1
  83. package/dist/seo/audit-runner.js +29 -2
  84. package/dist/seo/audit-runner.js.map +1 -1
  85. package/dist/seo/config-store.d.ts +10 -0
  86. package/dist/seo/config-store.d.ts.map +1 -1
  87. package/dist/seo/config-store.js +14 -0
  88. package/dist/seo/config-store.js.map +1 -1
  89. package/dist/seo/index.d.ts +1 -1
  90. package/dist/seo/index.d.ts.map +1 -1
  91. package/dist/seo/index.js +1 -1
  92. package/dist/seo/index.js.map +1 -1
  93. package/dist/seo/issue-fix-ai.d.ts.map +1 -1
  94. package/dist/seo/issue-fix-ai.js +22 -13
  95. package/dist/seo/issue-fix-ai.js.map +1 -1
  96. package/dist/seo/issue-fix-redirect.d.ts +18 -0
  97. package/dist/seo/issue-fix-redirect.d.ts.map +1 -0
  98. package/dist/seo/issue-fix-redirect.js +152 -0
  99. package/dist/seo/issue-fix-redirect.js.map +1 -0
  100. package/dist/seo/issue-fix.d.ts +4 -0
  101. package/dist/seo/issue-fix.d.ts.map +1 -1
  102. package/dist/seo/issue-fix.js +51 -29
  103. package/dist/seo/issue-fix.js.map +1 -1
  104. package/dist/seo/link-graph.d.ts +46 -0
  105. package/dist/seo/link-graph.d.ts.map +1 -0
  106. package/dist/seo/link-graph.js +141 -0
  107. package/dist/seo/link-graph.js.map +1 -0
  108. package/dist/seo/migrate-meta.js +3 -2
  109. package/dist/seo/migrate-meta.js.map +1 -1
  110. package/dist/seo/page-meta.d.ts +5 -0
  111. package/dist/seo/page-meta.d.ts.map +1 -1
  112. package/dist/seo/page-meta.js +58 -66
  113. package/dist/seo/page-meta.js.map +1 -1
  114. package/dist/seo/robots.d.ts +22 -0
  115. package/dist/seo/robots.d.ts.map +1 -1
  116. package/dist/seo/robots.js +35 -0
  117. package/dist/seo/robots.js.map +1 -1
  118. package/dist/seo/title-templates.d.ts +28 -0
  119. package/dist/seo/title-templates.d.ts.map +1 -1
  120. package/dist/seo/title-templates.js +62 -2
  121. package/dist/seo/title-templates.js.map +1 -1
  122. package/dist/site.d.ts +7 -0
  123. package/dist/site.d.ts.map +1 -1
  124. package/dist/site.js +20 -0
  125. package/dist/site.js.map +1 -1
  126. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { optimizeImage, getImageMetadata, formatBytes } from './optimize.js';
2
2
  export type { OptimizationResult, OptimizeOptions } from './optimize.js';
3
+ export { DEFAULT_IMAGE_OPTIMIZATION_LOSSLESS, DEFAULT_WEBP_QUALITY, DEFAULT_WEBP_QUALITY_ALPHA, DEFAULT_MAX_IMAGE_DIMENSION, DEFAULT_WEBP_EFFORT, MIN_WEBP_QUALITY, MAX_WEBP_QUALITY, } from './optimize.js';
3
4
  export { calculateMediaSeoScore, gradeForScore, isGenericFilename, mediaKind, MEDIA_SEO_WEIGHTS, } from './seo.js';
4
5
  export type { MediaKind, MediaSeoGrade, MediaSeoSeverity, MediaSeoIssue, MediaSeoScoreResult, MediaSeoInput, MediaSeoOptions, } from './seo.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC5E,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,iBAAiB,GAClB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC5E,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EACL,mCAAmC,EACnC,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,iBAAiB,GAClB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,UAAU,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export { optimizeImage, getImageMetadata, formatBytes } from './optimize.js';
2
+ export { DEFAULT_IMAGE_OPTIMIZATION_LOSSLESS, DEFAULT_WEBP_QUALITY, DEFAULT_WEBP_QUALITY_ALPHA, DEFAULT_MAX_IMAGE_DIMENSION, DEFAULT_WEBP_EFFORT, MIN_WEBP_QUALITY, MAX_WEBP_QUALITY, } from './optimize.js';
2
3
  export { calculateMediaSeoScore, gradeForScore, isGenericFilename, mediaKind, MEDIA_SEO_WEIGHTS, } from './seo.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE5E,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,iBAAiB,GAClB,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE5E,OAAO,EACL,mCAAmC,EACnC,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,iBAAiB,GAClB,MAAM,UAAU,CAAA"}
@@ -9,17 +9,39 @@ export interface OptimizationResult {
9
9
  mimeType: string;
10
10
  filename: string;
11
11
  blurHash?: string;
12
+ /** True when the output WebP used lossless encoding (no quality loss). */
13
+ lossless: boolean;
12
14
  }
13
15
  export interface OptimizeOptions {
16
+ /**
17
+ * When true, encode WebP in lossless mode (larger files, no encode loss).
18
+ * Default is **false** — high-quality lossy WebP for meaningful compression
19
+ * while preserving visual fidelity.
20
+ */
21
+ lossless?: boolean;
22
+ /** Lossy WebP quality (60–95). Ignored when `lossless` is true. */
14
23
  quality?: number;
15
24
  maxWidth?: number;
16
25
  maxHeight?: number;
26
+ /** WebP encoder effort 0–6. Higher = smaller files, slower uploads. */
27
+ effort?: number;
17
28
  /** Skip WebP conversion for these MIME types */
18
29
  preserveFormats?: string[];
19
30
  }
31
+ /** Default: high-quality lossy WebP — strong compression, visually sharp on web. */
32
+ export declare const DEFAULT_IMAGE_OPTIMIZATION_LOSSLESS = false;
33
+ /** Photo / opaque raster quality (visually lossless on typical displays). */
34
+ export declare const DEFAULT_WEBP_QUALITY = 82;
35
+ /** PNG with transparency — slightly higher to preserve clean edges. */
36
+ export declare const DEFAULT_WEBP_QUALITY_ALPHA = 86;
37
+ export declare const DEFAULT_MAX_IMAGE_DIMENSION = 4096;
38
+ export declare const DEFAULT_WEBP_EFFORT = 4;
39
+ export declare const MIN_WEBP_QUALITY = 60;
40
+ export declare const MAX_WEBP_QUALITY = 95;
20
41
  /**
21
- * Optimizes an image: converts to WebP, resizes if too large,
22
- * extracts dimensions, and generates a tiny blur placeholder.
42
+ * Optimizes an image: converts to high-quality **lossy WebP** by default (strong
43
+ * compression, visually sharp), resizes if too large, and generates a blur
44
+ * placeholder. Pass `{ lossless: true }` for pixel-perfect lossless WebP.
23
45
  * Non-image files and SVGs/GIFs are returned unchanged.
24
46
  */
25
47
  export declare function optimizeImage(input: Buffer | ArrayBuffer | Uint8Array, originalFilename: string, mimeType: string, opts?: OptimizeOptions): Promise<OptimizationResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/media/optimize.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAmBD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,EACxC,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAmG7B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU;;;;;;;UAmB9E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
1
+ {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/media/optimize.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,oFAAoF;AACpF,eAAO,MAAM,mCAAmC,QAAQ,CAAA;AACxD,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAC5C,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAC/C,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AA2DlC;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,EACxC,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA8F7B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU;;;;;;;UAmB9E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
@@ -6,10 +6,22 @@ async function getSharp() {
6
6
  }
7
7
  return _sharp;
8
8
  }
9
+ /** Default: high-quality lossy WebP — strong compression, visually sharp on web. */
10
+ export const DEFAULT_IMAGE_OPTIMIZATION_LOSSLESS = false;
11
+ /** Photo / opaque raster quality (visually lossless on typical displays). */
12
+ export const DEFAULT_WEBP_QUALITY = 82;
13
+ /** PNG with transparency — slightly higher to preserve clean edges. */
14
+ export const DEFAULT_WEBP_QUALITY_ALPHA = 86;
15
+ export const DEFAULT_MAX_IMAGE_DIMENSION = 4096;
16
+ export const DEFAULT_WEBP_EFFORT = 4;
17
+ export const MIN_WEBP_QUALITY = 60;
18
+ export const MAX_WEBP_QUALITY = 95;
9
19
  const DEFAULT_OPTIONS = {
10
- quality: 82,
11
- maxWidth: 4096,
12
- maxHeight: 4096,
20
+ lossless: DEFAULT_IMAGE_OPTIMIZATION_LOSSLESS,
21
+ quality: DEFAULT_WEBP_QUALITY,
22
+ maxWidth: DEFAULT_MAX_IMAGE_DIMENSION,
23
+ maxHeight: DEFAULT_MAX_IMAGE_DIMENSION,
24
+ effort: DEFAULT_WEBP_EFFORT,
13
25
  preserveFormats: ['image/svg+xml', 'image/gif'],
14
26
  };
15
27
  const OPTIMIZABLE_TYPES = new Set([
@@ -21,9 +33,29 @@ const OPTIMIZABLE_TYPES = new Set([
21
33
  'image/avif',
22
34
  'image/bmp',
23
35
  ]);
36
+ function unchangedResult(inputBuffer, originalSize, mimeType, originalFilename, width, height) {
37
+ return {
38
+ buffer: inputBuffer,
39
+ width,
40
+ height,
41
+ originalSize,
42
+ optimizedSize: originalSize,
43
+ savings: 0,
44
+ format: 'original',
45
+ mimeType,
46
+ filename: originalFilename,
47
+ lossless: false,
48
+ };
49
+ }
50
+ function resolveLossyQuality(opts, options, hasAlpha, mimeType) {
51
+ const base = opts.quality ??
52
+ (hasAlpha && mimeType === 'image/png' ? DEFAULT_WEBP_QUALITY_ALPHA : options.quality);
53
+ return Math.min(MAX_WEBP_QUALITY, Math.max(MIN_WEBP_QUALITY, base));
54
+ }
24
55
  /**
25
- * Optimizes an image: converts to WebP, resizes if too large,
26
- * extracts dimensions, and generates a tiny blur placeholder.
56
+ * Optimizes an image: converts to high-quality **lossy WebP** by default (strong
57
+ * compression, visually sharp), resizes if too large, and generates a blur
58
+ * placeholder. Pass `{ lossless: true }` for pixel-perfect lossless WebP.
27
59
  * Non-image files and SVGs/GIFs are returned unchanged.
28
60
  */
29
61
  export async function optimizeImage(input, originalFilename, mimeType, opts = {}) {
@@ -44,21 +76,12 @@ export async function optimizeImage(input, originalFilename, mimeType, opts = {}
44
76
  catch {
45
77
  // non-image or unrecognized — return as-is
46
78
  }
47
- return {
48
- buffer: inputBuffer,
49
- width,
50
- height,
51
- originalSize,
52
- optimizedSize: originalSize,
53
- savings: 0,
54
- format: 'original',
55
- mimeType,
56
- filename: originalFilename,
57
- };
79
+ return unchangedResult(inputBuffer, originalSize, mimeType, originalFilename, width, height);
58
80
  }
59
81
  let pipeline = sharp(inputBuffer, { animated: false }).rotate(); // auto-orient based on EXIF
60
82
  const metadata = await sharp(inputBuffer).metadata();
61
83
  let { width = 0, height = 0 } = metadata;
84
+ const hasAlpha = metadata.hasAlpha === true;
62
85
  if (width > options.maxWidth || height > options.maxHeight) {
63
86
  pipeline = pipeline.resize(options.maxWidth, options.maxHeight, {
64
87
  fit: 'inside',
@@ -68,27 +91,22 @@ export async function optimizeImage(input, originalFilename, mimeType, opts = {}
68
91
  width = Math.round(width * ratio);
69
92
  height = Math.round(height * ratio);
70
93
  }
71
- const optimizedBuffer = await pipeline
72
- .webp({
73
- quality: options.quality,
74
- effort: 4, // balanced speed/compression (0-6)
75
- smartSubsample: true,
76
- })
77
- .toBuffer();
94
+ const effort = Math.min(6, Math.max(0, options.effort));
95
+ const useLossless = opts.lossless === true;
96
+ const optimizedBuffer = useLossless
97
+ ? await pipeline.webp({ lossless: true, effort }).toBuffer()
98
+ : await pipeline
99
+ .webp({
100
+ quality: resolveLossyQuality(opts, options, hasAlpha, mimeType),
101
+ alphaQuality: hasAlpha ? resolveLossyQuality(opts, options, true, mimeType) : undefined,
102
+ effort,
103
+ smartSubsample: true,
104
+ })
105
+ .toBuffer();
78
106
  const optimizedSize = optimizedBuffer.length;
79
- // If WebP is actually larger (rare, happens with tiny images), keep original
80
- if (optimizedSize >= originalSize && mimeType === 'image/webp') {
81
- return {
82
- buffer: inputBuffer,
83
- width: metadata.width ?? 0,
84
- height: metadata.height ?? 0,
85
- originalSize,
86
- optimizedSize: originalSize,
87
- savings: 0,
88
- format: 'original',
89
- mimeType,
90
- filename: originalFilename,
91
- };
107
+ // If WebP is not smaller, keep the original bytes no pointless re-encode.
108
+ if (optimizedSize >= originalSize) {
109
+ return unchangedResult(inputBuffer, originalSize, mimeType, originalFilename, metadata.width ?? 0, metadata.height ?? 0);
92
110
  }
93
111
  const webpFilename = originalFilename.replace(/\.[^.]+$/, '.webp');
94
112
  let blurHash;
@@ -113,6 +131,7 @@ export async function optimizeImage(input, originalFilename, mimeType, opts = {}
113
131
  mimeType: 'image/webp',
114
132
  filename: webpFilename,
115
133
  blurHash,
134
+ lossless: useLossless,
116
135
  };
117
136
  }
118
137
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/media/optimize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/media/optimize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Replace broken hrefs inside document JSON (sections, rich text, etc.).
3
+ */
4
+ export declare function replaceHrefInValue(value: unknown, fromHref: string, toHref: string): {
5
+ value: unknown;
6
+ changed: boolean;
7
+ };
8
+ /** Apply href replacements to document.data; returns partial patch of changed keys. */
9
+ export declare function buildLinkFixPatch(data: Record<string, unknown>, fromHref: string, toHref: string): {
10
+ patch: Record<string, unknown>;
11
+ changed: boolean;
12
+ };
13
+ /** Convert a live path to the same href shape as the broken link (relative vs absolute). */
14
+ export declare function targetHrefForBroken(brokenHref: string, toPath: string, siteUrl?: string): string;
15
+ //# sourceMappingURL=fix-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-link.d.ts","sourceRoot":"","sources":["../../src/redirects/fix-link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAyBtC;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAWtD;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAOhG"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Replace broken hrefs inside document JSON (sections, rich text, etc.).
3
+ */
4
+ function replaceHrefInString(text, fromHref, toHref) {
5
+ if (!text.includes(fromHref))
6
+ return { text, changed: false };
7
+ const escaped = fromHref.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
8
+ const re = new RegExp(`(href\\s*=\\s*["'])${escaped}(["'])`, 'gi');
9
+ if (!re.test(text))
10
+ return { text, changed: false };
11
+ return {
12
+ text: text.replace(new RegExp(`(href\\s*=\\s*["'])${escaped}(["'])`, 'gi'), `$1${toHref}$2`),
13
+ changed: true,
14
+ };
15
+ }
16
+ export function replaceHrefInValue(value, fromHref, toHref) {
17
+ if (typeof value === 'string') {
18
+ const r = replaceHrefInString(value, fromHref, toHref);
19
+ return { value: r.text, changed: r.changed };
20
+ }
21
+ if (Array.isArray(value)) {
22
+ let changed = false;
23
+ const next = value.map((item) => {
24
+ const r = replaceHrefInValue(item, fromHref, toHref);
25
+ if (r.changed)
26
+ changed = true;
27
+ return r.value;
28
+ });
29
+ return { value: next, changed };
30
+ }
31
+ if (value && typeof value === 'object') {
32
+ let changed = false;
33
+ const out = {};
34
+ for (const [k, v] of Object.entries(value)) {
35
+ const r = replaceHrefInValue(v, fromHref, toHref);
36
+ out[k] = r.value;
37
+ if (r.changed)
38
+ changed = true;
39
+ }
40
+ return { value: out, changed };
41
+ }
42
+ return { value, changed: false };
43
+ }
44
+ /** Apply href replacements to document.data; returns partial patch of changed keys. */
45
+ export function buildLinkFixPatch(data, fromHref, toHref) {
46
+ const patch = {};
47
+ let changed = false;
48
+ for (const [key, val] of Object.entries(data)) {
49
+ const r = replaceHrefInValue(val, fromHref, toHref);
50
+ if (r.changed) {
51
+ patch[key] = r.value;
52
+ changed = true;
53
+ }
54
+ }
55
+ return { patch, changed };
56
+ }
57
+ /** Convert a live path to the same href shape as the broken link (relative vs absolute). */
58
+ export function targetHrefForBroken(brokenHref, toPath, siteUrl) {
59
+ const trimmed = brokenHref.trim();
60
+ if (/^https?:\/\//i.test(trimmed) && siteUrl) {
61
+ const base = siteUrl.replace(/\/+$/, '');
62
+ return `${base}${toPath.startsWith('/') ? toPath : `/${toPath}`}`;
63
+ }
64
+ return toPath.startsWith('/') ? toPath : `/${toPath}`;
65
+ }
66
+ //# sourceMappingURL=fix-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-link.js","sourceRoot":"","sources":["../../src/redirects/fix-link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,SAAS,mBAAmB,CAC1B,IAAY,EACZ,QAAgB,EAChB,MAAc;IAEd,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IAC/D,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,sBAAsB,OAAO,QAAQ,EAAE,IAAI,CAAC,CAAA;IAClE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACnD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,sBAAsB,OAAO,QAAQ,EAAE,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC;QAC5F,OAAO,EAAE,IAAI;KACd,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,QAAgB,EAChB,MAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QACtD,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;IAC9C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;YACpD,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,GAAG,IAAI,CAAA;YAC7B,OAAO,CAAC,CAAC,KAAK,CAAA;QAChB,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACjC,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;YACjD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;YAChB,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,GAAG,IAAI,CAAA;QAC/B,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA;IAChC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAClC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAC/B,IAA6B,EAC7B,QAAgB,EAChB,MAAc;IAEd,MAAM,KAAK,GAA4B,EAAE,CAAA;IACzC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;YACpB,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,MAAc,EAAE,OAAgB;IACtF,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;IACjC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACxC,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,CAAA;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAA;AACvD,CAAC"}
@@ -2,6 +2,16 @@ export { normalizeRedirectPath, isExternal, buildEdgeMap, resolveChain, detectCh
2
2
  export type { RedirectRecord, ChainResolution, DetectedChain } from './graph.js';
3
3
  export { suggestRedirectTarget } from './suggest.js';
4
4
  export type { SuggestCandidate, RedirectSuggestionResult } from './suggest.js';
5
+ export { scorePathLegitimacy } from './legitimacy.js';
6
+ export type { LegitimacySignals, LegitimacyResult } from './legitimacy.js';
7
+ export { collectRecoveryPaths, planRecoveryRedirect, planRecoveryRedirects, upsertRedirectSuggestions, generateRecoverySuggestions, createRecoveryRedirect, } from './recovery.js';
8
+ export type { BrokenLinkRef, RecoveryPathSignals, RecoveryPlan, RecoveryPlanOptions, } from './recovery.js';
9
+ export { rankRedirectCandidates } from './suggest.js';
10
+ export { validateRedirectDestination } from './validate-destination.js';
11
+ export type { RedirectDestinationValidationOptions } from './validate-destination.js';
12
+ export type { RedirectMatchResult, RedirectMatchSource, SemanticRerankFn } from './rerank.js';
13
+ export { isLikelyEditorTypo } from './typo.js';
14
+ export { buildLinkFixPatch, replaceHrefInValue, targetHrefForBroken } from './fix-link.js';
5
15
  export { planSlugChangeRedirects, isEmptyPlan } from './auto.js';
6
16
  export type { SlugRedirectPlan } from './auto.js';
7
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAE9E,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEhE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAE9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE1E,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,eAAe,CAAA;AAEtB,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACpB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAEvE,YAAY,EAAE,oCAAoC,EAAE,MAAM,2BAA2B,CAAA;AAErF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAE1F,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEhE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA"}
@@ -1,4 +1,10 @@
1
1
  export { normalizeRedirectPath, isExternal, buildEdgeMap, resolveChain, detectChainsAndLoops, wouldCreateLoop, isRedirectStale, } from './graph.js';
2
2
  export { suggestRedirectTarget } from './suggest.js';
3
+ export { scorePathLegitimacy } from './legitimacy.js';
4
+ export { collectRecoveryPaths, planRecoveryRedirect, planRecoveryRedirects, upsertRedirectSuggestions, generateRecoverySuggestions, createRecoveryRedirect, } from './recovery.js';
5
+ export { rankRedirectCandidates } from './suggest.js';
6
+ export { validateRedirectDestination } from './validate-destination.js';
7
+ export { isLikelyEditorTypo } from './typo.js';
8
+ export { buildLinkFixPatch, replaceHrefInValue, targetHrefForBroken } from './fix-link.js';
3
9
  export { planSlugChangeRedirects, isEmptyPlan } from './auto.js';
4
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAA;AAInB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAIpD,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/redirects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAA;AAInB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAIpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAIrD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,eAAe,CAAA;AAStB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAMvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAE1F,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Legitimacy scoring for broken URLs — gates redirect recovery so probe/scanner
3
+ * paths are not promoted to 301 suggestions.
4
+ */
5
+ export interface LegitimacySignals {
6
+ /** Linked from CMS content (strong signal — editor intended this URL). */
7
+ hasInternalLink?: boolean;
8
+ /** Aggregated 404 hit count from live traffic. */
9
+ hitCount?: number;
10
+ /** Known collection URL prefixes, e.g. `/blog`, `/services`. */
11
+ pathPrefixes?: string[];
12
+ }
13
+ export interface LegitimacyResult {
14
+ score: number;
15
+ legitimate: boolean;
16
+ reasons: string[];
17
+ }
18
+ /**
19
+ * Score how likely a broken path was a real page (0–100). Internal CMS links
20
+ * always pass — someone deliberately linked to this URL.
21
+ */
22
+ export declare function scorePathLegitimacy(path: string, signals?: LegitimacySignals): LegitimacyResult;
23
+ //# sourceMappingURL=legitimacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legitimacy.d.ts","sourceRoot":"","sources":["../../src/redirects/legitimacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAwClB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Legitimacy scoring for broken URLs — gates redirect recovery so probe/scanner
3
+ * paths are not promoted to 301 suggestions.
4
+ */
5
+ /** Common scanner / exploit probe patterns — never redirect these alone. */
6
+ const PROBE_PATTERNS = [
7
+ /^\/wp-(admin|content|includes|login)/i,
8
+ /\.(php|asp|aspx|cgi|env|git|sql|bak|old|swp)$/i,
9
+ /^\/xmlrpc/i,
10
+ /^\/\.env/i,
11
+ /^\/administrator/i,
12
+ /^\/phpmyadmin/i,
13
+ /\/\.\./,
14
+ /^\/cgi-bin/i,
15
+ ];
16
+ function pathSegments(path) {
17
+ return path.split('/').filter(Boolean);
18
+ }
19
+ function looksLikeContentSlug(path) {
20
+ const segments = pathSegments(path);
21
+ if (segments.length === 0 || segments.length > 6)
22
+ return false;
23
+ return segments.every((s) => /^[a-z0-9][a-z0-9-]*$/i.test(s) && s.length <= 80);
24
+ }
25
+ function matchesProbePattern(path) {
26
+ return PROBE_PATTERNS.some((re) => re.test(path));
27
+ }
28
+ /**
29
+ * Score how likely a broken path was a real page (0–100). Internal CMS links
30
+ * always pass — someone deliberately linked to this URL.
31
+ */
32
+ export function scorePathLegitimacy(path, signals = {}) {
33
+ const reasons = [];
34
+ let score = 0;
35
+ if (signals.hasInternalLink) {
36
+ score += 45;
37
+ reasons.push('Linked from CMS content');
38
+ }
39
+ const hits = signals.hitCount ?? 0;
40
+ if (hits > 0) {
41
+ const hitPts = hits >= 5 ? 35 : hits >= 2 ? 25 : 12;
42
+ score += hitPts;
43
+ reasons.push(`${hits} real 404 hit${hits === 1 ? '' : 's'}`);
44
+ }
45
+ if (looksLikeContentSlug(path)) {
46
+ score += 15;
47
+ reasons.push('URL matches site slug pattern');
48
+ }
49
+ if (signals.pathPrefixes?.some((p) => path === p || path.startsWith(`${p}/`))) {
50
+ score += 10;
51
+ reasons.push('URL matches a known collection prefix');
52
+ }
53
+ if (matchesProbePattern(path)) {
54
+ score -= 60;
55
+ reasons.push('Matches common probe/scanner pattern');
56
+ }
57
+ score = Math.max(0, Math.min(100, score));
58
+ // Internal links are always legitimate; probes without CMS links are not.
59
+ const legitimate = signals.hasInternalLink === true ||
60
+ (score >= 30 && !matchesProbePattern(path)) ||
61
+ (hits >= 5 && !matchesProbePattern(path));
62
+ return { score, legitimate, reasons };
63
+ }
64
+ //# sourceMappingURL=legitimacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legitimacy.js","sourceRoot":"","sources":["../../src/redirects/legitimacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Unified 404 redirect recovery — legitimacy gate + heuristic matching.
3
+ * Used by the Redirects tab generator and the SEO audit pipeline.
4
+ */
5
+ import { type SuggestCandidate } from './suggest.js';
6
+ export interface BrokenLinkRef {
7
+ url: string;
8
+ }
9
+ export interface RecoveryPathSignals {
10
+ hasInternalLink: boolean;
11
+ hitCount: number;
12
+ }
13
+ export interface RecoveryPlan {
14
+ fromPath: string;
15
+ toPath: string;
16
+ confidence: number;
17
+ reason: string;
18
+ legitimacyScore: number;
19
+ legitimacyReasons: string[];
20
+ matchSource?: 'heuristic' | 'semantic';
21
+ autoApplied?: boolean;
22
+ }
23
+ export interface RecoveryPlanOptions {
24
+ candidates: SuggestCandidate[];
25
+ pathPrefixes?: string[];
26
+ /** Minimum match confidence (0–100). Default 30. */
27
+ minConfidence?: number;
28
+ siteUrl?: string;
29
+ enableAiRerank?: boolean;
30
+ autoApply?: boolean;
31
+ autoApplyMinConfidence?: number;
32
+ semanticRerank?: import('./rerank.js').SemanticRerankFn | null;
33
+ }
34
+ /** Merge 404 hit paths and audit broken-link hrefs into one deduped map. */
35
+ export declare function collectRecoveryPaths(hits: Array<{
36
+ path: string;
37
+ hits?: number;
38
+ }>, brokenLinks: BrokenLinkRef[], siteUrl?: string): Map<string, RecoveryPathSignals>;
39
+ /** Plan a single recovery redirect, or null when illegitimate / no match. */
40
+ export declare function planRecoveryRedirect(fromPath: string, signals: RecoveryPathSignals, options: RecoveryPlanOptions): Promise<RecoveryPlan | null>;
41
+ /** Plan recovery redirects for all collected paths. */
42
+ export declare function planRecoveryRedirects(pathMap: Map<string, RecoveryPathSignals>, options: RecoveryPlanOptions): Promise<RecoveryPlan[]>;
43
+ type RecoveryHitRow = {
44
+ path: string;
45
+ hits?: number;
46
+ };
47
+ type RecoverySuggestionDb = {
48
+ redirect404Hit?: {
49
+ findMany: (args: unknown) => Promise<RecoveryHitRow[]>;
50
+ updateMany?: (args: unknown) => Promise<unknown>;
51
+ };
52
+ redirect?: {
53
+ upsert: (args: unknown) => Promise<unknown>;
54
+ findMany?: (args: unknown) => Promise<unknown[]>;
55
+ };
56
+ redirectSuggestion?: {
57
+ findFirst: (args: unknown) => Promise<{
58
+ id: string;
59
+ } | null>;
60
+ create: (args: unknown) => Promise<unknown>;
61
+ };
62
+ };
63
+ /** Create a 301 redirect from a recovery plan (shared by auto-apply and audit fixes). */
64
+ export declare function createRecoveryRedirect(db: RecoverySuggestionDb, plan: Pick<RecoveryPlan, 'fromPath' | 'toPath'>, userId?: string): Promise<void>;
65
+ /** Persist open redirect suggestions; skips paths that already have one. */
66
+ export declare function upsertRedirectSuggestions(db: RecoverySuggestionDb, plans: RecoveryPlan[]): Promise<number>;
67
+ /** Full pipeline: collect paths, plan matches, persist suggestions. */
68
+ export declare function generateRecoverySuggestions(db: RecoverySuggestionDb, options: {
69
+ candidates: SuggestCandidate[];
70
+ pathPrefixes?: string[];
71
+ brokenLinks?: BrokenLinkRef[];
72
+ include404Hits?: boolean;
73
+ siteUrl?: string;
74
+ enableAiRerank?: boolean;
75
+ autoApply?: boolean;
76
+ autoApplyMinConfidence?: number;
77
+ autoApplyUserId?: string;
78
+ semanticRerank?: import('./rerank.js').SemanticRerankFn | null;
79
+ }): Promise<{
80
+ created: number;
81
+ planned: number;
82
+ autoApplied: number;
83
+ }>;
84
+ export {};
85
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/redirects/recovery.ts"],"names":[],"mappings":"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"}