diff --git a/.github/workflows/docsDeploy.yml b/.github/workflows/docsDeploy.yml
index bc04a609..92454e79 100644
--- a/.github/workflows/docsDeploy.yml
+++ b/.github/workflows/docsDeploy.yml
@@ -39,9 +39,8 @@ jobs:
working-directory: ./docsite
- name: Replace canonical
- working-directory: ./docsite/build
- # https://stackoverflow.com/a/74211242/1469797
- run: grep '/**"
+ ],
+ "type": "node"
+ },
{
"name": "dev",
"type": "node",
diff --git a/docsite/canonical-replace.ts b/docsite/canonical-replace.ts
new file mode 100644
index 00000000..ca0b9e75
--- /dev/null
+++ b/docsite/canonical-replace.ts
@@ -0,0 +1,42 @@
+
+import fs from 'node:fs/promises';
+import path from 'node:path';
+
+var args = process.argv.slice(2);
+
+const linkRegex = new RegExp(/ nodes with the "real" domain of the site
+ * so that SEO (google) chooses the correct domain when showing search results
+ *
+ */
+
+(async function () {
+
+ if(replacement === undefined || replacement === '') {
+ console.warn('No replacement value found in process.env.CANONICAL_HREF');
+ return;
+ }
+
+ const buildDir = path.resolve(args[0]);
+ console.log(`Reading dir recursively ${buildDir}`);
+ const files = (await fs.readdir(buildDir, { recursive: true })).filter(x => x.includes('.html'));
+ console.log(`Found ${files.length} files with .html extensions`);
+ let modifications = 0;
+
+ await Promise.all(files.map(async (x) => {
+ const filePath = path.resolve(path.join(buildDir, x));
+ //console.log(`Replacing at ${filePath}`);
+ await fs.writeFile(filePath, (await fs.readFile(filePath)).toString().replace(linkRegex, (match, capture, offset, string, groups) => {
+ // this may not be fully accurate since we're mutating concurrently/async
+ // but its a good enough signal for logging to tell if replacements happened
+ modifications++;
+ return match.replace(capture, replacement);
+ }));
+ }));
+
+ console.log(`Done with ${modifications} replacements`);
+
+}());
\ No newline at end of file