From a9bb8ab4684e8bba4c81c85182cea14849ecbde6 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Tue, 7 Oct 2025 17:15:42 +0200 Subject: [PATCH 1/4] feat(frontend): prerender canonical URL for subpages --- package.json | 3 ++- scripts/build.seo.mjs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 scripts/build.seo.mjs diff --git a/package.json b/package.json index 71be12f4271..b65868ccc53 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,11 @@ "build:compress": "./scripts/build.compress.sh", "build:csp": "node scripts/build.csp.mjs", "build:metadata": "node scripts/build.metadata.mjs", + "build:seo": "node scripts/build.seo.mjs", "build:style": "node scripts/build.style.mjs", "build:ic-domains": "node scripts/build.ic-domains.mjs", "build:ii-alternative-origins": "node scripts/build.ii-alternative-origins.mjs", - "build:post-process": "npm run build:style && npm run build:metadata && npm run build:ic-domains && npm run build:ii-alternative-origins && npm run build:csp && npm run build:compress", + "build:post-process": "npm run build:style && npm run build:metadata && npm run build:seo && npm run build:ic-domains && npm run build:ii-alternative-origins && npm run build:csp && npm run build:compress", "build:tokens-sns": "vite-node scripts/build.tokens.sns.ts && npm run format:file --file=src/frontend/src/env/tokens/tokens.sns.json", "build:tokens-ckerc20": "vite-node scripts/build.tokens.ckerc20.ts && npm run format:file --file=src/frontend/src/env/tokens/tokens.ckerc20.json", "build:tokens-icrc": "vite-node scripts/build.tokens.icrc.ts && npm run format:file --file=src/frontend/src/env/tokens/tokens.icrc.json", diff --git a/scripts/build.seo.mjs b/scripts/build.seo.mjs new file mode 100644 index 00000000000..e31af245eb5 --- /dev/null +++ b/scripts/build.seo.mjs @@ -0,0 +1,38 @@ +import { readFileSync, writeFileSync } from 'node:fs'; +import { dirname, join, relative } from 'node:path'; +import { ENV, OISY_IC_DOMAIN, findHtmlFiles } from './build.utils.mjs'; + +const OUTPUT_DIR = join(process.cwd(), 'build'); +const SITE_ROOT_CANONICAL = ENV !== 'production' ? OISY_IC_DOMAIN : 'https://oisy.com'; + +const updateCanonical = (htmlFilePath) => { + // 1. We determine the route based on the output + const routePath = dirname(relative(OUTPUT_DIR, htmlFilePath)); + + // 2. Build the effective canonical route + const canonicalPath = `${SITE_ROOT_CANONICAL}/${routePath}/`; + + // 2. Read content + let html = readFileSync(htmlFilePath, 'utf-8'); + + // 3. Update canonical + html = html.replace( + ``, + `` + ); + + // 4. Update og:url to reflect the canonical + html = html.replace( + ``, + `` + ); + + // 5. Save the content with the updated canonical URL + writeFileSync(htmlFilePath, html); +}; + +// Do not replace canonical for root and 404 pages +const filterSubPages = (htmlFile) => dirname(htmlFile) !== OUTPUT_DIR; + +const htmlFiles = findHtmlFiles().filter(filterSubPages); +htmlFiles.forEach((htmlFile) => updateCanonical(htmlFile)); From 0f66e70d5a329204d52998f7bd75974f66284efa Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:26:38 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=A4=96=20Apply=20formatting=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b65868ccc53..e3fa035a517 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "build:compress": "./scripts/build.compress.sh", "build:csp": "node scripts/build.csp.mjs", "build:metadata": "node scripts/build.metadata.mjs", - "build:seo": "node scripts/build.seo.mjs", + "build:seo": "node scripts/build.seo.mjs", "build:style": "node scripts/build.style.mjs", "build:ic-domains": "node scripts/build.ic-domains.mjs", "build:ii-alternative-origins": "node scripts/build.ii-alternative-origins.mjs", From cb040cb9060edd6f71566c1d3c314305a3854b6b Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Wed, 8 Oct 2025 09:24:43 +0200 Subject: [PATCH 3/4] chore: simplify --- scripts/build.seo.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build.seo.mjs b/scripts/build.seo.mjs index e31af245eb5..4d5b8c59fb1 100644 --- a/scripts/build.seo.mjs +++ b/scripts/build.seo.mjs @@ -35,4 +35,4 @@ const updateCanonical = (htmlFilePath) => { const filterSubPages = (htmlFile) => dirname(htmlFile) !== OUTPUT_DIR; const htmlFiles = findHtmlFiles().filter(filterSubPages); -htmlFiles.forEach((htmlFile) => updateCanonical(htmlFile)); +htmlFiles.forEach(updateCanonical); From c1c6994039209e677a2fb9cd9fbc9cad3784e9c5 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Wed, 8 Oct 2025 09:35:51 +0200 Subject: [PATCH 4/4] feat: use OISY_IC_DOMAIN --- scripts/build.seo.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build.seo.mjs b/scripts/build.seo.mjs index 4d5b8c59fb1..5607dba04c8 100644 --- a/scripts/build.seo.mjs +++ b/scripts/build.seo.mjs @@ -1,9 +1,9 @@ import { readFileSync, writeFileSync } from 'node:fs'; import { dirname, join, relative } from 'node:path'; -import { ENV, OISY_IC_DOMAIN, findHtmlFiles } from './build.utils.mjs'; +import { OISY_IC_DOMAIN, findHtmlFiles } from './build.utils.mjs'; const OUTPUT_DIR = join(process.cwd(), 'build'); -const SITE_ROOT_CANONICAL = ENV !== 'production' ? OISY_IC_DOMAIN : 'https://oisy.com'; +const SITE_ROOT_CANONICAL = OISY_IC_DOMAIN; const updateCanonical = (htmlFilePath) => { // 1. We determine the route based on the output