From d0ac68b4e476b4389133d3911a6886354db1c9c0 Mon Sep 17 00:00:00 2001 From: Elmar Burke Date: Thu, 18 Dec 2025 17:38:08 +0100 Subject: [PATCH 1/6] Introducing publish example --- examples/publish/README.md | 42 +++++++++++++++++++++++++++ examples/publish/package.json | 16 +++++++++++ examples/publish/publish.ts | 34 ++++++++++++++++++++++ examples/publish/tsconfig.json | 4 +++ package-lock.json | 52 +++++++++++++++++++++++++--------- 5 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 examples/publish/README.md create mode 100644 examples/publish/package.json create mode 100644 examples/publish/publish.ts create mode 100644 examples/publish/tsconfig.json diff --git a/examples/publish/README.md b/examples/publish/README.md new file mode 100644 index 0000000..5b72158 --- /dev/null +++ b/examples/publish/README.md @@ -0,0 +1,42 @@ +# Publish + +Publishes and deploys a Framer project. Designed to run as a one-shot script, making it ideal for cron jobs, CI/CD pipelines, and systemd timers. + +## Usage + +```bash +node --env-file=../../.env index.ts + +bun --env-file=../../.env run index.ts + +deno --env-file=../../.env run index.ts +``` + +## Environment Variables + +| Variable | Required | Description | +|----------|----------|-------------| +| `EXAMPLE_PROJECT_URL` | Yes | Your Framer project URL | + +## Scheduling Examples + +### Cron + +Publish every 4 hours: + +```bash +# Edit crontab +crontab -e + +# Add this line (adjust paths as needed) +0 */4 * * * cd /path/to/examples/publish && node --env-file=../../.env index.ts >> /var/log/framer-publish.log 2>&1 +``` + +Common cron schedules: + +```bash +0 */4 * * * # Every 4 hours +0 9-18/2 * * 1-5 # Every 2 hours between 9:00 and 18:00, mon-fri +0 9 * * * # Daily at 9:00 +0 9 * * 1-5 # Weekdays at 9:00 +``` diff --git a/examples/publish/package.json b/examples/publish/package.json new file mode 100644 index 0000000..72d02bd --- /dev/null +++ b/examples/publish/package.json @@ -0,0 +1,16 @@ +{ + "name": "publish", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "framer-api": "^0.0.1-beta.0", + "typescript": "^5.9.3" + }, + "devDependencies": { + "@types/node": "^22.10.2" + } +} diff --git a/examples/publish/publish.ts b/examples/publish/publish.ts new file mode 100644 index 0000000..0e0f88b --- /dev/null +++ b/examples/publish/publish.ts @@ -0,0 +1,34 @@ +import assert from "node:assert"; +import { connect } from "framer-api"; + +const projectUrl = process.env["EXAMPLE_PROJECT_URL"]; +assert(projectUrl, "EXAMPLE_PROJECT_URL environment variable is required"); + +using framer = await connect(projectUrl); + +// Show changes +const changedPaths = await framer.getChangedPaths(); +const entries = Object.entries(changedPaths); +const totalChanges = entries.reduce((sum, [, paths]) => sum + paths.length, 0); + +if (totalChanges === 0) { + console.log("⛔️ No changes to publish."); + process.exit(0); +} + +console.log(`📄 ${totalChanges} change(s):`); +for (const [type, paths] of entries) { + for (const path of paths) { + console.log(` ${type}: ${path}`); + } +} + +// Publish +const { deployment } = await framer.publish(); +console.log(`🚀 Published deployment ${deployment.id}`); + +const deployedHostnames = await framer.deploy(deployment.id); +console.log(`✅ Deployed to:`); +for (const hostname of deployedHostnames) { + console.log(` https://${hostname.hostname}`); +} diff --git a/examples/publish/tsconfig.json b/examples/publish/tsconfig.json new file mode 100644 index 0000000..ff466ce --- /dev/null +++ b/examples/publish/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["publish.ts"] +} diff --git a/package-lock.json b/package-lock.json index 09240ea..6afc870 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "hasInstallScript": true, "dependencies": { "@notionhq/client": "^5.6.0", - "framer-api": "*" + "framer-api": "beta" }, "devDependencies": { "@types/node": "^24.10.0", @@ -51,9 +51,9 @@ } }, "examples/notion-automations-sync/node_modules/@types/node": { - "version": "24.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", - "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "version": "24.10.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.12.tgz", + "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", "dev": true, "license": "MIT", "dependencies": { @@ -67,6 +67,28 @@ "dev": true, "license": "MIT" }, + "examples/publish": { + "version": "0.0.1", + "dependencies": { + "framer-api": "^0.0.1-beta.0", + "typescript": "^5.9.3" + }, + "devDependencies": { + "@types/node": "^22.10.2" + } + }, + "examples/publish-cli": { + "version": "0.0.1", + "extraneous": true, + "dependencies": { + "@inquirer/prompts": "^7.2.1", + "framer-api": "^0.0.1-beta.0", + "typescript": "^5.9.3" + }, + "devDependencies": { + "@types/node": "^22.10.2" + } + }, "node_modules/@biomejs/biome": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.9.tgz", @@ -1341,9 +1363,9 @@ } }, "node_modules/@notionhq/client": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-5.6.0.tgz", - "integrity": "sha512-eA3dO87vQJhFmR59utXH8r0nnulW7C7oTcxfp3bpiiTiv59luCkOkbbALCIa8TzBDdELoRD/zJEIfKcynyFR6Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-5.9.0.tgz", + "integrity": "sha512-TvAVMfwtVv61hsPrRfB9ehgzSjX6DaAi1ZRAnpg8xFjzaXhzhEfbO0PhBRm3ecSv1azDuO2kBuyQHh2/z7G4YQ==", "license": "MIT", "engines": { "node": ">=18" @@ -1584,9 +1606,9 @@ "license": "BSD-2-Clause" }, "node_modules/hono": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", - "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz", + "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -1711,6 +1733,10 @@ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "license": "MIT" }, + "node_modules/publish": { + "resolved": "examples/publish", + "link": true + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -1725,9 +1751,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { From a127fee3ff125b4bef449650a0cf27563f025292 Mon Sep 17 00:00:00 2001 From: Elmar Burke Date: Fri, 19 Dec 2025 14:57:04 +0100 Subject: [PATCH 2/6] Update framer-api version to 0.0.1-beta.1 in package-lock.json and example package.json files --- examples/csv-importer/package.json | 2 +- examples/json-api/package.json | 2 +- examples/publish/package.json | 2 +- package-lock.json | 24 ++++++------------------ 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/examples/csv-importer/package.json b/examples/csv-importer/package.json index c98e90a..fa2870e 100644 --- a/examples/csv-importer/package.json +++ b/examples/csv-importer/package.json @@ -7,7 +7,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "framer-api": "^0.0.1-beta.0", + "framer-api": "^0.0.1-beta.1", "papaparse": "^5.5.3", "typescript": "^5.9.3" }, diff --git a/examples/json-api/package.json b/examples/json-api/package.json index 5978ff2..8568a86 100644 --- a/examples/json-api/package.json +++ b/examples/json-api/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@hono/node-server": "^1.14.1", - "framer-api": "^0.0.1-beta.0", + "framer-api": "^0.0.1-beta.1", "hono": "^4.11.4", "typescript": "^5.9.3" }, diff --git a/examples/publish/package.json b/examples/publish/package.json index 72d02bd..e63bf07 100644 --- a/examples/publish/package.json +++ b/examples/publish/package.json @@ -7,7 +7,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "framer-api": "^0.0.1-beta.0", + "framer-api": "^0.0.1-beta.1", "typescript": "^5.9.3" }, "devDependencies": { diff --git a/package-lock.json b/package-lock.json index 6afc870..cfd3f5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "examples/csv-importer": { "version": "0.0.1", "dependencies": { - "framer-api": "^0.0.1-beta.0", + "framer-api": "^0.0.1-beta.1", "papaparse": "^5.5.3", "typescript": "^5.9.3" }, @@ -28,7 +28,7 @@ "version": "0.0.1", "dependencies": { "@hono/node-server": "^1.14.1", - "framer-api": "^0.0.1-beta.0", + "framer-api": "^0.0.1-beta.1", "hono": "^4.11.4", "typescript": "^5.9.3" }, @@ -70,19 +70,7 @@ "examples/publish": { "version": "0.0.1", "dependencies": { - "framer-api": "^0.0.1-beta.0", - "typescript": "^5.9.3" - }, - "devDependencies": { - "@types/node": "^22.10.2" - } - }, - "examples/publish-cli": { - "version": "0.0.1", - "extraneous": true, - "dependencies": { - "@inquirer/prompts": "^7.2.1", - "framer-api": "^0.0.1-beta.0", + "framer-api": "^0.0.1-beta.1", "typescript": "^5.9.3" }, "devDependencies": { @@ -1570,9 +1558,9 @@ } }, "node_modules/framer-api": { - "version": "0.0.1-beta.0", - "resolved": "https://registry.npmjs.org/framer-api/-/framer-api-0.0.1-beta.0.tgz", - "integrity": "sha512-rSTIX4KOCf9zRMGzeI92b/+dAG67JibFYQjTlJlG119fA4nfDlFWclZIxaBdFRnQZIckrlE+GHvcym2T+dCItQ==", + "version": "0.0.1-beta.1", + "resolved": "https://registry.npmjs.org/framer-api/-/framer-api-0.0.1-beta.1.tgz", + "integrity": "sha512-AgCbORmJJ3fytV3xtCkESVzl0N3T68ad/tVr6Nbjf5g3B+xPxBT88EKajxOlspblLiROIvtryRx+Dyl4ZzL85w==", "dependencies": { "devalue": "^5.4.2", "unenv": "^2.0.0-rc.24", From 1b917223f8481aa1ac0a5fdf7a55361e375ec78a Mon Sep 17 00:00:00 2001 From: Elmar Burke Date: Mon, 9 Feb 2026 17:01:09 +0100 Subject: [PATCH 3/6] Update publish example README to use publish.ts --- examples/publish/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/publish/README.md b/examples/publish/README.md index 5b72158..776204a 100644 --- a/examples/publish/README.md +++ b/examples/publish/README.md @@ -5,11 +5,11 @@ Publishes and deploys a Framer project. Designed to run as a one-shot script, ma ## Usage ```bash -node --env-file=../../.env index.ts +node --env-file=../../.env publish.ts -bun --env-file=../../.env run index.ts +bun --env-file=../../.env run publish.ts -deno --env-file=../../.env run index.ts +deno --env-file=../../.env run publish.ts ``` ## Environment Variables @@ -29,7 +29,7 @@ Publish every 4 hours: crontab -e # Add this line (adjust paths as needed) -0 */4 * * * cd /path/to/examples/publish && node --env-file=../../.env index.ts >> /var/log/framer-publish.log 2>&1 +0 */4 * * * cd /path/to/examples/publish && node --env-file=../../.env publish.ts >> /var/log/framer-publish.log 2>&1 ``` Common cron schedules: From 4261df27e80591bb403146624c621fcafafc62b0 Mon Sep 17 00:00:00 2001 From: Elmar Burke Date: Mon, 9 Feb 2026 17:29:18 +0100 Subject: [PATCH 4/6] Handle no custom domains on deploy Print the number of deployed custom domains and show a fallback message when none are configured. --- examples/publish/publish.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/publish/publish.ts b/examples/publish/publish.ts index 0e0f88b..e411694 100644 --- a/examples/publish/publish.ts +++ b/examples/publish/publish.ts @@ -27,8 +27,14 @@ for (const [type, paths] of entries) { const { deployment } = await framer.publish(); console.log(`🚀 Published deployment ${deployment.id}`); -const deployedHostnames = await framer.deploy(deployment.id); -console.log(`✅ Deployed to:`); -for (const hostname of deployedHostnames) { - console.log(` https://${hostname.hostname}`); +// Deploy to custom domains +const deployed = await framer.deploy(deployment.id); + +if (deployed.length > 0) { + console.log(`✅ Deployed to ${deployed.length} custom domain(s):`); + for (const hostname of deployed) { + console.log(` https://${hostname.hostname}`); + } +} else { + console.log("No custom domains to deploy — default hostname is already live."); } From 2cec6779e64056eae21d75bfed35a16a1fa245c8 Mon Sep 17 00:00:00 2001 From: Elmar Burke Date: Tue, 10 Feb 2026 14:54:42 +0100 Subject: [PATCH 5/6] Bump framer-api to 0.1.1 --- examples/csv-importer/package.json | 2 +- examples/json-api/package.json | 2 +- examples/notion-automations-sync/package.json | 2 +- examples/publish/package.json | 2 +- package-lock.json | 91 ++++--------------- 5 files changed, 24 insertions(+), 75 deletions(-) diff --git a/examples/csv-importer/package.json b/examples/csv-importer/package.json index fa2870e..1568086 100644 --- a/examples/csv-importer/package.json +++ b/examples/csv-importer/package.json @@ -7,7 +7,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "framer-api": "^0.0.1-beta.1", + "framer-api": "^0.1.1", "papaparse": "^5.5.3", "typescript": "^5.9.3" }, diff --git a/examples/json-api/package.json b/examples/json-api/package.json index 8568a86..5ab8b5f 100644 --- a/examples/json-api/package.json +++ b/examples/json-api/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@hono/node-server": "^1.14.1", - "framer-api": "^0.0.1-beta.1", + "framer-api": "^0.1.1", "hono": "^4.11.4", "typescript": "^5.9.3" }, diff --git a/examples/notion-automations-sync/package.json b/examples/notion-automations-sync/package.json index 6990d04..f46c814 100644 --- a/examples/notion-automations-sync/package.json +++ b/examples/notion-automations-sync/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@notionhq/client": "^5.6.0", - "framer-api": "beta" + "framer-api": "0.1.1" }, "devDependencies": { "@types/node": "^24.10.0", diff --git a/examples/publish/package.json b/examples/publish/package.json index e63bf07..52ec320 100644 --- a/examples/publish/package.json +++ b/examples/publish/package.json @@ -7,7 +7,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "framer-api": "^0.0.1-beta.1", + "framer-api": "^0.1.1", "typescript": "^5.9.3" }, "devDependencies": { diff --git a/package-lock.json b/package-lock.json index cfd3f5b..00e17a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "examples/csv-importer": { "version": "0.0.1", "dependencies": { - "framer-api": "^0.0.1-beta.1", + "framer-api": "^0.1.1", "papaparse": "^5.5.3", "typescript": "^5.9.3" }, @@ -28,7 +28,7 @@ "version": "0.0.1", "dependencies": { "@hono/node-server": "^1.14.1", - "framer-api": "^0.0.1-beta.1", + "framer-api": "^0.1.1", "hono": "^4.11.4", "typescript": "^5.9.3" }, @@ -42,7 +42,7 @@ "hasInstallScript": true, "dependencies": { "@notionhq/client": "^5.6.0", - "framer-api": "beta" + "framer-api": "0.1.1" }, "devDependencies": { "@types/node": "^24.10.0", @@ -70,7 +70,7 @@ "examples/publish": { "version": "0.0.1", "dependencies": { - "framer-api": "^0.0.1-beta.1", + "framer-api": "^0.1.1", "typescript": "^5.9.3" }, "devDependencies": { @@ -1487,9 +1487,9 @@ } }, "node_modules/devalue": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", "license": "MIT" }, "node_modules/error-stack-parser-es": { @@ -1558,17 +1558,12 @@ } }, "node_modules/framer-api": { - "version": "0.0.1-beta.1", - "resolved": "https://registry.npmjs.org/framer-api/-/framer-api-0.0.1-beta.1.tgz", - "integrity": "sha512-AgCbORmJJ3fytV3xtCkESVzl0N3T68ad/tVr6Nbjf5g3B+xPxBT88EKajxOlspblLiROIvtryRx+Dyl4ZzL85w==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/framer-api/-/framer-api-0.1.1.tgz", + "integrity": "sha512-Y2/MQWBbhViuUJeS2zwOoKUDfTNkUL/zPO31kIPjVafU2aTbICRegB+6fgbLSaBF4tTpWSTV5XiYMUa7rjf6vw==", "dependencies": { - "devalue": "^5.4.2", - "unenv": "^2.0.0-rc.24", - "ws": "^8.18.0" - }, - "peerDependencies": { - "react": "^18.2.0", - "typescript": "^5.9.3" + "devalue": "^5.6.2", + "std-env": "^3.10.0" } }, "node_modules/fsevents": { @@ -1602,13 +1597,6 @@ "node": ">=16.9.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, "node_modules/json-api": { "resolved": "examples/json-api", "link": true @@ -1623,19 +1611,6 @@ "node": ">=6" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -1719,25 +1694,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, "license": "MIT" }, "node_modules/publish": { "resolved": "examples/publish", "link": true }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -1796,6 +1759,12 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, "node_modules/stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", @@ -1862,6 +1831,7 @@ "version": "2.0.0-rc.24", "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, "license": "MIT", "dependencies": { "pathe": "^2.0.3" @@ -1923,27 +1893,6 @@ } } }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/youch": { "version": "4.1.0-beta.10", "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", From a90eeb339de8287e4e34c91ce237a250fd18eb7b Mon Sep 17 00:00:00 2001 From: Elmar Burke Date: Tue, 10 Feb 2026 15:16:38 +0100 Subject: [PATCH 6/6] Fix CI env setup step failing when .env.example is missing --- .github/workflows/pull_request.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index bc151aa..2419fd4 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -19,7 +19,9 @@ jobs: - name: Setup env files for type generation run: | for dir in examples/*/; do - [ -f "$dir/.env.example" ] && cp "$dir/.env.example" "$dir/.env" + if [ -f "$dir/.env.example" ]; then + cp "$dir/.env.example" "$dir/.env" + fi done - run: npm ci