@actuate-media/cms-core 0.88.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.
- package/CHANGELOG.md +27 -0
- package/dist/api/route-helpers.d.ts.map +1 -1
- package/dist/api/route-helpers.js +1 -0
- package/dist/api/route-helpers.js.map +1 -1
- package/dist/api/routes/ai-seo.d.ts.map +1 -1
- package/dist/api/routes/ai-seo.js +65 -16
- package/dist/api/routes/ai-seo.js.map +1 -1
- package/dist/api/routes/media.d.ts.map +1 -1
- package/dist/api/routes/media.js +3 -0
- package/dist/api/routes/media.js.map +1 -1
- package/dist/api/routes/redirects.d.ts.map +1 -1
- package/dist/api/routes/redirects.js +185 -106
- package/dist/api/routes/redirects.js.map +1 -1
- package/dist/api/routes/saved-sections.d.ts.map +1 -1
- package/dist/api/routes/saved-sections.js +35 -3
- package/dist/api/routes/saved-sections.js.map +1 -1
- package/dist/api/routes/seo-public.d.ts.map +1 -1
- package/dist/api/routes/seo-public.js +42 -56
- package/dist/api/routes/seo-public.js.map +1 -1
- package/dist/api/routes/seo.d.ts.map +1 -1
- package/dist/api/routes/seo.js +325 -30
- package/dist/api/routes/seo.js.map +1 -1
- package/dist/api/routes/url-resolution.d.ts.map +1 -1
- package/dist/api/routes/url-resolution.js +1 -0
- package/dist/api/routes/url-resolution.js.map +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/media/index.d.ts +1 -0
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +1 -0
- package/dist/media/index.js.map +1 -1
- package/dist/media/optimize.d.ts +24 -2
- package/dist/media/optimize.d.ts.map +1 -1
- package/dist/media/optimize.js +55 -36
- package/dist/media/optimize.js.map +1 -1
- package/dist/redirects/fix-link.d.ts +15 -0
- package/dist/redirects/fix-link.d.ts.map +1 -0
- package/dist/redirects/fix-link.js +66 -0
- package/dist/redirects/fix-link.js.map +1 -0
- package/dist/redirects/index.d.ts +10 -0
- package/dist/redirects/index.d.ts.map +1 -1
- package/dist/redirects/index.js +6 -0
- package/dist/redirects/index.js.map +1 -1
- package/dist/redirects/legitimacy.d.ts +23 -0
- package/dist/redirects/legitimacy.d.ts.map +1 -0
- package/dist/redirects/legitimacy.js +64 -0
- package/dist/redirects/legitimacy.js.map +1 -0
- package/dist/redirects/recovery.d.ts +85 -0
- package/dist/redirects/recovery.d.ts.map +1 -0
- package/dist/redirects/recovery.js +176 -0
- package/dist/redirects/recovery.js.map +1 -0
- package/dist/redirects/rerank.d.ts +24 -0
- package/dist/redirects/rerank.d.ts.map +1 -0
- package/dist/redirects/rerank.js +82 -0
- package/dist/redirects/rerank.js.map +1 -0
- package/dist/redirects/suggest.d.ts +2 -0
- package/dist/redirects/suggest.d.ts.map +1 -1
- package/dist/redirects/suggest.js +25 -0
- package/dist/redirects/suggest.js.map +1 -1
- package/dist/redirects/typo.d.ts +10 -0
- package/dist/redirects/typo.d.ts.map +1 -0
- package/dist/redirects/typo.js +51 -0
- package/dist/redirects/typo.js.map +1 -0
- package/dist/redirects/validate-destination.d.ts +13 -0
- package/dist/redirects/validate-destination.d.ts.map +1 -0
- package/dist/redirects/validate-destination.js +51 -0
- package/dist/redirects/validate-destination.js.map +1 -0
- package/dist/script-tags/resolve.d.ts +7 -6
- package/dist/script-tags/resolve.d.ts.map +1 -1
- package/dist/script-tags/resolve.js +20 -8
- package/dist/script-tags/resolve.js.map +1 -1
- package/dist/sections/validate.d.ts +2 -0
- package/dist/sections/validate.d.ts.map +1 -1
- package/dist/sections/validate.js +23 -0
- package/dist/sections/validate.js.map +1 -1
- package/dist/seo/audit-engine.d.ts +4 -0
- package/dist/seo/audit-engine.d.ts.map +1 -1
- package/dist/seo/audit-engine.js +28 -3
- package/dist/seo/audit-engine.js.map +1 -1
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +29 -2
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/config-store.d.ts +10 -0
- package/dist/seo/config-store.d.ts.map +1 -1
- package/dist/seo/config-store.js +14 -0
- package/dist/seo/config-store.js.map +1 -1
- package/dist/seo/index.d.ts +1 -1
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +1 -1
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/issue-fix-ai.d.ts.map +1 -1
- package/dist/seo/issue-fix-ai.js +22 -13
- package/dist/seo/issue-fix-ai.js.map +1 -1
- package/dist/seo/issue-fix-redirect.d.ts +18 -0
- package/dist/seo/issue-fix-redirect.d.ts.map +1 -0
- package/dist/seo/issue-fix-redirect.js +152 -0
- package/dist/seo/issue-fix-redirect.js.map +1 -0
- package/dist/seo/issue-fix.d.ts +4 -0
- package/dist/seo/issue-fix.d.ts.map +1 -1
- package/dist/seo/issue-fix.js +51 -29
- package/dist/seo/issue-fix.js.map +1 -1
- package/dist/seo/link-graph.d.ts +46 -0
- package/dist/seo/link-graph.d.ts.map +1 -0
- package/dist/seo/link-graph.js +141 -0
- package/dist/seo/link-graph.js.map +1 -0
- package/dist/seo/migrate-meta.js +3 -2
- package/dist/seo/migrate-meta.js.map +1 -1
- package/dist/seo/page-meta.d.ts +5 -0
- package/dist/seo/page-meta.d.ts.map +1 -1
- package/dist/seo/page-meta.js +58 -66
- package/dist/seo/page-meta.js.map +1 -1
- package/dist/seo/robots.d.ts +22 -0
- package/dist/seo/robots.d.ts.map +1 -1
- package/dist/seo/robots.js +35 -0
- package/dist/seo/robots.js.map +1 -1
- package/dist/seo/title-templates.d.ts +28 -0
- package/dist/seo/title-templates.d.ts.map +1 -1
- package/dist/seo/title-templates.js +62 -2
- package/dist/seo/title-templates.js.map +1 -1
- package/dist/site.d.ts +7 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +20 -0
- package/dist/site.js.map +1 -1
- 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":"AAAA,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACxE,6EAA6E;AAC7E,2EAA2E;AAC3E,iEAAiE;AACjE,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AA4BpF,cAAc;AACd,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAA;AAG/B,SAAS;AACT,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAS1B,OAAO;AACP,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAWxB,WAAW;AACX,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAE5B,wCAAwC;AACxC,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AACnF,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,2BAA2B,CAAA;AAOlC,+DAA+D;AAC/D,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,iBAAiB,CAAA;AAGxB,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGnD,WAAW;AACX,OAAO,EACL,QAAQ,IAAI,eAAe,EAC3B,cAAc,IAAI,qBAAqB,EACvC,aAAa,IAAI,oBAAoB,EACrC,cAAc,IAAI,qBAAqB,EACvC,cAAc,IAAI,qBAAqB,EACvC,aAAa,IAAI,oBAAoB,EACrC,cAAc,IAAI,qBAAqB,EACvC,WAAW,EACX,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAG5B,OAAO;AACP,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAA;AAExB,QAAQ;AACR,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAIxB,UAAU;AACV,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAW3B,wEAAwE;AACxE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,GACb,MAAM,uBAAuB,CAAA;AAuB9B,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAA;AAGrB,8EAA8E;AAC9E,6DAA6D;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAUzD,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExD,aAAa;AACb,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGrD,uBAAuB;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAGxD,oBAAoB;AACpB,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,cAAc,GACf,MAAM,wBAAwB,CAAA;AAG/B,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAY1E,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAGzD,UAAU;AACV,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAW3B,gBAAgB;AAChB,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAG3F,gBAAgB;AAChB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA;AAGrE,iBAAiB;AACjB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAG1F,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAG5F,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAGhG,WAAW;AACX,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAG9D,OAAO,EAAE,+BAA+B,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAW5F,aAAa;AACb,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,uBAAuB,CAAA;AAG9B,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGxF,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAGhG,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9D,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAGxD,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGzF,UAAU;AACV,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAGzD,oBAAoB;AACpB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGxF,QAAQ;AACR,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAA;AAsDzB,qCAAqC;AACrC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAGzE,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG/E,MAAM;AACN,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGhD,UAAU;AACV,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAGzD,eAAe;AACf,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAGvB,UAAU;AACV,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,sEAAsE;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAG7E,MAAM;AACN,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAYvB,wEAAwE;AACxE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAA;AAavB,yEAAyE;AACzE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAG7B,eAAe;AACf,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,OAAO,EACP,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,eAAe,EACf,SAAS,EACT,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,yBAAyB,CAAA;AA4ChC,6EAA6E;AAC7E,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,cAAc,GACf,MAAM,eAAe,CAAA;AAgBtB,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA"}
|
package/dist/media/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/media/index.js
CHANGED
|
@@ -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
|
package/dist/media/index.js.map
CHANGED
|
@@ -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"}
|
package/dist/media/optimize.d.ts
CHANGED
|
@@ -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
|
|
22
|
-
*
|
|
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;
|
|
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"}
|
package/dist/media/optimize.js
CHANGED
|
@@ -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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
26
|
-
*
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
80
|
-
if (optimizedSize >= originalSize
|
|
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":"AAKA,IAAI,MAAM,GAAmB,IAAI,CAAA;AAEjC,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAA;QAC3D,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAY,CAAA;IAC1C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;
|
|
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"}
|
package/dist/redirects/index.js
CHANGED
|
@@ -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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"}
|