From 22e7e551c0e83f7af2e2b0b0da26304de0e25da3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 01:29:49 +0000 Subject: [PATCH 01/71] chore(deps): update dependency eslint to v8.57.1 (#5846) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 51 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9aa46ea301..a66bdd9e8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1542,10 +1542,11 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1660,12 +1661,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -14450,16 +14453,17 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -14853,6 +14857,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14869,6 +14874,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -14878,6 +14884,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14893,6 +14900,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14903,6 +14911,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14919,6 +14928,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -14931,6 +14941,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14943,6 +14954,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -14959,6 +14971,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -14968,6 +14981,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14984,6 +14998,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -14996,6 +15011,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15004,13 +15020,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -15026,6 +15044,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15038,6 +15057,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -15053,6 +15073,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -15068,6 +15089,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15077,6 +15099,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15089,6 +15112,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -15101,6 +15125,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, From 33ed2ae5cde7a3300533f6aeffc659993a809d38 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 01:46:36 +0000 Subject: [PATCH 02/71] chore(deps): update dependency @playwright/test to v1.47.2 (#5845) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index a66bdd9e8f..1e60507f95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8414,13 +8414,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.47.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.1.tgz", - "integrity": "sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", + "integrity": "sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.47.1" + "playwright": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -22020,13 +22020,13 @@ } }, "node_modules/playwright": { - "version": "1.47.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.1.tgz", - "integrity": "sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz", + "integrity": "sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.47.1" + "playwright-core": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -22039,9 +22039,9 @@ } }, "node_modules/playwright-core": { - "version": "1.47.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.1.tgz", - "integrity": "sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", + "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -26460,7 +26460,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.30.0", + "@playwright/test": "^1.47.2", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", From c0bc0b24337b1240bf1a7d4aaadde7d98cdcba70 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Mon, 23 Sep 2024 03:14:20 -0500 Subject: [PATCH 03/71] chore: release main (#5844) Co-authored-by: Ivan Zarea --- .release-please-manifest.json | 8 ++++---- package-lock.json | 16 ++++++++-------- packages/build-info/CHANGELOG.md | 7 +++++++ packages/build-info/package.json | 2 +- packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 7 +++++++ packages/zip-it-and-ship-it/package.json | 2 +- 10 files changed, 52 insertions(+), 19 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index afc3eb64d7..e64c2f5524 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { - "packages/build-info": "7.14.3", - "packages/build": "29.54.4", + "packages/build-info": "7.14.4", + "packages/build": "29.54.5", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.83", + "packages/functions-utils": "5.2.84", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.39.2" + "packages/zip-it-and-ship-it": "9.39.3" } diff --git a/package-lock.json b/package-lock.json index 1e60507f95..e6e92692f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26335,7 +26335,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.54.4", + "version": "29.54.5", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26344,12 +26344,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.83", + "@netlify/functions-utils": "^5.2.84", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.2", + "@netlify/zip-it-and-ship-it": "9.39.3", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -26442,7 +26442,7 @@ }, "packages/build-info": { "name": "@netlify/build-info", - "version": "7.14.3", + "version": "7.14.4", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.20.0", @@ -26460,7 +26460,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.47.2", + "@playwright/test": "^1.30.0", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", @@ -27147,10 +27147,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.83", + "version": "5.2.84", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.2", + "@netlify/zip-it-and-ship-it": "9.39.3", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27602,7 +27602,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.2", + "version": "9.39.3", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build-info/CHANGELOG.md b/packages/build-info/CHANGELOG.md index 7b4c441ee3..ff8060ec0f 100644 --- a/packages/build-info/CHANGELOG.md +++ b/packages/build-info/CHANGELOG.md @@ -64,6 +64,13 @@ * dependencies * @netlify/framework-info bumped from ^9.8.8 to ^9.8.9 +## [7.14.4](https://github.com/netlify/build/compare/build-info-v7.14.3...build-info-v7.14.4) (2024-09-23) + + +### Bug Fixes + +* set default nodejs version for redwoodjs ([#5842](https://github.com/netlify/build/issues/5842)) ([a3dfb7e](https://github.com/netlify/build/commit/a3dfb7e9664a9968e7575e43ab653a089a4ede0b)) + ## [7.14.3](https://github.com/netlify/build/compare/build-info-v7.14.2...build-info-v7.14.3) (2024-09-20) diff --git a/packages/build-info/package.json b/packages/build-info/package.json index eb08f999d0..0175a7188b 100644 --- a/packages/build-info/package.json +++ b/packages/build-info/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build-info", - "version": "7.14.3", + "version": "7.14.4", "description": "Build info utility", "type": "module", "exports": { diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 1e649a7a93..d35e5191c7 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.54.5](https://github.com/netlify/build/compare/build-v29.54.4...build-v29.54.5) (2024-09-23) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.83 to ^5.2.84 + * @netlify/zip-it-and-ship-it bumped from 9.39.2 to 9.39.3 + ## [29.54.4](https://github.com/netlify/build/compare/build-v29.54.3...build-v29.54.4) (2024-09-20) diff --git a/packages/build/package.json b/packages/build/package.json index 7f23d7ff5c..7254ba8f82 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.54.4", + "version": "29.54.5", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.83", + "@netlify/functions-utils": "^5.2.84", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.2", + "@netlify/zip-it-and-ship-it": "9.39.3", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 0201f9f226..96e37f083d 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.84](https://github.com/netlify/build/compare/functions-utils-v5.2.83...functions-utils-v5.2.84) (2024-09-23) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.39.2 to 9.39.3 + ## [5.2.83](https://github.com/netlify/build/compare/functions-utils-v5.2.82...functions-utils-v5.2.83) (2024-09-20) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index 6b8c5a83c5..c9fe0cb96d 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.83", + "version": "5.2.84", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.2", + "@netlify/zip-it-and-ship-it": "9.39.3", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index ed3a81abdd..f8af2881e6 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.39.3](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.2...zip-it-and-ship-it-v9.39.3) (2024-09-23) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.24.0 ([#5843](https://github.com/netlify/build/issues/5843)) ([7c88c52](https://github.com/netlify/build/commit/7c88c52732cf2916247ba5bbe8875eabcb709bfd)) + ## [9.39.2](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.1...zip-it-and-ship-it-v9.39.2) (2024-09-20) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 112fdc85ca..5f173b3e9e 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.2", + "version": "9.39.3", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 501b55544e2c9a01f0e5b7474217d445bda7754d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 13:32:51 +0000 Subject: [PATCH 04/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.24.1 (#5847) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6e92692f2..28facba5ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.24.0.tgz", - "integrity": "sha512-W5LL8EJaZWmPXtjk99C/C6HOEtkQvtBgScQIVNgYPjATyGnYWo8KqJJ45zKxsLuby7jO1+YsRijBJm0nNRR3Nw==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.24.1.tgz", + "integrity": "sha512-PubClm9HDy5a5XdnC/3Vzhs3hgt/G5Ores+KNVQtWWi9bV/Xv5j435z8AvtwIaJT3VVCu/bO6bf+Rdrwwf7eQw==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27608,7 +27608,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.24.0", + "@netlify/serverless-functions-api": "^1.24.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 5f173b3e9e..5ef86408a8 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.24.0", + "@netlify/serverless-functions-api": "^1.24.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 3998337b86c7f1538d112c6dbb8b861531070862 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:47:37 +0000 Subject: [PATCH 05/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.25.0 (#5849) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 28facba5ee..df9a345d04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.24.1.tgz", - "integrity": "sha512-PubClm9HDy5a5XdnC/3Vzhs3hgt/G5Ores+KNVQtWWi9bV/Xv5j435z8AvtwIaJT3VVCu/bO6bf+Rdrwwf7eQw==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.25.0.tgz", + "integrity": "sha512-6ecGMHc8fHESR/vXTKn6os7lyAreKIw18X4XapnxweLwZn07nKlES9CmBkx8Dbb4aoaGeTQBMjW5jjshADc/eA==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27608,7 +27608,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.24.1", + "@netlify/serverless-functions-api": "^1.25.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 5ef86408a8..87463bb5c2 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.24.1", + "@netlify/serverless-functions-api": "^1.25.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From efd600c8411cab0a9a9a8ccbbc50942724bd1cd5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:19:57 +0000 Subject: [PATCH 06/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.26.0 (#5850) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index df9a345d04..817690f50c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.25.0.tgz", - "integrity": "sha512-6ecGMHc8fHESR/vXTKn6os7lyAreKIw18X4XapnxweLwZn07nKlES9CmBkx8Dbb4aoaGeTQBMjW5jjshADc/eA==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.0.tgz", + "integrity": "sha512-++/5CIk1iXnVhRMzHLdhKWFZrSh0GhaQtYU9O0UJDo2XKp2qv7Vj0hynXLCUyQwo8h2OkrwGPRc2ld2JUvWkfA==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27608,7 +27608,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.25.0", + "@netlify/serverless-functions-api": "^1.26.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 87463bb5c2..9293ed1267 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.25.0", + "@netlify/serverless-functions-api": "^1.26.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 32f7660261edde62ee50cd9728e94af7a4d052e9 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Tue, 24 Sep 2024 10:25:17 -0500 Subject: [PATCH 07/71] chore: release main (#5848) --- .release-please-manifest.json | 6 +++--- package-lock.json | 12 ++++++------ packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 9 +++++++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 43 insertions(+), 15 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e64c2f5524..419ab66703 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.14.4", - "packages/build": "29.54.5", + "packages/build": "29.54.6", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.84", + "packages/functions-utils": "5.2.85", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.39.3" + "packages/zip-it-and-ship-it": "9.39.4" } diff --git a/package-lock.json b/package-lock.json index 817690f50c..f517f5432a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26335,7 +26335,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.54.5", + "version": "29.54.6", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26344,12 +26344,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.84", + "@netlify/functions-utils": "^5.2.85", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.3", + "@netlify/zip-it-and-ship-it": "9.39.4", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -27147,10 +27147,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.84", + "version": "5.2.85", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.3", + "@netlify/zip-it-and-ship-it": "9.39.4", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27602,7 +27602,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.3", + "version": "9.39.4", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index d35e5191c7..d261dfe39b 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.54.6](https://github.com/netlify/build/compare/build-v29.54.5...build-v29.54.6) (2024-09-24) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.84 to ^5.2.85 + * @netlify/zip-it-and-ship-it bumped from 9.39.3 to 9.39.4 + ## [29.54.5](https://github.com/netlify/build/compare/build-v29.54.4...build-v29.54.5) (2024-09-23) diff --git a/packages/build/package.json b/packages/build/package.json index 7254ba8f82..75e7cae1e4 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.54.5", + "version": "29.54.6", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.84", + "@netlify/functions-utils": "^5.2.85", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.3", + "@netlify/zip-it-and-ship-it": "9.39.4", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 96e37f083d..467cf6e0fa 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.85](https://github.com/netlify/build/compare/functions-utils-v5.2.84...functions-utils-v5.2.85) (2024-09-24) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.39.3 to 9.39.4 + ## [5.2.84](https://github.com/netlify/build/compare/functions-utils-v5.2.83...functions-utils-v5.2.84) (2024-09-23) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index c9fe0cb96d..a910455214 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.84", + "version": "5.2.85", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.3", + "@netlify/zip-it-and-ship-it": "9.39.4", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index f8af2881e6..2f1209dcaf 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.39.4](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.3...zip-it-and-ship-it-v9.39.4) (2024-09-24) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.24.1 ([#5847](https://github.com/netlify/build/issues/5847)) ([501b555](https://github.com/netlify/build/commit/501b55544e2c9a01f0e5b7474217d445bda7754d)) +* **deps:** update dependency @netlify/serverless-functions-api to ^1.25.0 ([#5849](https://github.com/netlify/build/issues/5849)) ([3998337](https://github.com/netlify/build/commit/3998337b86c7f1538d112c6dbb8b861531070862)) +* **deps:** update dependency @netlify/serverless-functions-api to ^1.26.0 ([#5850](https://github.com/netlify/build/issues/5850)) ([efd600c](https://github.com/netlify/build/commit/efd600c8411cab0a9a9a8ccbbc50942724bd1cd5)) + ## [9.39.3](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.2...zip-it-and-ship-it-v9.39.3) (2024-09-23) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 9293ed1267..1b776e155a 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.3", + "version": "9.39.4", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From c5e7f26141b9237e75a52b0ed9ecc7ccb5e504a4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:35:04 +0000 Subject: [PATCH 08/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.26.1 (#5854) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f517f5432a..955b17f52f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.0.tgz", - "integrity": "sha512-++/5CIk1iXnVhRMzHLdhKWFZrSh0GhaQtYU9O0UJDo2XKp2qv7Vj0hynXLCUyQwo8h2OkrwGPRc2ld2JUvWkfA==", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz", + "integrity": "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27608,7 +27608,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.26.0", + "@netlify/serverless-functions-api": "^1.26.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 1b776e155a..9dae0497d4 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.26.0", + "@netlify/serverless-functions-api": "^1.26.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 8f5eeda6b3cbc21ad8fb8239f3e8d0c9e527cec7 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Thu, 26 Sep 2024 07:57:37 -0500 Subject: [PATCH 09/71] chore: release main (#5855) --- .release-please-manifest.json | 6 +++--- package-lock.json | 12 ++++++------ packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 7 +++++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 41 insertions(+), 15 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 419ab66703..134e0abb58 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.14.4", - "packages/build": "29.54.6", + "packages/build": "29.54.7", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.85", + "packages/functions-utils": "5.2.86", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.39.4" + "packages/zip-it-and-ship-it": "9.39.5" } diff --git a/package-lock.json b/package-lock.json index 955b17f52f..1d92a53053 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26335,7 +26335,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.54.6", + "version": "29.54.7", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26344,12 +26344,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.85", + "@netlify/functions-utils": "^5.2.86", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.4", + "@netlify/zip-it-and-ship-it": "9.39.5", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -27147,10 +27147,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.85", + "version": "5.2.86", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.4", + "@netlify/zip-it-and-ship-it": "9.39.5", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27602,7 +27602,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.4", + "version": "9.39.5", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index d261dfe39b..22dfe35dde 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.54.7](https://github.com/netlify/build/compare/build-v29.54.6...build-v29.54.7) (2024-09-26) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.85 to ^5.2.86 + * @netlify/zip-it-and-ship-it bumped from 9.39.4 to 9.39.5 + ## [29.54.6](https://github.com/netlify/build/compare/build-v29.54.5...build-v29.54.6) (2024-09-24) diff --git a/packages/build/package.json b/packages/build/package.json index 75e7cae1e4..61437ce47a 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.54.6", + "version": "29.54.7", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.85", + "@netlify/functions-utils": "^5.2.86", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.4", + "@netlify/zip-it-and-ship-it": "9.39.5", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 467cf6e0fa..7ac82eb510 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.86](https://github.com/netlify/build/compare/functions-utils-v5.2.85...functions-utils-v5.2.86) (2024-09-26) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.39.4 to 9.39.5 + ## [5.2.85](https://github.com/netlify/build/compare/functions-utils-v5.2.84...functions-utils-v5.2.85) (2024-09-24) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index a910455214..f604e732a2 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.85", + "version": "5.2.86", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.4", + "@netlify/zip-it-and-ship-it": "9.39.5", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index 2f1209dcaf..9597386394 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.39.5](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.4...zip-it-and-ship-it-v9.39.5) (2024-09-26) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.26.1 ([#5854](https://github.com/netlify/build/issues/5854)) ([c5e7f26](https://github.com/netlify/build/commit/c5e7f26141b9237e75a52b0ed9ecc7ccb5e504a4)) + ## [9.39.4](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.3...zip-it-and-ship-it-v9.39.4) (2024-09-24) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 9dae0497d4..9203607352 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.4", + "version": "9.39.5", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 3290436ab2598c3010db8f7c87cce508ace23de9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:06:58 +0000 Subject: [PATCH 10/71] chore(deps): update dependency vite to v4.5.5 [security] (#5851) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d92a53053..328eca9158 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25195,10 +25195,11 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -25280,6 +25281,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -25294,6 +25296,7 @@ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -26470,7 +26473,7 @@ "node-fetch": "^3.3.1", "typescript": "^5.0.0", "unionfs": "^4.4.0", - "vite": "^4.0.4", + "vite": "^4.5.5", "vitest": "^0.34.0" }, "engines": { @@ -27138,7 +27141,7 @@ "rollup-plugin-node-polyfills": "^0.2.1", "tmp-promise": "^3.0.2", "typescript": "^5.0.0", - "vite": "^4.0.4", + "vite": "^4.5.5", "vitest": "^0.34.0" }, "engines": { @@ -27342,7 +27345,7 @@ "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", "typescript": "^5.0.0", - "vite": "^4.0.4", + "vite": "^4.5.5", "vitest": "^0.34.0" }, "engines": { @@ -27371,7 +27374,7 @@ "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", "typescript": "^5.0.0", - "vite": "^4.0.4", + "vite": "^4.5.5", "vitest": "^0.34.0" }, "engines": { From 5d39779bf6cee5760f47d04243d08509e4d31d5e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 01:26:28 +0000 Subject: [PATCH 11/71] chore(deps): update dependency babel-loader to v8.4.1 (#5859) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 328eca9158..18aaf11e84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10435,12 +10435,14 @@ "license": "ISC" }, "node_modules/babel-loader": { - "version": "8.3.0", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", "dev": true, "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", + "loader-utils": "^2.0.4", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -26473,7 +26475,7 @@ "node-fetch": "^3.3.1", "typescript": "^5.0.0", "unionfs": "^4.4.0", - "vite": "^4.5.5", + "vite": "^4.0.4", "vitest": "^0.34.0" }, "engines": { @@ -27132,7 +27134,7 @@ "semver": "^7.3.8" }, "devDependencies": { - "babel-loader": "^8.2.2", + "babel-loader": "^8.4.1", "cpy": "^9.0.0", "cpy-cli": "^4.0.0", "fast-glob": "^3.2.12", @@ -27141,7 +27143,7 @@ "rollup-plugin-node-polyfills": "^0.2.1", "tmp-promise": "^3.0.2", "typescript": "^5.0.0", - "vite": "^4.5.5", + "vite": "^4.0.4", "vitest": "^0.34.0" }, "engines": { @@ -27345,7 +27347,7 @@ "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", "typescript": "^5.0.0", - "vite": "^4.5.5", + "vite": "^4.0.4", "vitest": "^0.34.0" }, "engines": { @@ -27374,7 +27376,7 @@ "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", "typescript": "^5.0.0", - "vite": "^4.5.5", + "vite": "^4.0.4", "vitest": "^0.34.0" }, "engines": { From c6a3f3b2a5ead444601459909449c63236ba7b5d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 03:26:21 +0000 Subject: [PATCH 12/71] fix(deps): update dependency hot-shots to v10.1.1 (#5861) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 +++++--- packages/build/package.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18aaf11e84..9e045b036c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16816,7 +16816,9 @@ } }, "node_modules/hot-shots": { - "version": "10.0.0", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.1.1.tgz", + "integrity": "sha512-KTsH9hb+YZHH0IIRf22y0X8mPw8j521W5xRAUeaUlGNBDsf44ixE7ZeyXbUHd/nQ1n04UEhi2ja05/QVOS/CgQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -26364,7 +26366,7 @@ "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", - "hot-shots": "10.0.0", + "hot-shots": "10.1.1", "indent-string": "^5.0.0", "is-plain-obj": "^4.0.0", "js-yaml": "^4.0.0", @@ -27134,7 +27136,7 @@ "semver": "^7.3.8" }, "devDependencies": { - "babel-loader": "^8.4.1", + "babel-loader": "^8.2.2", "cpy": "^9.0.0", "cpy-cli": "^4.0.0", "fast-glob": "^3.2.12", diff --git a/packages/build/package.json b/packages/build/package.json index 61437ce47a..ba95d2e8fe 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -88,7 +88,7 @@ "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", - "hot-shots": "10.0.0", + "hot-shots": "10.1.1", "indent-string": "^5.0.0", "is-plain-obj": "^4.0.0", "js-yaml": "^4.0.0", From dd8680932f0c02aec5dd6fba0ac43af3347eb213 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:28:48 +0000 Subject: [PATCH 13/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.27.0 (#5864) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e045b036c..aa5157dadb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz", - "integrity": "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.27.0.tgz", + "integrity": "sha512-FCFkcj+3TFUSPZ66x+n2s8tAp0NdeHJdozpoQweeErveBCA9RdNluhMGPv30AIeqJT0TVkNqPobUi40ujFgf9w==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27615,7 +27615,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.26.1", + "@netlify/serverless-functions-api": "^1.27.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 9203607352..b9b0bd4155 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.26.1", + "@netlify/serverless-functions-api": "^1.27.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 672281ec6a943e911f86ec5f67db3b2a9c4c84a5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:01:31 +0000 Subject: [PATCH 14/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.28.0 (#5865) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa5157dadb..df8a08d678 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.27.0.tgz", - "integrity": "sha512-FCFkcj+3TFUSPZ66x+n2s8tAp0NdeHJdozpoQweeErveBCA9RdNluhMGPv30AIeqJT0TVkNqPobUi40ujFgf9w==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.28.0.tgz", + "integrity": "sha512-fL7RbUUhZzflSkkxYRaPiFxfh77ZxyTta0I4N5fS+oRe32zrt45KUc+E9R4a4jedgqQ3XdAsBN3i8jItN1x9ww==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27615,7 +27615,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.27.0", + "@netlify/serverless-functions-api": "^1.28.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index b9b0bd4155..c01bec61d0 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.27.0", + "@netlify/serverless-functions-api": "^1.28.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 1947caec62b8a04c78e91647a4652598c9f28fbd Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Tue, 1 Oct 2024 05:22:16 -0500 Subject: [PATCH 15/71] chore: release main (#5863) --- .release-please-manifest.json | 6 +++--- package-lock.json | 12 ++++++------ packages/build/CHANGELOG.md | 15 +++++++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 8 ++++++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 47 insertions(+), 15 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 134e0abb58..0890e11c46 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.14.4", - "packages/build": "29.54.7", + "packages/build": "29.54.8", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.86", + "packages/functions-utils": "5.2.87", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.39.5" + "packages/zip-it-and-ship-it": "9.39.6" } diff --git a/package-lock.json b/package-lock.json index df8a08d678..452e4749da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26342,7 +26342,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.54.7", + "version": "29.54.8", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26351,12 +26351,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.86", + "@netlify/functions-utils": "^5.2.87", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.5", + "@netlify/zip-it-and-ship-it": "9.39.6", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -27154,10 +27154,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.86", + "version": "5.2.87", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.5", + "@netlify/zip-it-and-ship-it": "9.39.6", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27609,7 +27609,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.5", + "version": "9.39.6", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 22dfe35dde..55bdf5943b 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,21 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.54.8](https://github.com/netlify/build/compare/build-v29.54.7...build-v29.54.8) (2024-10-01) + + +### Bug Fixes + +* **deps:** update dependency hot-shots to v10.1.1 ([#5861](https://github.com/netlify/build/issues/5861)) ([c6a3f3b](https://github.com/netlify/build/commit/c6a3f3b2a5ead444601459909449c63236ba7b5d)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.86 to ^5.2.87 + * @netlify/zip-it-and-ship-it bumped from 9.39.5 to 9.39.6 + ## [29.54.7](https://github.com/netlify/build/compare/build-v29.54.6...build-v29.54.7) (2024-09-26) diff --git a/packages/build/package.json b/packages/build/package.json index ba95d2e8fe..541de0b888 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.54.7", + "version": "29.54.8", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.86", + "@netlify/functions-utils": "^5.2.87", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.5", + "@netlify/zip-it-and-ship-it": "9.39.6", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 7ac82eb510..d5af1bd886 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.87](https://github.com/netlify/build/compare/functions-utils-v5.2.86...functions-utils-v5.2.87) (2024-10-01) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.39.5 to 9.39.6 + ## [5.2.86](https://github.com/netlify/build/compare/functions-utils-v5.2.85...functions-utils-v5.2.86) (2024-09-26) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index f604e732a2..810202ec13 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.86", + "version": "5.2.87", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.5", + "@netlify/zip-it-and-ship-it": "9.39.6", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index 9597386394..c0362addd6 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.39.6](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.5...zip-it-and-ship-it-v9.39.6) (2024-10-01) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.27.0 ([#5864](https://github.com/netlify/build/issues/5864)) ([dd86809](https://github.com/netlify/build/commit/dd8680932f0c02aec5dd6fba0ac43af3347eb213)) +* **deps:** update dependency @netlify/serverless-functions-api to ^1.28.0 ([#5865](https://github.com/netlify/build/issues/5865)) ([672281e](https://github.com/netlify/build/commit/672281ec6a943e911f86ec5f67db3b2a9c4c84a5)) + ## [9.39.5](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.4...zip-it-and-ship-it-v9.39.5) (2024-09-26) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index c01bec61d0..7d0efb0f37 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.5", + "version": "9.39.6", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 3a780856002ac59df7f6da50b3d521ca14c09f7c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:35:01 +0000 Subject: [PATCH 16/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.28.1 (#5867) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 452e4749da..966deb540b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.28.0.tgz", - "integrity": "sha512-fL7RbUUhZzflSkkxYRaPiFxfh77ZxyTta0I4N5fS+oRe32zrt45KUc+E9R4a4jedgqQ3XdAsBN3i8jItN1x9ww==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.28.1.tgz", + "integrity": "sha512-FbGnw+BmgK9+UwkyF2t1YceUB62b4/AM67eBQqlJHML/zCZyRJQQ0lBSds5Lh5KScG+OL6fjYgeENIPbgcaL1g==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27615,7 +27615,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.28.0", + "@netlify/serverless-functions-api": "^1.28.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 7d0efb0f37..8fe5b2317b 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.28.0", + "@netlify/serverless-functions-api": "^1.28.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 1aa78f45de2a97001083bb3a29eceb2afc5064f7 Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Tue, 1 Oct 2024 16:42:13 +0100 Subject: [PATCH 17/71] feat: framework detection for tanstack router and tanstack start (#5857) * feat: framework detection for tanstack router and tanstack start * feat: remove TanStack logos for now * feat: add TanStack logos as PNGs for now * feat: add tanstack to main framework list * feat: ensure vite doesn't match when using tanstack * fix: use vite dev to avoid mismatching npm scripts Co-authored-by: Philippe Serhal * test(build-info): add TanStack detection tests --------- Co-authored-by: Philippe Serhal --- .../assets/logos/tanstack-router/default.png | Bin 0 -> 160258 bytes .../assets/logos/tanstack-start/default.png | Bin 0 -> 160258 bytes packages/build-info/src/frameworks/index.ts | 4 ++ .../src/frameworks/tanstack-router.test.ts | 44 ++++++++++++++++++ .../src/frameworks/tanstack-router.ts | 26 +++++++++++ .../src/frameworks/tanstack-start.test.ts | 43 +++++++++++++++++ .../src/frameworks/tanstack-start.ts | 25 ++++++++++ packages/build-info/src/frameworks/vite.ts | 2 + 8 files changed, 144 insertions(+) create mode 100644 packages/build-info/assets/logos/tanstack-router/default.png create mode 100644 packages/build-info/assets/logos/tanstack-start/default.png create mode 100644 packages/build-info/src/frameworks/tanstack-router.test.ts create mode 100644 packages/build-info/src/frameworks/tanstack-router.ts create mode 100644 packages/build-info/src/frameworks/tanstack-start.test.ts create mode 100644 packages/build-info/src/frameworks/tanstack-start.ts diff --git a/packages/build-info/assets/logos/tanstack-router/default.png b/packages/build-info/assets/logos/tanstack-router/default.png new file mode 100644 index 0000000000000000000000000000000000000000..ec5d6214278523c3e3731aee40a0e964dfb2dc39 GIT binary patch literal 160258 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
4A_VH*>N5>{oz1x{Fu$`11pH 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 literal 0 HcmV?d00001 diff --git a/packages/build-info/assets/logos/tanstack-start/default.png b/packages/build-info/assets/logos/tanstack-start/default.png new file mode 100644 index 0000000000000000000000000000000000000000..ec5d6214278523c3e3731aee40a0e964dfb2dc39 GIT binary patch literal 160258 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
4A_VH*>N5>{oz1x{Fu$`11pH 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 literal 0 HcmV?d00001 diff --git a/packages/build-info/src/frameworks/index.ts b/packages/build-info/src/frameworks/index.ts index 624ddd522b..8eb32cc8fd 100644 --- a/packages/build-info/src/frameworks/index.ts +++ b/packages/build-info/src/frameworks/index.ts @@ -39,6 +39,8 @@ import { Solid } from './solid.js' import { Stencil } from './stencil.js' import { SvelteKit } from './svelte-kit.js' import { Svelte } from './svelte.js' +import { TanStackRouter } from './tanstack-router.js' +import { TanStackStart } from './tanstack-start.js' import { Vite } from './vite.js' import { Vue } from './vue.js' import { VuePress } from './vuepress.js' @@ -69,6 +71,8 @@ export const frameworks = [ Solid, SolidStart, Stencil, + TanStackRouter, + TanStackStart, VuePress, Assemble, DocPad, diff --git a/packages/build-info/src/frameworks/tanstack-router.test.ts b/packages/build-info/src/frameworks/tanstack-router.test.ts new file mode 100644 index 0000000000..0ae21dffd3 --- /dev/null +++ b/packages/build-info/src/frameworks/tanstack-router.test.ts @@ -0,0 +1,44 @@ +import { beforeEach, expect, test } from 'vitest' + +import { mockFileSystem } from '../../tests/mock-file-system.js' +import { NodeFS } from '../node/file-system.js' +import { Project } from '../project.js' + +beforeEach((ctx) => { + ctx.fs = new NodeFS() +}) + +test('detects a TanStack Router site', async ({ fs }) => { + const cwd = mockFileSystem({ + 'package.json': JSON.stringify({ + scripts: { + dev: 'vite --port=3001', + build: 'vite build && tsc --noEmit', + serve: 'vite preview', + start: 'vite', + }, + dependencies: { + '@tanstack/react-router': '^1.58.15', + '@tanstack/router-devtools': '^1.58.15', + '@tanstack/router-plugin': '^1.58.12', + react: '^18.2.0', + 'react-dom': '^18.2.0', + }, + devDependencies: { + vite: '^5.4.5', + }, + }), + }) + const detected = await new Project(fs, cwd).detectFrameworks() + + const detectedFrameworks = (detected ?? []).map((framework) => framework.id) + expect(detectedFrameworks).not.toContain('vinxi') + expect(detectedFrameworks).not.toContain('vite') + expect(detectedFrameworks).not.toContain('tanstack-start') + + expect(detected?.[0]?.id).toBe('tanstack-router') + expect(detected?.[0]?.build?.command).toBe('vite build') + expect(detected?.[0]?.build?.directory).toBe('dist') + expect(detected?.[0]?.dev?.command).toBe('vite dev') + expect(detected?.[0]?.dev?.port).toBe(3000) +}) diff --git a/packages/build-info/src/frameworks/tanstack-router.ts b/packages/build-info/src/frameworks/tanstack-router.ts new file mode 100644 index 0000000000..6dd1820aa2 --- /dev/null +++ b/packages/build-info/src/frameworks/tanstack-router.ts @@ -0,0 +1,26 @@ +import { BaseFramework, Category, Framework } from './framework.js' + +export class TanStackRouter extends BaseFramework implements Framework { + readonly id = 'tanstack-router' + name = 'TanStack Router' + npmDependencies = ['@tanstack/react-router'] + excludedNpmDependencies = ['@tanstack/start'] + category = Category.SSG + + dev = { + command: 'vite dev', + port: 3000, + pollingStrategies: [{ name: 'TCP' }], + } + + build = { + command: 'vite build', + directory: 'dist', + } + + logo = { + default: '/logos/tanstack-router/default.png', + light: '/logos/tanstack-router/default.png', + dark: '/logos/tanstack-router/default.png', + } +} diff --git a/packages/build-info/src/frameworks/tanstack-start.test.ts b/packages/build-info/src/frameworks/tanstack-start.test.ts new file mode 100644 index 0000000000..e739b9263f --- /dev/null +++ b/packages/build-info/src/frameworks/tanstack-start.test.ts @@ -0,0 +1,43 @@ +import { beforeEach, expect, test } from 'vitest' + +import { mockFileSystem } from '../../tests/mock-file-system.js' +import { NodeFS } from '../node/file-system.js' +import { Project } from '../project.js' + +beforeEach((ctx) => { + ctx.fs = new NodeFS() +}) + +test('detects a TanStack Start site', async ({ fs }) => { + const cwd = mockFileSystem({ + 'package.json': JSON.stringify({ + scripts: { + dev: 'vinxi dev', + build: 'vinxi build', + start: 'vinxi start', + }, + dependencies: { + '@tanstack/react-router': '^1.58.15', + '@tanstack/router-devtools': '^1.58.15', + '@tanstack/start': '^1.58.15', + react: '^18.3.1', + 'react-dom': '^18.3.1', + }, + devDependencies: { + vinxi: '0.4.3', + }, + }), + }) + const detected = await new Project(fs, cwd).detectFrameworks() + + const detectedFrameworks = (detected ?? []).map((framework) => framework.id) + expect(detectedFrameworks).not.toContain('vinxi') + expect(detectedFrameworks).not.toContain('vite') + expect(detectedFrameworks).not.toContain('tanstack-router') + + expect(detected?.[0]?.id).toBe('tanstack-start') + expect(detected?.[0]?.build?.command).toBe('vinxi build') + expect(detected?.[0]?.build?.directory).toBe('dist') + expect(detected?.[0]?.dev?.command).toBe('vinxi dev') + expect(detected?.[0]?.dev?.port).toBe(3000) +}) diff --git a/packages/build-info/src/frameworks/tanstack-start.ts b/packages/build-info/src/frameworks/tanstack-start.ts new file mode 100644 index 0000000000..d148af6538 --- /dev/null +++ b/packages/build-info/src/frameworks/tanstack-start.ts @@ -0,0 +1,25 @@ +import { BaseFramework, Category, Framework } from './framework.js' + +export class TanStackStart extends BaseFramework implements Framework { + readonly id = 'tanstack-start' + name = 'TanStack Start' + npmDependencies = ['@tanstack/start'] + category = Category.SSG + + dev = { + command: 'vinxi dev', + port: 3000, + pollingStrategies: [{ name: 'TCP' }], + } + + build = { + command: 'vinxi build', + directory: 'dist', + } + + logo = { + default: '/logos/tanstack-start/default.png', + light: '/logos/tanstack-start/default.png', + dark: '/logos/tanstack-start/default.png', + } +} diff --git a/packages/build-info/src/frameworks/vite.ts b/packages/build-info/src/frameworks/vite.ts index 52f2a258c1..a63a0697d3 100644 --- a/packages/build-info/src/frameworks/vite.ts +++ b/packages/build-info/src/frameworks/vite.ts @@ -12,6 +12,8 @@ export class Vite extends BaseFramework implements Framework { '@builder.io/qwik', 'solid-start', 'solid-js', + '@tanstack/react-router', + '@tanstack/start', '@sveltejs/kit', '@analogjs/platform', ] From d4966fbd18ba01d2721334ddcecc0f188bb3bb3c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:07:41 +0000 Subject: [PATCH 18/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.29.0 (#5869) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 966deb540b..8a3e037323 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.28.1.tgz", - "integrity": "sha512-FbGnw+BmgK9+UwkyF2t1YceUB62b4/AM67eBQqlJHML/zCZyRJQQ0lBSds5Lh5KScG+OL6fjYgeENIPbgcaL1g==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.29.0.tgz", + "integrity": "sha512-dSJu+l0tM2Zru9MvDA6ewPwJyU3vYvOUD7jLZyMWvF4arT0X9l+7VIOSaJS8vJDpWhz90ycr1agXv6Uk7+b4uA==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27615,7 +27615,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.28.1", + "@netlify/serverless-functions-api": "^1.29.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 8fe5b2317b..8780fd97c0 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.28.1", + "@netlify/serverless-functions-api": "^1.29.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 071380e124c271d1e7398ca3b665b33c33051c4a Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:55:07 -0500 Subject: [PATCH 19/71] chore: release main (#5868) --- .release-please-manifest.json | 8 ++++---- package-lock.json | 14 +++++++------- packages/build-info/CHANGELOG.md | 7 +++++++ packages/build-info/package.json | 2 +- packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 8 ++++++++ packages/zip-it-and-ship-it/package.json | 2 +- 10 files changed, 52 insertions(+), 18 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 0890e11c46..943fb788dd 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { - "packages/build-info": "7.14.4", - "packages/build": "29.54.8", + "packages/build-info": "7.15.0", + "packages/build": "29.54.9", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.87", + "packages/functions-utils": "5.2.88", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.39.6" + "packages/zip-it-and-ship-it": "9.39.7" } diff --git a/package-lock.json b/package-lock.json index 8a3e037323..ca46b11b97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26342,7 +26342,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.54.8", + "version": "29.54.9", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26351,12 +26351,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.87", + "@netlify/functions-utils": "^5.2.88", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.6", + "@netlify/zip-it-and-ship-it": "9.39.7", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -26449,7 +26449,7 @@ }, "packages/build-info": { "name": "@netlify/build-info", - "version": "7.14.4", + "version": "7.15.0", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.20.0", @@ -27154,10 +27154,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.87", + "version": "5.2.88", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.6", + "@netlify/zip-it-and-ship-it": "9.39.7", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27609,7 +27609,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.6", + "version": "9.39.7", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build-info/CHANGELOG.md b/packages/build-info/CHANGELOG.md index ff8060ec0f..91b790c877 100644 --- a/packages/build-info/CHANGELOG.md +++ b/packages/build-info/CHANGELOG.md @@ -64,6 +64,13 @@ * dependencies * @netlify/framework-info bumped from ^9.8.8 to ^9.8.9 +## [7.15.0](https://github.com/netlify/build/compare/build-info-v7.14.4...build-info-v7.15.0) (2024-10-01) + + +### Features + +* framework detection for tanstack router and tanstack start ([#5857](https://github.com/netlify/build/issues/5857)) ([1aa78f4](https://github.com/netlify/build/commit/1aa78f45de2a97001083bb3a29eceb2afc5064f7)) + ## [7.14.4](https://github.com/netlify/build/compare/build-info-v7.14.3...build-info-v7.14.4) (2024-09-23) diff --git a/packages/build-info/package.json b/packages/build-info/package.json index 0175a7188b..baf1255a8c 100644 --- a/packages/build-info/package.json +++ b/packages/build-info/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build-info", - "version": "7.14.4", + "version": "7.15.0", "description": "Build info utility", "type": "module", "exports": { diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 55bdf5943b..0911accbb7 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.54.9](https://github.com/netlify/build/compare/build-v29.54.8...build-v29.54.9) (2024-10-01) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.87 to ^5.2.88 + * @netlify/zip-it-and-ship-it bumped from 9.39.6 to 9.39.7 + ## [29.54.8](https://github.com/netlify/build/compare/build-v29.54.7...build-v29.54.8) (2024-10-01) diff --git a/packages/build/package.json b/packages/build/package.json index 541de0b888..7d972038eb 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.54.8", + "version": "29.54.9", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.87", + "@netlify/functions-utils": "^5.2.88", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.6", + "@netlify/zip-it-and-ship-it": "9.39.7", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index d5af1bd886..7e0231c857 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.88](https://github.com/netlify/build/compare/functions-utils-v5.2.87...functions-utils-v5.2.88) (2024-10-01) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.39.6 to 9.39.7 + ## [5.2.87](https://github.com/netlify/build/compare/functions-utils-v5.2.86...functions-utils-v5.2.87) (2024-10-01) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index 810202ec13..e1b57b4282 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.87", + "version": "5.2.88", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.6", + "@netlify/zip-it-and-ship-it": "9.39.7", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index c0362addd6..d2e18986a1 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.39.7](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.6...zip-it-and-ship-it-v9.39.7) (2024-10-01) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.28.1 ([#5867](https://github.com/netlify/build/issues/5867)) ([3a78085](https://github.com/netlify/build/commit/3a780856002ac59df7f6da50b3d521ca14c09f7c)) +* **deps:** update dependency @netlify/serverless-functions-api to ^1.29.0 ([#5869](https://github.com/netlify/build/issues/5869)) ([d4966fb](https://github.com/netlify/build/commit/d4966fbd18ba01d2721334ddcecc0f188bb3bb3c)) + ## [9.39.6](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.5...zip-it-and-ship-it-v9.39.6) (2024-10-01) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 8780fd97c0..bbca2ec5df 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.6", + "version": "9.39.7", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 2002b42751bc0bd120086ab32c685f9bf6703237 Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Tue, 1 Oct 2024 10:49:17 -0700 Subject: [PATCH 20/71] fix: framework detection for solidjs and solidstart (#5856) * fix: framework detection for solidjs and solidstart * feat: add dark logo * feat: ensure vite doesn't match for solid start * fix(build-info): reintroduce support for old SolidStart sites also: - add Solid.js and SolidStart detection tests - make the filename for Solid.js match the framework id like all the others - avoid bug elsewhere with using just `vite` as a dev command (I should really write up that bug... sorry) --------- Co-authored-by: Philippe Serhal --- .../assets/logos/solid-start/dark.svg | 1 + packages/build-info/src/frameworks/index.ts | 4 +- .../src/frameworks/solid-js.test.ts | 42 ++++++++++ .../src/frameworks/{solid.ts => solid-js.ts} | 10 +-- .../src/frameworks/solid-start.test.ts | 76 +++++++++++++++++++ .../build-info/src/frameworks/solid-start.ts | 41 ++++++++-- packages/build-info/src/frameworks/vite.ts | 3 + 7 files changed, 163 insertions(+), 14 deletions(-) create mode 100644 packages/build-info/assets/logos/solid-start/dark.svg create mode 100644 packages/build-info/src/frameworks/solid-js.test.ts rename packages/build-info/src/frameworks/{solid.ts => solid-js.ts} (66%) create mode 100644 packages/build-info/src/frameworks/solid-start.test.ts diff --git a/packages/build-info/assets/logos/solid-start/dark.svg b/packages/build-info/assets/logos/solid-start/dark.svg new file mode 100644 index 0000000000..fc61e36c94 --- /dev/null +++ b/packages/build-info/assets/logos/solid-start/dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/build-info/src/frameworks/index.ts b/packages/build-info/src/frameworks/index.ts index 8eb32cc8fd..9cd1b52edc 100644 --- a/packages/build-info/src/frameworks/index.ts +++ b/packages/build-info/src/frameworks/index.ts @@ -34,8 +34,8 @@ import { RedwoodJS } from './redwoodjs.js' import { Remix } from './remix.js' import { Roots } from './roots.js' import { Sapper } from './sapper.js' +import { SolidJs } from './solid-js.js' import { SolidStart } from './solid-start.js' -import { Solid } from './solid.js' import { Stencil } from './stencil.js' import { SvelteKit } from './svelte-kit.js' import { Svelte } from './svelte.js' @@ -68,7 +68,7 @@ export const frameworks = [ ReactStatic, RedwoodJS, Remix, - Solid, + SolidJs, SolidStart, Stencil, TanStackRouter, diff --git a/packages/build-info/src/frameworks/solid-js.test.ts b/packages/build-info/src/frameworks/solid-js.test.ts new file mode 100644 index 0000000000..3b703fbcff --- /dev/null +++ b/packages/build-info/src/frameworks/solid-js.test.ts @@ -0,0 +1,42 @@ +import { beforeEach, expect, test } from 'vitest' + +import { mockFileSystem } from '../../tests/mock-file-system.js' +import { NodeFS } from '../node/file-system.js' +import { Project } from '../project.js' + +beforeEach((ctx) => { + ctx.fs = new NodeFS() +}) + +test('detects a Solid.js site', async ({ fs }) => { + const cwd = mockFileSystem({ + 'package.json': JSON.stringify({ + scripts: { + start: 'vite', + dev: 'vite', + build: 'vite build', + serve: 'vite preview', + }, + dependencies: { + 'solid-js': '^1.8.11', + }, + devDependencies: { + 'solid-devtools': '^0.29.2', + vite: '^5.0.11', + 'vite-plugin-solid': '^2.8.2', + }, + }), + }) + const detected = await new Project(fs, cwd).detectFrameworks() + + const detectedFrameworks = (detected ?? []).map((framework) => framework.id) + expect(detectedFrameworks).not.toContain('vinxi') + expect(detectedFrameworks).not.toContain('vite') + expect(detectedFrameworks).not.toContain('solid-start') + + expect(detected?.[0]?.id).toBe('solid-js') + expect(detected?.[0]?.build?.command).toBe('vite build') + expect(detected?.[0]?.build?.directory).toBe('dist') + expect(detected?.[0]?.dev?.command).toBe('vite dev') + expect(detected?.[0]?.dev?.port).toBe(3000) +}) diff --git a/packages/build-info/src/frameworks/solid.ts b/packages/build-info/src/frameworks/solid-js.ts similarity index 66% rename from packages/build-info/src/frameworks/solid.ts rename to packages/build-info/src/frameworks/solid-js.ts index 36b11ac9f8..93da954c6f 100644 --- a/packages/build-info/src/frameworks/solid.ts +++ b/packages/build-info/src/frameworks/solid-js.ts @@ -1,21 +1,21 @@ import { BaseFramework, Category, Framework } from './framework.js' -export class Solid extends BaseFramework implements Framework { +export class SolidJs extends BaseFramework implements Framework { readonly id = 'solid-js' name = 'SolidJS' npmDependencies = ['solid-js'] - excludedNpmDependencies = ['solid-start'] + excludedNpmDependencies = ['solid-start', '@solidjs/start'] category = Category.SSG dev = { - command: 'npm run dev', + command: 'vite dev', port: 3000, pollingStrategies: [{ name: 'TCP' }], } build = { - command: 'npm run build', - directory: 'netlify', + command: 'vite build', + directory: 'dist', } logo = { diff --git a/packages/build-info/src/frameworks/solid-start.test.ts b/packages/build-info/src/frameworks/solid-start.test.ts new file mode 100644 index 0000000000..d427f23067 --- /dev/null +++ b/packages/build-info/src/frameworks/solid-start.test.ts @@ -0,0 +1,76 @@ +import { beforeEach, expect, test } from 'vitest' + +import { mockFileSystem } from '../../tests/mock-file-system.js' +import { NodeFS } from '../node/file-system.js' +import { Project } from '../project.js' + +beforeEach((ctx) => { + ctx.fs = new NodeFS() +}) + +test('detects and configures a SolidStart site that uses the old `solid-start` package', async ({ fs }) => { + const cwd = mockFileSystem({ + 'package.json': JSON.stringify({ + scripts: { + dev: 'solid-start dev', + build: 'solid-start build', + start: 'solid-start start', + }, + dependencies: { + '@solidjs/meta': '^0.28.5', + '@solidjs/router': '^0.8.2', + 'solid-js': '^1.7.8', + 'solid-start': '^0.2.26', + }, + devDependencies: { + 'solid-start-netlify': '^0.2.26', + 'solid-start-node': '^0.2.26', + vite: '3.2.5', + }, + }), + }) + const detected = await new Project(fs, cwd).detectFrameworks() + + const detectedFrameworks = (detected ?? []).map((framework) => framework.id) + expect(detectedFrameworks).not.toContain('vinxi') + expect(detectedFrameworks).not.toContain('vite') + expect(detectedFrameworks).not.toContain('solidjs') + + expect(detected?.[0]?.id).toBe('solid-start') + expect(detected?.[0]?.build?.command).toBe('solid-start build') + expect(detected?.[0]?.build?.directory).toBe('netlify') + expect(detected?.[0]?.dev?.command).toBe('solid-start dev') + expect(detected?.[0]?.dev?.port).toBe(3000) +}) + +test('detects and configures a SolidStart site that uses the new `@solidjs/start` package', async ({ fs }) => { + const cwd = mockFileSystem({ + 'package.json': JSON.stringify({ + scripts: { + dev: 'vinxi dev', + build: 'vinxi build', + start: 'vinxi start', + }, + dependencies: { + '@solidjs/router': '^0.14.1', + '@solidjs/start': '^1.0.6', + 'solid-js': '^1.8.18', + }, + devDependencies: { + vinxi: '^0.4.1', + }, + }), + }) + const detected = await new Project(fs, cwd).detectFrameworks() + + const detectedFrameworks = (detected ?? []).map((framework) => framework.id) + expect(detectedFrameworks).not.toContain('vinxi') + expect(detectedFrameworks).not.toContain('vite') + expect(detectedFrameworks).not.toContain('solidjs') + + expect(detected?.[0]?.id).toBe('solid-start') + expect(detected?.[0]?.build?.command).toBe('vinxi build') + expect(detected?.[0]?.build?.directory).toBe('dist') + expect(detected?.[0]?.dev?.command).toBe('vinxi dev') + expect(detected?.[0]?.dev?.port).toBe(3000) +}) diff --git a/packages/build-info/src/frameworks/solid-start.ts b/packages/build-info/src/frameworks/solid-start.ts index 7b290b8c5d..fe78c161a0 100644 --- a/packages/build-info/src/frameworks/solid-start.ts +++ b/packages/build-info/src/frameworks/solid-start.ts @@ -1,25 +1,52 @@ -import { BaseFramework, Category, Framework } from './framework.js' +import { BaseFramework, Category, type DetectedFramework, type Framework } from './framework.js' + +const LEGACY_PACKAGE_NAME = 'solid-start' +const LEGACY_DEV = { + command: 'solid-start dev', + port: 3000, +} +const LEGACY_BUILD = { + command: 'solid-start build', + directory: 'netlify', +} export class SolidStart extends BaseFramework implements Framework { readonly id = 'solid-start' name = 'Solid Start' - npmDependencies = ['solid-start'] + npmDependencies = [ + // Used this name up to 0.3.11 + 'solid-start', + // Renamed starting at 0.4.0 + '@solidjs/start', + ] category = Category.SSG dev = { - command: 'solid-start dev', + command: 'vinxi dev', port: 3000, - pollingStrategies: [{ name: 'TCP' }], } build = { - command: 'solid-start build', - directory: 'netlify', + command: 'vinxi build', + directory: 'dist', } logo = { default: '/logos/solid-start/default.svg', light: '/logos/solid-start/default.svg', - dark: '/logos/solid-start/default.svg', + dark: '/logos/solid-start/dark.svg', + } + + async detect(): Promise { + await super.detect() + + if (this.detected) { + if (this.detected.package?.name === LEGACY_PACKAGE_NAME) { + this.dev = LEGACY_DEV + this.build = LEGACY_BUILD + return this as DetectedFramework + } + return this as DetectedFramework + } } } diff --git a/packages/build-info/src/frameworks/vite.ts b/packages/build-info/src/frameworks/vite.ts index a63a0697d3..ec83c9e2e2 100644 --- a/packages/build-info/src/frameworks/vite.ts +++ b/packages/build-info/src/frameworks/vite.ts @@ -10,7 +10,10 @@ export class Vite extends BaseFramework implements Framework { '@remix-run/server-runtime', '@shopify/hydrogen', '@builder.io/qwik', + // Used this name up to 0.3.11 'solid-start', + // Renamed starting at 0.4.0 + '@solidjs/start', 'solid-js', '@tanstack/react-router', '@tanstack/start', From 75eb6a2a5f902320dd70a808ec30256fcd8df29a Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 1 Oct 2024 14:17:50 -0400 Subject: [PATCH 21/71] fix: add some support for dotnet runtime detection (#5858) --- .../build-info/src/runtime/dotnet.test.ts | 27 +++++++++++++++++++ packages/build-info/src/runtime/dotnet.ts | 7 +++++ packages/build-info/src/runtime/index.ts | 3 ++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 packages/build-info/src/runtime/dotnet.test.ts create mode 100644 packages/build-info/src/runtime/dotnet.ts diff --git a/packages/build-info/src/runtime/dotnet.test.ts b/packages/build-info/src/runtime/dotnet.test.ts new file mode 100644 index 0000000000..6fbf44ffa5 --- /dev/null +++ b/packages/build-info/src/runtime/dotnet.test.ts @@ -0,0 +1,27 @@ +import { beforeEach, expect, test } from 'vitest' + +import { mockFileSystem } from '../../tests/mock-file-system.js' +import { NodeFS } from '../node/file-system.js' +import { Project } from '../project.js' + +beforeEach((ctx) => { + ctx.fs = new NodeFS() +}) + +test('detects dotnet when Program.cs is present', async ({ fs }) => { + const cwd = mockFileSystem({ + 'Program.cs': '', + }) + + const detected = await new Project(fs, cwd).detectRuntime() + expect(detected[0].name).toBe('Dotnet') +}) + +test('detects dotnet when appsettings.json is present', async ({ fs }) => { + const cwd = mockFileSystem({ + 'appsettings.json': '', + }) + + const detected = await new Project(fs, cwd).detectRuntime() + expect(detected[0].name).toBe('Dotnet') +}) diff --git a/packages/build-info/src/runtime/dotnet.ts b/packages/build-info/src/runtime/dotnet.ts new file mode 100644 index 0000000000..e8fb7445a5 --- /dev/null +++ b/packages/build-info/src/runtime/dotnet.ts @@ -0,0 +1,7 @@ +import { LangRuntime } from './runtime.js' + +export class Dotnet extends LangRuntime { + id = 'dotnet' + name = 'Dotnet' + configFiles = ['Program.cs', 'appsettings.json'] +} diff --git a/packages/build-info/src/runtime/index.ts b/packages/build-info/src/runtime/index.ts index 080500ba4c..ff408b3a8b 100644 --- a/packages/build-info/src/runtime/index.ts +++ b/packages/build-info/src/runtime/index.ts @@ -1,6 +1,7 @@ import { Brew } from './brew.js' import { Bun } from './bun.js' import { Emacs } from './cask.js' +import { Dotnet } from './dotnet.js' import { Go } from './go.js' import { Java } from './java.js' import { Node } from './node.js' @@ -10,4 +11,4 @@ import { Ruby } from './ruby.js' import { Rust } from './rust.js' import { Swift } from './swift.js' -export const runtimes = [Node, Ruby, Brew, Bun, Emacs, Go, Java, Php, Rust, Swift, Python] +export const runtimes = [Node, Ruby, Brew, Bun, Emacs, Dotnet, Go, Java, Php, Rust, Swift, Python] From acef6068ab04e7423043b85ef31ee80c97cc4787 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:44:34 -0500 Subject: [PATCH 22/71] chore: release main (#5870) --- .release-please-manifest.json | 2 +- package-lock.json | 2 +- packages/build-info/CHANGELOG.md | 8 ++++++++ packages/build-info/package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 943fb788dd..218eadbee9 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "packages/build-info": "7.15.0", + "packages/build-info": "7.15.1", "packages/build": "29.54.9", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", diff --git a/package-lock.json b/package-lock.json index ca46b11b97..ece8a31efe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26449,7 +26449,7 @@ }, "packages/build-info": { "name": "@netlify/build-info", - "version": "7.15.0", + "version": "7.15.1", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.20.0", diff --git a/packages/build-info/CHANGELOG.md b/packages/build-info/CHANGELOG.md index 91b790c877..c1ed2c7c9d 100644 --- a/packages/build-info/CHANGELOG.md +++ b/packages/build-info/CHANGELOG.md @@ -64,6 +64,14 @@ * dependencies * @netlify/framework-info bumped from ^9.8.8 to ^9.8.9 +## [7.15.1](https://github.com/netlify/build/compare/build-info-v7.15.0...build-info-v7.15.1) (2024-10-01) + + +### Bug Fixes + +* add some support for dotnet runtime detection ([#5858](https://github.com/netlify/build/issues/5858)) ([75eb6a2](https://github.com/netlify/build/commit/75eb6a2a5f902320dd70a808ec30256fcd8df29a)) +* framework detection for solidjs and solidstart ([#5856](https://github.com/netlify/build/issues/5856)) ([2002b42](https://github.com/netlify/build/commit/2002b42751bc0bd120086ab32c685f9bf6703237)) + ## [7.15.0](https://github.com/netlify/build/compare/build-info-v7.14.4...build-info-v7.15.0) (2024-10-01) diff --git a/packages/build-info/package.json b/packages/build-info/package.json index baf1255a8c..ea6c5bcd9a 100644 --- a/packages/build-info/package.json +++ b/packages/build-info/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build-info", - "version": "7.15.0", + "version": "7.15.1", "description": "Build info utility", "type": "module", "exports": { From a0d1728c26db930ba2be62b98b7393b99eb36217 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 01:23:50 +0000 Subject: [PATCH 23/71] chore(deps): update dependency eslint-plugin-import to v2.31.0 (#5872) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ece8a31efe..0dfb84af8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14712,9 +14712,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", - "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "license": "MIT", "dependencies": { @@ -14738,9 +14738,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "license": "MIT", "dependencies": { @@ -14752,7 +14752,7 @@ "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", + "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", @@ -14761,13 +14761,14 @@ "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { From 40bcebe65aedac16d35bc6469dc8d439e5a4ac86 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 04:01:51 +0000 Subject: [PATCH 24/71] fix(deps): update dependency fdir to v6.4.0 (#5873) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dfb84af8c..2f3dddab2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15358,9 +15358,9 @@ } }, "node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", + "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -26363,7 +26363,7 @@ "chalk": "^5.0.0", "clean-stack": "^4.0.0", "execa": "^6.0.0", - "fdir": "^6.0.1", + "fdir": "^6.4.0", "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", From c482ddb028589832490127e8e77b14066d6b0a61 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:34:19 +0000 Subject: [PATCH 25/71] chore(deps): update dependency typescript to v5.6.3 (#5876) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update dependency typescript to v5.6.3 * chore: add JSDoc --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Eduardo Bouças --- package-lock.json | 42 +++++++++---------- packages/build/src/log/messages/core_steps.js | 7 ++++ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f3dddab2b..a9bec6f16e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24929,9 +24929,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -26363,7 +26363,7 @@ "chalk": "^5.0.0", "clean-stack": "^4.0.0", "execa": "^6.0.0", - "fdir": "^6.4.0", + "fdir": "^6.0.1", "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", @@ -26401,7 +26401,7 @@ "supports-color": "^9.0.0", "terminal-link": "^3.0.0", "ts-node": "^10.9.1", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "uuid": "^9.0.0", "yargs": "^17.6.0" }, @@ -26476,7 +26476,7 @@ "execa": "^6.0.0", "memfs": "^3.4.7", "node-fetch": "^3.3.1", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "unionfs": "^4.4.0", "vite": "^4.0.4", "vitest": "^0.34.0" @@ -26656,7 +26656,7 @@ "devDependencies": { "@types/node": "^14.18.53", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -26703,7 +26703,7 @@ "has-ansi": "^5.0.0", "is-ci": "^3.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "typescript": "^5.6.3" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -26824,7 +26824,7 @@ "cross-env": "^7.0.3", "nock": "^13.2.4", "tar": "^6.1.11", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27145,7 +27145,7 @@ "path-browserify": "^1.0.1", "rollup-plugin-node-polyfills": "^0.2.1", "tmp-promise": "^3.0.2", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27166,7 +27166,7 @@ "@types/node": "^14.18.53", "sort-on": "^5.0.0", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27186,7 +27186,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27281,7 +27281,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27309,7 +27309,7 @@ "from2-string": "^1.1.0", "nock": "^13.0.0", "ts-node": "^10.9.1", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "uuid": "^9.0.0" }, "engines": { @@ -27322,7 +27322,7 @@ "license": "MIT", "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27349,7 +27349,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27378,7 +27378,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27403,7 +27403,7 @@ "devDependencies": { "@types/node": "^14.18.53", "ts-node": "^10.9.1", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27420,7 +27420,7 @@ "devDependencies": { "@types/node": "^14.18.53", "semver": "^7.3.8", - "typescript": "^5.0.0", + "typescript": "^5.6.3", "vitest": "^0.34.0" }, "engines": { @@ -27522,7 +27522,7 @@ "path-key": "^4.0.0", "strip-ansi": "^7.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "typescript": "^5.6.3" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -28397,7 +28397,7 @@ "@types/node": "^14.18.53", "execa": "^6.1.0", "globby": "^13.1.2", - "typescript": "^5.0.0" + "typescript": "^5.6.3" } }, "tools/node_modules/execa": { diff --git a/packages/build/src/log/messages/core_steps.js b/packages/build/src/log/messages/core_steps.js index 6fce440850..e5587e288a 100644 --- a/packages/build/src/log/messages/core_steps.js +++ b/packages/build/src/log/messages/core_steps.js @@ -15,6 +15,13 @@ const logBundleResultFunctions = ({ functions, headerMessage, logs, error }) => logArray(logs, functionNames) } +/** + * Logs the result of bundling functions + * + * @param {object} options + * @param {any} options.logs + * @param {import("@netlify/zip-it-and-ship-it").FunctionResult[]} options.results + */ export const logBundleResults = ({ logs, results = [] }) => { const resultsWithErrors = results.filter(({ bundlerErrors }) => bundlerErrors && bundlerErrors.length !== 0) const resultsWithWarnings = results.filter( From 5860e7272263dd092c97add354dfa2021518eb5c Mon Sep 17 00:00:00 2001 From: Vitalii Rybachenko Date: Wed, 9 Oct 2024 15:01:12 -0400 Subject: [PATCH 26/71] fix: reading data from spawned process (#5877) --- packages/build/src/plugins/ipc.js | 4 ++-- .../tests/plugins/fixtures/process_send_object/manifest.yml | 2 ++ .../tests/plugins/fixtures/process_send_object/netlify.toml | 2 ++ .../tests/plugins/fixtures/process_send_object/plugin.js | 5 +++++ packages/build/tests/plugins/tests.js | 5 +++++ 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 packages/build/tests/plugins/fixtures/process_send_object/manifest.yml create mode 100644 packages/build/tests/plugins/fixtures/process_send_object/netlify.toml create mode 100644 packages/build/tests/plugins/fixtures/process_send_object/plugin.js diff --git a/packages/build/src/plugins/ipc.js b/packages/build/src/plugins/ipc.js index 19509b4d49..0dbf6955f2 100644 --- a/packages/build/src/plugins/ipc.js +++ b/packages/build/src/plugins/ipc.js @@ -39,8 +39,8 @@ export const getEventFromChild = async function (childProcess, callId) { throw getChildExitError('Could not receive event from child process because it already exited.') } - const messagePromise = pEvent(childProcess, 'message', { filter: ([actualCallId]) => actualCallId === callId }) - const errorPromise = pEvent(childProcess, 'message', { filter: ([actualCallId]) => actualCallId === 'error' }) + const messagePromise = pEvent(childProcess, 'message', { filter: (data) => data?.[0] === callId }) + const errorPromise = pEvent(childProcess, 'message', { filter: (data) => data?.[0] === 'error' }) const exitPromise = pEvent(childProcess, 'exit', { multiArgs: true }) try { return await Promise.race([getMessage(messagePromise), getError(errorPromise), getExit(exitPromise)]) diff --git a/packages/build/tests/plugins/fixtures/process_send_object/manifest.yml b/packages/build/tests/plugins/fixtures/process_send_object/manifest.yml new file mode 100644 index 0000000000..a3512f0259 --- /dev/null +++ b/packages/build/tests/plugins/fixtures/process_send_object/manifest.yml @@ -0,0 +1,2 @@ +name: test +inputs: [] diff --git a/packages/build/tests/plugins/fixtures/process_send_object/netlify.toml b/packages/build/tests/plugins/fixtures/process_send_object/netlify.toml new file mode 100644 index 0000000000..4b06556c85 --- /dev/null +++ b/packages/build/tests/plugins/fixtures/process_send_object/netlify.toml @@ -0,0 +1,2 @@ +[[plugins]] +package = "./plugin.js" diff --git a/packages/build/tests/plugins/fixtures/process_send_object/plugin.js b/packages/build/tests/plugins/fixtures/process_send_object/plugin.js new file mode 100644 index 0000000000..9a99d0ee52 --- /dev/null +++ b/packages/build/tests/plugins/fixtures/process_send_object/plugin.js @@ -0,0 +1,5 @@ +import process from 'process'; + +export const onPreBuild = function () { + process.send({}); +} diff --git a/packages/build/tests/plugins/tests.js b/packages/build/tests/plugins/tests.js index fdb4d7ffaf..0ddd21e14d 100644 --- a/packages/build/tests/plugins/tests.js +++ b/packages/build/tests/plugins/tests.js @@ -401,3 +401,8 @@ test('Plugins have a pre-populated Blobs context', async (t) => { t.is(netlifyConfig.build.command, `echo ""Hello there""`) }) + +test('Plugins can respond anything to parent process', async (t) => { + const build = await new Fixture('./fixtures/process_send_object').runBuildBinary() + t.true(build.exitCode === 0) +}) From 7dfac4cc38058e135c4952d53ef6b63c8034f962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Thu, 10 Oct 2024 12:16:08 +0100 Subject: [PATCH 27/71] feat: write metadata file (#5875) * feat: write metadata file * refactor: use exported types * refactor: use `FunctionResult` type * chore: add JSDoc * feat: pass branch to zip-it-and-ship-it * chore: remove dep * chore: add util back --------- Co-authored-by: Philippe Serhal --- .../build/src/plugins_core/functions/index.ts | 12 +++-- .../build/src/plugins_core/functions/zisi.ts | 3 ++ .../fixtures/v2/netlify/functions/test.mjs | 3 ++ packages/build/tests/functions/tests.js | 40 +++++++++++++- packages/testing/src/fs.ts | 14 +++++ packages/testing/src/index.ts | 1 + .../zip-it-and-ship-it/src/feature_flags.ts | 4 +- .../src/runtimes/node/index.ts | 2 + .../src/runtimes/node/utils/entry_file.ts | 1 + .../src/runtimes/node/utils/metadata_file.ts | 11 ++++ .../src/runtimes/node/utils/zip.ts | 12 +++-- .../src/runtimes/runtime.ts | 1 + packages/zip-it-and-ship-it/src/zip.ts | 9 ++-- .../zip-it-and-ship-it/tests/v2api.test.ts | 54 ++++++++++++++----- 14 files changed, 137 insertions(+), 30 deletions(-) create mode 100644 packages/build/tests/functions/fixtures/v2/netlify/functions/test.mjs create mode 100644 packages/testing/src/fs.ts create mode 100644 packages/zip-it-and-ship-it/src/runtimes/node/utils/metadata_file.ts diff --git a/packages/build/src/plugins_core/functions/index.ts b/packages/build/src/plugins_core/functions/index.ts index 29beaec90f..a5819f8179 100644 --- a/packages/build/src/plugins_core/functions/index.ts +++ b/packages/build/src/plugins_core/functions/index.ts @@ -1,6 +1,6 @@ import { resolve } from 'path' -import { NodeBundlerName, RUNTIME, zipFunctions } from '@netlify/zip-it-and-ship-it' +import { NodeBundlerName, RUNTIME, zipFunctions, FunctionResult } from '@netlify/zip-it-and-ship-it' import { pathExists } from 'path-exists' import { addErrorInfo } from '../../error/info.js' @@ -13,7 +13,7 @@ import { getUserAndInternalFunctions, validateFunctionsSrc } from './utils.js' import { getZisiParameters } from './zisi.js' // Get a list of all unique bundlers in this run -const getBundlers = (results: Awaited> = []) => +const getBundlers = (results: FunctionResult[] = []) => // using a Set to filter duplicates new Set( results @@ -38,7 +38,7 @@ const eventTriggeredFunctions = new Set([ 'identity-login', ]) -const validateCustomRoutes = function (functions: Awaited>) { +const validateCustomRoutes = function (functions: FunctionResult[]) { for (const { routes, name, schedule } of functions) { if (!routes || routes.length === 0) continue @@ -61,6 +61,7 @@ const validateCustomRoutes = function (functions: Awaited { const zisiParameters = getZisiParameters({ + branch, buildDir, childEnv, featureFlags, @@ -118,6 +120,7 @@ const coreStep = async function ({ FUNCTIONS_DIST: relativeFunctionsDist, }, buildDir, + branch, packagePath, logs, netlifyConfig, @@ -166,6 +169,7 @@ const coreStep = async function ({ } const { bundlers } = await zipFunctionsAndLogResults({ + branch, buildDir, childEnv, featureFlags, @@ -237,7 +241,7 @@ export const bundleFunctions = { // `zip-it-and-ship-it` methods. Therefore, we need to use an intermediary // function and export them so tests can use it. export const zipItAndShipIt = { - async zipFunctions(...args: Parameters) { + async zipFunctions(...args: Parameters): Promise { return await zipFunctions(...args) }, } diff --git a/packages/build/src/plugins_core/functions/zisi.ts b/packages/build/src/plugins_core/functions/zisi.ts index 41651e3cd3..d6204b3094 100644 --- a/packages/build/src/plugins_core/functions/zisi.ts +++ b/packages/build/src/plugins_core/functions/zisi.ts @@ -9,6 +9,7 @@ import type { FeatureFlags } from '../../core/feature_flags.js' import { getZisiFeatureFlags } from './feature_flags.js' type GetZisiParametersType = { + branch?: string buildDir: string childEnv: Record featureFlags: FeatureFlags @@ -40,6 +41,7 @@ const getLambdaNodeVersion = (childEnv: Record, userNodeVersion: } export const getZisiParameters = ({ + branch, buildDir, childEnv, featureFlags, @@ -65,6 +67,7 @@ export const getZisiParameters = ({ return { basePath: buildDir, + branch, config, manifest, featureFlags: zisiFeatureFlags, diff --git a/packages/build/tests/functions/fixtures/v2/netlify/functions/test.mjs b/packages/build/tests/functions/fixtures/v2/netlify/functions/test.mjs new file mode 100644 index 0000000000..11d0241321 --- /dev/null +++ b/packages/build/tests/functions/fixtures/v2/netlify/functions/test.mjs @@ -0,0 +1,3 @@ +export default async () => new Response("Hello") + +export const config = { path: "/hello" } diff --git a/packages/build/tests/functions/tests.js b/packages/build/tests/functions/tests.js index 3d7d505bf9..a23893c647 100644 --- a/packages/build/tests/functions/tests.js +++ b/packages/build/tests/functions/tests.js @@ -1,9 +1,9 @@ import { readdir, readFile, rm, stat, writeFile } from 'fs/promises' -import { resolve } from 'path' +import { join, resolve } from 'path' import { version as nodeVersion } from 'process' import { fileURLToPath } from 'url' -import { Fixture, normalizeOutput, removeDir, getTempName } from '@netlify/testing' +import { Fixture, normalizeOutput, removeDir, getTempName, unzipFile } from '@netlify/testing' import test from 'ava' import { pathExists } from 'path-exists' import semver from 'semver' @@ -204,3 +204,39 @@ if (semver.gte(nodeVersion, '16.9.0')) { t.true(app2FunctionsDist.includes('worker.zip')) }) } + +test('Functions: creates metadata file', async (t) => { + const fixture = await new Fixture('./fixtures/v2').withCopyRoot({ git: false }) + const build = await fixture + .withFlags({ + branch: 'my-branch', + cwd: fixture.repositoryRoot, + featureFlags: { zisi_add_metadata_file: true }, + }) + .runWithBuildAndIntrospect() + + t.true(build.success) + + const functionsDistPath = resolve(fixture.repositoryRoot, '.netlify/functions') + const functionsDistFiles = await readdir(functionsDistPath) + + t.true(functionsDistFiles.includes('manifest.json')) + t.true(functionsDistFiles.includes('test.zip')) + + const unzipPath = join(functionsDistPath, `.netlify-test-${Date.now()}`) + + await unzipFile(join(functionsDistPath, 'test.zip'), unzipPath) + + const functionFiles = await readdir(unzipPath) + + t.true(functionFiles.includes('___netlify-bootstrap.mjs')) + t.true(functionFiles.includes('___netlify-entry-point.mjs')) + t.true(functionFiles.includes('___netlify-metadata.json')) + t.true(functionFiles.includes('test.mjs')) + + const metadata = JSON.parse(await readFile(join(unzipPath, '___netlify-metadata.json'), 'utf8')) + + t.is(semver.valid(metadata.bootstrap_version), metadata.bootstrap_version) + t.is(metadata.branch, 'my-branch') + t.is(metadata.version, 1) +}) diff --git a/packages/testing/src/fs.ts b/packages/testing/src/fs.ts new file mode 100644 index 0000000000..93d06f1838 --- /dev/null +++ b/packages/testing/src/fs.ts @@ -0,0 +1,14 @@ +import { mkdir } from 'fs/promises' +import { platform } from 'process' + +import { execa } from 'execa' + +export const unzipFile = async function (path: string, dest: string): Promise { + await mkdir(dest, { recursive: true }) + + if (platform === 'win32') { + await execa('tar', ['-xf', path, '-C', dest]) + } else { + await execa('unzip', ['-o', path, '-d', dest]) + } +} diff --git a/packages/testing/src/index.ts b/packages/testing/src/index.ts index ebb6511823..4b25185540 100644 --- a/packages/testing/src/index.ts +++ b/packages/testing/src/index.ts @@ -1,5 +1,6 @@ export * from './dir.js' export * from './fixture.js' +export * from './fs.js' export * from './normalize.js' export * from './server.js' export * from './tcp_server.js' diff --git a/packages/zip-it-and-ship-it/src/feature_flags.ts b/packages/zip-it-and-ship-it/src/feature_flags.ts index c8198d07e1..9f1a39ab25 100644 --- a/packages/zip-it-and-ship-it/src/feature_flags.ts +++ b/packages/zip-it-and-ship-it/src/feature_flags.ts @@ -33,8 +33,8 @@ export const defaultFlags = { // Adds the `___netlify-telemetry.mjs` file to the function bundle. zisi_add_instrumentation_loader: true, - // Adds a `___netlify-bootstrap-version` file to the function bundle. - zisi_add_version_file: false, + // Adds a `___netlify-metadata.json` file to the function bundle. + zisi_add_metadata_file: false, } as const export type FeatureFlags = Partial> diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/index.ts b/packages/zip-it-and-ship-it/src/runtimes/node/index.ts index 3ed6e10eb8..aedf137231 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/node/index.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/node/index.ts @@ -37,6 +37,7 @@ const getSrcFilesWithBundler: GetSrcFilesFunction = async (parameters) => { const zipFunction: ZipFunction = async function ({ archiveFormat, basePath, + branch, cache, config = {}, destFolder, @@ -113,6 +114,7 @@ const zipFunction: ZipFunction = async function ({ aliases, archiveFormat, basePath: finalBasePath, + branch, cache, destFolder, extension, diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/utils/entry_file.ts b/packages/zip-it-and-ship-it/src/runtimes/node/utils/entry_file.ts index 5e1cf7ab17..837cbe8def 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/node/utils/entry_file.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/node/utils/entry_file.ts @@ -18,6 +18,7 @@ import { normalizeFilePath } from './normalize_path.js' export const ENTRY_FILE_NAME = '___netlify-entry-point' export const BOOTSTRAP_FILE_NAME = '___netlify-bootstrap.mjs' export const BOOTSTRAP_VERSION_FILE_NAME = '___netlify-bootstrap-version' +export const METADATA_FILE_NAME = '___netlify-metadata.json' export const TELEMETRY_FILE_NAME = '___netlify-telemetry.mjs' const require = createRequire(import.meta.url) diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/utils/metadata_file.ts b/packages/zip-it-and-ship-it/src/runtimes/node/utils/metadata_file.ts new file mode 100644 index 0000000000..ad4edf327c --- /dev/null +++ b/packages/zip-it-and-ship-it/src/runtimes/node/utils/metadata_file.ts @@ -0,0 +1,11 @@ +export interface MetadataFile { + bootstrap_version?: string + branch?: string + version: number +} + +export const getMetadataFile = (bootstrapVersion?: string, branch?: string): MetadataFile => ({ + bootstrap_version: bootstrapVersion, + branch, + version: 1, +}) diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts b/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts index 657e0583e5..5712460712 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts @@ -23,13 +23,14 @@ import { cachedLstat, mkdirAndWriteFile } from '../../../utils/fs.js' import { BOOTSTRAP_FILE_NAME, - BOOTSTRAP_VERSION_FILE_NAME, + METADATA_FILE_NAME, conflictsWithEntryFile, EntryFile, getEntryFile, getTelemetryFile, isNamedLikeEntryFile, } from './entry_file.js' +import { getMetadataFile } from './metadata_file.js' import { ModuleFormat } from './module_format.js' import { normalizeFilePath } from './normalize_path.js' import { getPackageJsonIfAvailable } from './package_json.js' @@ -44,6 +45,7 @@ const DEFAULT_USER_SUBDIRECTORY = 'src' interface ZipNodeParameters { aliases?: Map basePath: string + branch?: string cache: RuntimeCache destFolder: string extension: string @@ -186,6 +188,7 @@ const createDirectory = async function ({ const createZipArchive = async function ({ aliases = new Map(), basePath, + branch, cache, destFolder, extension, @@ -251,12 +254,11 @@ const createZipArchive = async function ({ if (runtimeAPIVersion === 2) { const bootstrapPath = addBootstrapFile(srcFiles, aliases) - if (featureFlags.zisi_add_version_file === true) { + if (featureFlags.zisi_add_metadata_file === true) { const { version: bootstrapVersion } = await getPackageJsonIfAvailable(bootstrapPath) + const payload = JSON.stringify(getMetadataFile(bootstrapVersion, branch)) - if (bootstrapVersion) { - addZipContent(archive, bootstrapVersion, BOOTSTRAP_VERSION_FILE_NAME) - } + addZipContent(archive, payload, METADATA_FILE_NAME) } } diff --git a/packages/zip-it-and-ship-it/src/runtimes/runtime.ts b/packages/zip-it-and-ship-it/src/runtimes/runtime.ts index e527c97adc..2361eb5b55 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/runtime.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/runtime.ts @@ -66,6 +66,7 @@ export type ZipFunction = ( args: { archiveFormat: ArchiveFormat basePath?: string + branch?: string cache: RuntimeCache config: FunctionConfig destFolder: string diff --git a/packages/zip-it-and-ship-it/src/zip.ts b/packages/zip-it-and-ship-it/src/zip.ts index c805e2a934..995ccaa2e0 100644 --- a/packages/zip-it-and-ship-it/src/zip.ts +++ b/packages/zip-it-and-ship-it/src/zip.ts @@ -13,7 +13,7 @@ import { getFunctionsFromPaths } from './runtimes/index.js' import { MODULE_FORMAT } from './runtimes/node/utils/module_format.js' import { addArchiveSize } from './utils/archive_size.js' import { RuntimeCache } from './utils/cache.js' -import { formatZipResult } from './utils/format_result.js' +import { formatZipResult, FunctionResult } from './utils/format_result.js' import { listFunctionsDirectories, resolveFunctionsDirectories } from './utils/fs.js' import { getLogger, LogFunction } from './utils/logger.js' import { nonNullable } from './utils/non_nullable.js' @@ -21,6 +21,7 @@ import { nonNullable } from './utils/non_nullable.js' export interface ZipFunctionOptions { archiveFormat?: ArchiveFormat basePath?: string + branch?: string config?: Config featureFlags?: FeatureFlags repositoryRoot?: string @@ -53,6 +54,7 @@ export const zipFunctions = async function ( { archiveFormat = ARCHIVE_FORMAT.ZIP, basePath, + branch, config = {}, configFileDirectories, featureFlags: inputFeatureFlags, @@ -63,7 +65,7 @@ export const zipFunctions = async function ( debug, internalSrcFolder, }: ZipFunctionsOptions = {}, -) { +): Promise { validateArchiveFormat(archiveFormat) const logger = getLogger(systemLog, debug) @@ -94,6 +96,7 @@ export const zipFunctions = async function ( const zipResult = await func.runtime.zipFunction({ archiveFormat, basePath, + branch, cache, config: func.config, destFolder, @@ -145,7 +148,7 @@ export const zipFunction = async function ( debug, internalSrcFolder, }: ZipFunctionOptions = {}, -) { +): Promise { validateArchiveFormat(archiveFormat) const logger = getLogger(systemLog, debug) diff --git a/packages/zip-it-and-ship-it/tests/v2api.test.ts b/packages/zip-it-and-ship-it/tests/v2api.test.ts index 1cddf65d41..ff20297f21 100644 --- a/packages/zip-it-and-ship-it/tests/v2api.test.ts +++ b/packages/zip-it-and-ship-it/tests/v2api.test.ts @@ -709,22 +709,48 @@ describe.runIf(semver.gte(nodeVersion, '18.13.0'))('V2 functions API', () => { expect(files[0].runtimeVersion).toBe('nodejs20.x') }) - test('Adds a file with the bootstrap version to the ZIP archive', async () => { - const fixtureName = 'v2-api' - const { files } = await zipFixture(fixtureName, { - fixtureDir: FIXTURES_ESM_DIR, - opts: { - featureFlags: { - zisi_add_version_file: true, + describe('Adds a file with metadata', () => { + test('Without a branch', async () => { + const fixtureName = 'v2-api' + const { files } = await zipFixture(fixtureName, { + fixtureDir: FIXTURES_ESM_DIR, + opts: { + featureFlags: { + zisi_add_metadata_file: true, + }, }, - }, + }) + const [unzippedFunction] = await unzipFiles(files) + const bootstrapPath = getBootstrapPath() + const bootstrapPackageJson = await readFile(resolve(bootstrapPath, '..', '..', 'package.json'), 'utf8') + const { version: bootstrapVersion } = JSON.parse(bootstrapPackageJson) + const versionFileContents = await readFile(join(unzippedFunction.unzipPath, '___netlify-metadata.json'), 'utf8') + + expect(JSON.parse(versionFileContents)).toEqual({ bootstrap_version: bootstrapVersion, version: 1 }) }) - const [unzippedFunction] = await unzipFiles(files) - const bootstrapPath = getBootstrapPath() - const bootstrapPackageJson = await readFile(resolve(bootstrapPath, '..', '..', 'package.json'), 'utf8') - const { version: bootstrapVersion } = JSON.parse(bootstrapPackageJson) - const versionFileContents = await readFile(join(unzippedFunction.unzipPath, '___netlify-bootstrap-version'), 'utf8') - expect(versionFileContents).toBe(bootstrapVersion) + test('With a branch', async () => { + const fixtureName = 'v2-api' + const { files } = await zipFixture(fixtureName, { + fixtureDir: FIXTURES_ESM_DIR, + opts: { + branch: 'main', + featureFlags: { + zisi_add_metadata_file: true, + }, + }, + }) + const [unzippedFunction] = await unzipFiles(files) + const bootstrapPath = getBootstrapPath() + const bootstrapPackageJson = await readFile(resolve(bootstrapPath, '..', '..', 'package.json'), 'utf8') + const { version: bootstrapVersion } = JSON.parse(bootstrapPackageJson) + const versionFileContents = await readFile(join(unzippedFunction.unzipPath, '___netlify-metadata.json'), 'utf8') + + expect(JSON.parse(versionFileContents)).toEqual({ + bootstrap_version: bootstrapVersion, + branch: 'main', + version: 1, + }) + }) }) }) From b7bfbacf3cf839a6d97057ee16ebd53fb319b4a2 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Thu, 10 Oct 2024 06:42:14 -0500 Subject: [PATCH 28/71] chore: release main (#5878) * chore: release main * chore: update lockfile --------- Co-authored-by: netlify-jenkins <33464286+netlify-jenkins@users.noreply.github.com> --- .release-please-manifest.json | 6 ++-- package-lock.json | 46 ++++++++++++------------ packages/build/CHANGELOG.md | 20 +++++++++++ packages/build/package.json | 6 ++-- packages/functions-utils/CHANGELOG.md | 9 +++++ packages/functions-utils/package.json | 4 +-- packages/zip-it-and-ship-it/CHANGELOG.md | 7 ++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 68 insertions(+), 32 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 218eadbee9..662329632c 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.15.1", - "packages/build": "29.54.9", + "packages/build": "29.55.0", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.88", + "packages/functions-utils": "5.2.89", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.39.7" + "packages/zip-it-and-ship-it": "9.40.0" } diff --git a/package-lock.json b/package-lock.json index a9bec6f16e..85d36d05e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.54.9", + "version": "29.55.0", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26352,12 +26352,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.88", + "@netlify/functions-utils": "^5.2.89", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.7", + "@netlify/zip-it-and-ship-it": "9.40.0", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -26401,7 +26401,7 @@ "supports-color": "^9.0.0", "terminal-link": "^3.0.0", "ts-node": "^10.9.1", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "uuid": "^9.0.0", "yargs": "^17.6.0" }, @@ -26476,7 +26476,7 @@ "execa": "^6.0.0", "memfs": "^3.4.7", "node-fetch": "^3.3.1", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "unionfs": "^4.4.0", "vite": "^4.0.4", "vitest": "^0.34.0" @@ -26656,7 +26656,7 @@ "devDependencies": { "@types/node": "^14.18.53", "tmp-promise": "^3.0.0", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -26703,7 +26703,7 @@ "has-ansi": "^5.0.0", "is-ci": "^3.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.6.3" + "typescript": "^5.0.0" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -26824,7 +26824,7 @@ "cross-env": "^7.0.3", "nock": "^13.2.4", "tar": "^6.1.11", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27145,7 +27145,7 @@ "path-browserify": "^1.0.1", "rollup-plugin-node-polyfills": "^0.2.1", "tmp-promise": "^3.0.2", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27155,10 +27155,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.88", + "version": "5.2.89", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.7", + "@netlify/zip-it-and-ship-it": "9.40.0", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27166,7 +27166,7 @@ "@types/node": "^14.18.53", "sort-on": "^5.0.0", "tmp-promise": "^3.0.0", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27186,7 +27186,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27281,7 +27281,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27309,7 +27309,7 @@ "from2-string": "^1.1.0", "nock": "^13.0.0", "ts-node": "^10.9.1", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "uuid": "^9.0.0" }, "engines": { @@ -27322,7 +27322,7 @@ "license": "MIT", "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27349,7 +27349,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27378,7 +27378,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27403,7 +27403,7 @@ "devDependencies": { "@types/node": "^14.18.53", "ts-node": "^10.9.1", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27420,7 +27420,7 @@ "devDependencies": { "@types/node": "^14.18.53", "semver": "^7.3.8", - "typescript": "^5.6.3", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27522,7 +27522,7 @@ "path-key": "^4.0.0", "strip-ansi": "^7.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.6.3" + "typescript": "^5.0.0" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -27610,7 +27610,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.7", + "version": "9.40.0", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", @@ -28397,7 +28397,7 @@ "@types/node": "^14.18.53", "execa": "^6.1.0", "globby": "^13.1.2", - "typescript": "^5.6.3" + "typescript": "^5.0.0" } }, "tools/node_modules/execa": { diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 0911accbb7..38fee30c39 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,26 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.55.0](https://github.com/netlify/build/compare/build-v29.54.9...build-v29.55.0) (2024-10-10) + + +### Features + +* write metadata file ([#5875](https://github.com/netlify/build/issues/5875)) ([7dfac4c](https://github.com/netlify/build/commit/7dfac4cc38058e135c4952d53ef6b63c8034f962)) + + +### Bug Fixes + +* reading data from spawned process ([#5877](https://github.com/netlify/build/issues/5877)) ([5860e72](https://github.com/netlify/build/commit/5860e7272263dd092c97add354dfa2021518eb5c)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.88 to ^5.2.89 + * @netlify/zip-it-and-ship-it bumped from 9.39.7 to 9.40.0 + ## [29.54.9](https://github.com/netlify/build/compare/build-v29.54.8...build-v29.54.9) (2024-10-01) diff --git a/packages/build/package.json b/packages/build/package.json index 7d972038eb..52a4d1080a 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.54.9", + "version": "29.55.0", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.88", + "@netlify/functions-utils": "^5.2.89", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.39.7", + "@netlify/zip-it-and-ship-it": "9.40.0", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 7e0231c857..51aa53fb99 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.89](https://github.com/netlify/build/compare/functions-utils-v5.2.88...functions-utils-v5.2.89) (2024-10-10) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.39.7 to 9.40.0 + ## [5.2.88](https://github.com/netlify/build/compare/functions-utils-v5.2.87...functions-utils-v5.2.88) (2024-10-01) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index e1b57b4282..c842ea90e5 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.88", + "version": "5.2.89", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.39.7", + "@netlify/zip-it-and-ship-it": "9.40.0", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index d2e18986a1..987b1facd7 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.40.0](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.7...zip-it-and-ship-it-v9.40.0) (2024-10-10) + + +### Features + +* write metadata file ([#5875](https://github.com/netlify/build/issues/5875)) ([7dfac4c](https://github.com/netlify/build/commit/7dfac4cc38058e135c4952d53ef6b63c8034f962)) + ## [9.39.7](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.6...zip-it-and-ship-it-v9.39.7) (2024-10-01) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index bbca2ec5df..58c42f19db 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.39.7", + "version": "9.40.0", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 959d7a55c7a395a739f92bee541d762d1629e322 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 20:24:56 +0000 Subject: [PATCH 29/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.29.1 (#5879) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85d36d05e3..cb4081b35b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.29.0.tgz", - "integrity": "sha512-dSJu+l0tM2Zru9MvDA6ewPwJyU3vYvOUD7jLZyMWvF4arT0X9l+7VIOSaJS8vJDpWhz90ycr1agXv6Uk7+b4uA==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.29.1.tgz", + "integrity": "sha512-Sc/pOCWKnIMzYWSb3/fBL4HExhOXZgRfYHkUEG/7A5F3c5pdYwyHL152EptUINhzau0VjPtbgBcLJn28HmCwtg==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27616,7 +27616,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.29.0", + "@netlify/serverless-functions-api": "^1.29.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 58c42f19db..f9793252e2 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.29.0", + "@netlify/serverless-functions-api": "^1.29.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From cc6443c323e61b36dba35d2c983641276ecd28c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 09:00:22 +0000 Subject: [PATCH 30/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.30.0 (#5881) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb4081b35b..fbb96e6eef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.29.1.tgz", - "integrity": "sha512-Sc/pOCWKnIMzYWSb3/fBL4HExhOXZgRfYHkUEG/7A5F3c5pdYwyHL152EptUINhzau0VjPtbgBcLJn28HmCwtg==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.30.0.tgz", + "integrity": "sha512-flmEwxe7JFqWDXmD2hyzPbmKzKZF0y2rH8IHGlD1mn9bXo9JBPm61IVLJx/A+Je4pbjgoIgYZeeZKCxnCRooHQ==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27616,7 +27616,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.29.1", + "@netlify/serverless-functions-api": "^1.30.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index f9793252e2..d5ca46eb10 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.29.1", + "@netlify/serverless-functions-api": "^1.30.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From db33121e34a844baeb3be9715e44af8d2b5df8f3 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Fri, 11 Oct 2024 04:10:08 -0500 Subject: [PATCH 31/71] chore: release main (#5880) --- .release-please-manifest.json | 6 +++--- package-lock.json | 12 ++++++------ packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 8 ++++++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 42 insertions(+), 15 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 662329632c..e0aa4ead48 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.15.1", - "packages/build": "29.55.0", + "packages/build": "29.55.1", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.89", + "packages/functions-utils": "5.2.90", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.40.0" + "packages/zip-it-and-ship-it": "9.40.1" } diff --git a/package-lock.json b/package-lock.json index fbb96e6eef..b12eeda2c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.55.0", + "version": "29.55.1", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26352,12 +26352,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.89", + "@netlify/functions-utils": "^5.2.90", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.40.0", + "@netlify/zip-it-and-ship-it": "9.40.1", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -27155,10 +27155,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.89", + "version": "5.2.90", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.40.0", + "@netlify/zip-it-and-ship-it": "9.40.1", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27610,7 +27610,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.40.0", + "version": "9.40.1", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 38fee30c39..8077210474 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.55.1](https://github.com/netlify/build/compare/build-v29.55.0...build-v29.55.1) (2024-10-11) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.89 to ^5.2.90 + * @netlify/zip-it-and-ship-it bumped from 9.40.0 to 9.40.1 + ## [29.55.0](https://github.com/netlify/build/compare/build-v29.54.9...build-v29.55.0) (2024-10-10) diff --git a/packages/build/package.json b/packages/build/package.json index 52a4d1080a..e1ff47c101 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.55.0", + "version": "29.55.1", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.89", + "@netlify/functions-utils": "^5.2.90", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.40.0", + "@netlify/zip-it-and-ship-it": "9.40.1", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 51aa53fb99..d8cb1f3073 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.90](https://github.com/netlify/build/compare/functions-utils-v5.2.89...functions-utils-v5.2.90) (2024-10-11) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.40.0 to 9.40.1 + ## [5.2.89](https://github.com/netlify/build/compare/functions-utils-v5.2.88...functions-utils-v5.2.89) (2024-10-10) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index c842ea90e5..2337ee0f00 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.89", + "version": "5.2.90", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.40.0", + "@netlify/zip-it-and-ship-it": "9.40.1", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index 987b1facd7..c1cd2535fd 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.40.1](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.40.0...zip-it-and-ship-it-v9.40.1) (2024-10-11) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.29.1 ([#5879](https://github.com/netlify/build/issues/5879)) ([959d7a5](https://github.com/netlify/build/commit/959d7a55c7a395a739f92bee541d762d1629e322)) +* **deps:** update dependency @netlify/serverless-functions-api to ^1.30.0 ([#5881](https://github.com/netlify/build/issues/5881)) ([cc6443c](https://github.com/netlify/build/commit/cc6443c323e61b36dba35d2c983641276ecd28c1)) + ## [9.40.0](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.39.7...zip-it-and-ship-it-v9.40.0) (2024-10-10) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index d5ca46eb10..38a562182a 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.40.0", + "version": "9.40.1", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From bdb19d8dd26b8b8eeff37311680e3b329e177f14 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:41:34 +0000 Subject: [PATCH 32/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.30.1 (#5882) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b12eeda2c5..514861610f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.30.0.tgz", - "integrity": "sha512-flmEwxe7JFqWDXmD2hyzPbmKzKZF0y2rH8IHGlD1mn9bXo9JBPm61IVLJx/A+Je4pbjgoIgYZeeZKCxnCRooHQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.30.1.tgz", + "integrity": "sha512-JkbaWFeydQdeDHz1mAy4rw+E3bl9YtbCgkntfTxq+IlNX/aIMv2/b1kZnQZcil4/sPoZGL831Dq6E374qRpU1A==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27616,7 +27616,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.30.0", + "@netlify/serverless-functions-api": "^1.30.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 38a562182a..cd0e50119e 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.30.0", + "@netlify/serverless-functions-api": "^1.30.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From dd4653c08a5cc4ad3beebb21bc07170ed4096546 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Fri, 11 Oct 2024 06:47:20 -0500 Subject: [PATCH 33/71] chore: release main (#5883) --- .release-please-manifest.json | 6 +++--- package-lock.json | 12 ++++++------ packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 7 +++++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 41 insertions(+), 15 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e0aa4ead48..2640e761da 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.15.1", - "packages/build": "29.55.1", + "packages/build": "29.55.2", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.90", + "packages/functions-utils": "5.2.91", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.40.1" + "packages/zip-it-and-ship-it": "9.40.2" } diff --git a/package-lock.json b/package-lock.json index 514861610f..bef693bc3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.55.1", + "version": "29.55.2", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26352,12 +26352,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.90", + "@netlify/functions-utils": "^5.2.91", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.40.1", + "@netlify/zip-it-and-ship-it": "9.40.2", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -27155,10 +27155,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.90", + "version": "5.2.91", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.40.1", + "@netlify/zip-it-and-ship-it": "9.40.2", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27610,7 +27610,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.40.1", + "version": "9.40.2", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 8077210474..4fe5fd1cc7 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.55.2](https://github.com/netlify/build/compare/build-v29.55.1...build-v29.55.2) (2024-10-11) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.90 to ^5.2.91 + * @netlify/zip-it-and-ship-it bumped from 9.40.1 to 9.40.2 + ## [29.55.1](https://github.com/netlify/build/compare/build-v29.55.0...build-v29.55.1) (2024-10-11) diff --git a/packages/build/package.json b/packages/build/package.json index e1ff47c101..cdf5414ada 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.55.1", + "version": "29.55.2", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.90", + "@netlify/functions-utils": "^5.2.91", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.40.1", + "@netlify/zip-it-and-ship-it": "9.40.2", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index d8cb1f3073..cb77d087cf 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.91](https://github.com/netlify/build/compare/functions-utils-v5.2.90...functions-utils-v5.2.91) (2024-10-11) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.40.1 to 9.40.2 + ## [5.2.90](https://github.com/netlify/build/compare/functions-utils-v5.2.89...functions-utils-v5.2.90) (2024-10-11) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index 2337ee0f00..e761dfe5f8 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.90", + "version": "5.2.91", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.40.1", + "@netlify/zip-it-and-ship-it": "9.40.2", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index c1cd2535fd..d8cedbd19a 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.40.2](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.40.1...zip-it-and-ship-it-v9.40.2) (2024-10-11) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.30.1 ([#5882](https://github.com/netlify/build/issues/5882)) ([bdb19d8](https://github.com/netlify/build/commit/bdb19d8dd26b8b8eeff37311680e3b329e177f14)) + ## [9.40.1](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.40.0...zip-it-and-ship-it-v9.40.1) (2024-10-11) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index cd0e50119e..38f526a33b 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.40.1", + "version": "9.40.2", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From c1e49ae455e221cc344c9f3b66d25d449d19fa8f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:09:25 +0000 Subject: [PATCH 34/71] chore(deps): update dependency @playwright/test to v1.48.0 (#5884) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bef693bc3f..ec4c6f772e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8414,13 +8414,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.47.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", - "integrity": "sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz", + "integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.47.2" + "playwright": "1.48.0" }, "bin": { "playwright": "cli.js" @@ -22025,13 +22025,13 @@ } }, "node_modules/playwright": { - "version": "1.47.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz", - "integrity": "sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz", + "integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.47.2" + "playwright-core": "1.48.0" }, "bin": { "playwright": "cli.js" @@ -22044,9 +22044,9 @@ } }, "node_modules/playwright-core": { - "version": "1.47.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", - "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz", + "integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -26468,7 +26468,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.30.0", + "@playwright/test": "^1.48.0", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", From 198329a0069b3c3cdcb5cdc3ad1524ca598e81ca Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Thu, 17 Oct 2024 10:05:59 -0400 Subject: [PATCH 35/71] chore: add basic erlang detection via rebar (#5886) * chore: add basic erlang detection via rebar * test: ensure only one runtime is detected --- .../build-info/src/runtime/erlang.test.ts | 29 +++++++++++++++++++ packages/build-info/src/runtime/erlang.ts | 7 +++++ packages/build-info/src/runtime/index.ts | 3 +- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 packages/build-info/src/runtime/erlang.test.ts create mode 100644 packages/build-info/src/runtime/erlang.ts diff --git a/packages/build-info/src/runtime/erlang.test.ts b/packages/build-info/src/runtime/erlang.test.ts new file mode 100644 index 0000000000..1a46882ca7 --- /dev/null +++ b/packages/build-info/src/runtime/erlang.test.ts @@ -0,0 +1,29 @@ +import { beforeEach, expect, test } from 'vitest' + +import { mockFileSystem } from '../../tests/mock-file-system.js' +import { NodeFS } from '../node/file-system.js' +import { Project } from '../project.js' + +beforeEach((ctx) => { + ctx.fs = new NodeFS() +}) + +test('detects erlang when rebar.config is present', async ({ fs }) => { + const cwd = mockFileSystem({ + 'rebar.config': '', + }) + + const detected = await new Project(fs, cwd).detectRuntime() + expect(detected.length).toBe(1) + expect(detected[0].name).toBe('Erlang') +}) + +test('detects erlang when rebar.lock is present', async ({ fs }) => { + const cwd = mockFileSystem({ + 'rebar.lock': '', + }) + + const detected = await new Project(fs, cwd).detectRuntime() + expect(detected.length).toBe(1) + expect(detected[0].name).toBe('Erlang') +}) diff --git a/packages/build-info/src/runtime/erlang.ts b/packages/build-info/src/runtime/erlang.ts new file mode 100644 index 0000000000..322f761603 --- /dev/null +++ b/packages/build-info/src/runtime/erlang.ts @@ -0,0 +1,7 @@ +import { LangRuntime } from './runtime.js' + +export class Erlang extends LangRuntime { + id = 'erlang' + name = 'Erlang' + configFiles = ['rebar.config', 'rebar.lock'] +} diff --git a/packages/build-info/src/runtime/index.ts b/packages/build-info/src/runtime/index.ts index ff408b3a8b..0c321ca4be 100644 --- a/packages/build-info/src/runtime/index.ts +++ b/packages/build-info/src/runtime/index.ts @@ -2,6 +2,7 @@ import { Brew } from './brew.js' import { Bun } from './bun.js' import { Emacs } from './cask.js' import { Dotnet } from './dotnet.js' +import { Erlang } from './erlang.js' import { Go } from './go.js' import { Java } from './java.js' import { Node } from './node.js' @@ -11,4 +12,4 @@ import { Ruby } from './ruby.js' import { Rust } from './rust.js' import { Swift } from './swift.js' -export const runtimes = [Node, Ruby, Brew, Bun, Emacs, Dotnet, Go, Java, Php, Rust, Swift, Python] +export const runtimes = [Node, Ruby, Brew, Bun, Dotnet, Emacs, Erlang, Go, Java, Php, Rust, Swift, Python] From e26e36a0a6337f40ac13c598732a179f9c4d583f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 00:34:49 +0000 Subject: [PATCH 36/71] chore(deps): update dependency @playwright/test to v1.48.1 (#5888) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec4c6f772e..4f81c71552 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8414,13 +8414,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz", - "integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.1.tgz", + "integrity": "sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.48.0" + "playwright": "1.48.1" }, "bin": { "playwright": "cli.js" @@ -22025,13 +22025,13 @@ } }, "node_modules/playwright": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz", - "integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.1.tgz", + "integrity": "sha512-j8CiHW/V6HxmbntOfyB4+T/uk08tBy6ph0MpBXwuoofkSnLmlfdYNNkFTYD6ofzzlSqLA1fwH4vwvVFvJgLN0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.48.0" + "playwright-core": "1.48.1" }, "bin": { "playwright": "cli.js" @@ -22044,9 +22044,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz", - "integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.1.tgz", + "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -26468,7 +26468,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.48.0", + "@playwright/test": "^1.48.1", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", From a80f13c9971dd07b22560d27ddebd4b5c5fb3ce8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 03:48:55 +0000 Subject: [PATCH 37/71] fix(deps): update dependency fdir to v6.4.2 (#5889) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f81c71552..247b9a4a1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15358,9 +15358,9 @@ } }, "node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -26363,7 +26363,7 @@ "chalk": "^5.0.0", "clean-stack": "^4.0.0", "execa": "^6.0.0", - "fdir": "^6.0.1", + "fdir": "^6.4.2", "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", @@ -26468,7 +26468,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.48.1", + "@playwright/test": "^1.30.0", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", From 46de664d2815c430f7d1b45c8bd92d42a5cc4502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Mon, 21 Oct 2024 14:54:27 +0100 Subject: [PATCH 38/71] feat: add `bootstrapVersion` field to manifest (#5890) --- packages/zip-it-and-ship-it/src/manifest.ts | 13 ++++---- .../src/runtimes/node/index.ts | 7 +++-- .../src/runtimes/node/utils/zip.ts | 20 +++++++----- .../src/utils/format_result.ts | 1 + .../zip-it-and-ship-it/tests/v2api.test.ts | 31 +++++++++++++++++++ 5 files changed, 56 insertions(+), 16 deletions(-) diff --git a/packages/zip-it-and-ship-it/src/manifest.ts b/packages/zip-it-and-ship-it/src/manifest.ts index e6d54ce851..41a4481235 100644 --- a/packages/zip-it-and-ship-it/src/manifest.ts +++ b/packages/zip-it-and-ship-it/src/manifest.ts @@ -9,20 +9,20 @@ import type { ExtendedRoute, Route } from './utils/routes.js' interface ManifestFunction { buildData?: Record + bundler?: string + displayName?: string + excludedRoutes?: Route[] + generator?: string invocationMode?: InvocationMode mainFile: string name: string path: string + priority?: number routes?: ExtendedRoute[] - excludedRoutes?: Route[] runtime: string runtimeVersion?: string schedule?: string - displayName?: string - bundler?: string - generator?: string timeout?: number - priority?: number trafficRules?: TrafficRules } @@ -51,6 +51,7 @@ export const createManifest = async ({ functions, path }: { functions: FunctionR } const formatFunctionForManifest = ({ + bootstrapVersion, bundler, displayName, excludedRoutes, @@ -74,7 +75,7 @@ const formatFunctionForManifest = ({ generator, timeout, invocationMode, - buildData: { runtimeAPIVersion }, + buildData: { bootstrapVersion, runtimeAPIVersion }, mainFile, name, priority, diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/index.ts b/packages/zip-it-and-ship-it/src/runtimes/node/index.ts index aedf137231..f488d55d55 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/node/index.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/node/index.ts @@ -110,7 +110,7 @@ const zipFunction: ZipFunction = async function ({ createPluginsModulesPathAliases(srcFiles, pluginsModulesPath, aliases, finalBasePath) const generator = mergedConfig?.generator || getInternalValue(isInternal) - const zipPath = await zipNodeJs({ + const zipResult = await zipNodeJs({ aliases, archiveFormat, basePath: finalBasePath, @@ -152,11 +152,12 @@ const zipFunction: ZipFunction = async function ({ const trafficRules = mergedConfig?.rateLimit ? getTrafficRulesConfig(mergedConfig.rateLimit) : undefined return { + bootstrapVersion: zipResult.bootstrapVersion, bundler: bundlerName, bundlerWarnings, config: mergedConfig, displayName: mergedConfig?.name, - entryFilename: zipPath.entryFilename, + entryFilename: zipResult.entryFilename, generator, timeout: mergedConfig?.timeout, inputs, @@ -165,7 +166,7 @@ const zipFunction: ZipFunction = async function ({ invocationMode, outputModuleFormat, nativeNodeModules, - path: zipPath.path, + path: zipResult.path, priority, trafficRules, runtimeVersion: diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts b/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts index 5712460712..b079430083 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/node/utils/zip.ts @@ -229,6 +229,7 @@ const createZipArchive = async function ({ const userNamespace = hasEntryFileConflict ? DEFAULT_USER_SUBDIRECTORY : '' let entryFilename = `${basename(filename, extname(filename))}.js` + let bootstrapVersion: string | undefined if (needsEntryFile) { const entryFile = getEntryFile({ @@ -255,8 +256,10 @@ const createZipArchive = async function ({ const bootstrapPath = addBootstrapFile(srcFiles, aliases) if (featureFlags.zisi_add_metadata_file === true) { - const { version: bootstrapVersion } = await getPackageJsonIfAvailable(bootstrapPath) - const payload = JSON.stringify(getMetadataFile(bootstrapVersion, branch)) + const { version } = await getPackageJsonIfAvailable(bootstrapPath) + const payload = JSON.stringify(getMetadataFile(version, branch)) + + bootstrapVersion = version addZipContent(archive, payload, METADATA_FILE_NAME) } @@ -281,16 +284,19 @@ const createZipArchive = async function ({ await endZip(archive, output) - return { path: destPath, entryFilename } + return { path: destPath, entryFilename, bootstrapVersion } +} + +interface ZipNodeJsResult { + bootstrapVersion?: string + entryFilename: string + path: string } export const zipNodeJs = function ({ archiveFormat, ...options -}: ZipNodeParameters & { archiveFormat: ArchiveFormat }): Promise<{ - path: string - entryFilename: string -}> { +}: ZipNodeParameters & { archiveFormat: ArchiveFormat }): Promise { if (archiveFormat === ARCHIVE_FORMAT.ZIP) { return createZipArchive(options) } diff --git a/packages/zip-it-and-ship-it/src/utils/format_result.ts b/packages/zip-it-and-ship-it/src/utils/format_result.ts index e5e1d30417..3e2cbb3564 100644 --- a/packages/zip-it-and-ship-it/src/utils/format_result.ts +++ b/packages/zip-it-and-ship-it/src/utils/format_result.ts @@ -5,6 +5,7 @@ import { removeUndefined } from './remove_undefined.js' import type { ExtendedRoute, Route } from './routes.js' export type FunctionResult = Omit & { + bootstrapVersion?: string routes?: ExtendedRoute[] excludedRoutes?: Route[] runtime: RuntimeName diff --git a/packages/zip-it-and-ship-it/tests/v2api.test.ts b/packages/zip-it-and-ship-it/tests/v2api.test.ts index ff20297f21..a79c6348ac 100644 --- a/packages/zip-it-and-ship-it/tests/v2api.test.ts +++ b/packages/zip-it-and-ship-it/tests/v2api.test.ts @@ -753,4 +753,35 @@ describe.runIf(semver.gte(nodeVersion, '18.13.0'))('V2 functions API', () => { }) }) }) + + test('Adds a `buildData` object to each function entry in the manifest file', async () => { + const bootstrapPath = getBootstrapPath() + const bootstrapPackageJson = await readFile(resolve(bootstrapPath, '..', '..', 'package.json'), 'utf8') + const { version: bootstrapVersion } = JSON.parse(bootstrapPackageJson) + + const { path: tmpDir } = await getTmpDir({ prefix: 'zip-it-test' }) + const manifestPath = join(tmpDir, 'manifest.json') + + const { files } = await zipFixture('v2-api', { + fixtureDir: FIXTURES_ESM_DIR, + opts: { + featureFlags: { + zisi_add_metadata_file: true, + }, + manifest: manifestPath, + }, + }) + + expect(files.length).toBe(1) + expect(files[0].name).toBe('function') + expect(files[0].bootstrapVersion).toBe(bootstrapVersion) + expect(files[0].runtimeAPIVersion).toBe(2) + + const manifestString = await readFile(manifestPath, { encoding: 'utf8' }) + const manifest = JSON.parse(manifestString) + + expect(manifest.functions.length).toBe(1) + expect(manifest.functions[0].name).toBe('function') + expect(manifest.functions[0].buildData).toEqual({ bootstrapVersion, runtimeAPIVersion: 2 }) + }) }) From 447f98f929b3b9988e82144fabf73255c6daedd6 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:15:29 -0500 Subject: [PATCH 39/71] chore: release main (#5891) * chore: release main * chore: update lockfile --------- Co-authored-by: netlify-jenkins <33464286+netlify-jenkins@users.noreply.github.com> --- .release-please-manifest.json | 6 +++--- package-lock.json | 14 +++++++------- packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 7 +++++++ packages/zip-it-and-ship-it/package.json | 2 +- 8 files changed, 42 insertions(+), 16 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 2640e761da..dda8b7f3d1 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { "packages/build-info": "7.15.1", - "packages/build": "29.55.2", + "packages/build": "29.55.3", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.91", + "packages/functions-utils": "5.2.92", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.40.2" + "packages/zip-it-and-ship-it": "9.41.0" } diff --git a/package-lock.json b/package-lock.json index 247b9a4a1d..3dad3422bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.55.2", + "version": "29.55.3", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26352,18 +26352,18 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.91", + "@netlify/functions-utils": "^5.2.92", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.40.2", + "@netlify/zip-it-and-ship-it": "9.41.0", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", "clean-stack": "^4.0.0", "execa": "^6.0.0", - "fdir": "^6.4.2", + "fdir": "^6.0.1", "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", @@ -27155,10 +27155,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.91", + "version": "5.2.92", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.40.2", + "@netlify/zip-it-and-ship-it": "9.41.0", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27610,7 +27610,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.40.2", + "version": "9.41.0", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 4fe5fd1cc7..fe36694c08 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.55.3](https://github.com/netlify/build/compare/build-v29.55.2...build-v29.55.3) (2024-10-21) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.91 to ^5.2.92 + * @netlify/zip-it-and-ship-it bumped from 9.40.2 to 9.41.0 + ## [29.55.2](https://github.com/netlify/build/compare/build-v29.55.1...build-v29.55.2) (2024-10-11) diff --git a/packages/build/package.json b/packages/build/package.json index cdf5414ada..2f048e3d0e 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.55.2", + "version": "29.55.3", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.91", + "@netlify/functions-utils": "^5.2.92", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.40.2", + "@netlify/zip-it-and-ship-it": "9.41.0", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index cb77d087cf..6b679dc26c 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.92](https://github.com/netlify/build/compare/functions-utils-v5.2.91...functions-utils-v5.2.92) (2024-10-21) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.40.2 to 9.41.0 + ## [5.2.91](https://github.com/netlify/build/compare/functions-utils-v5.2.90...functions-utils-v5.2.91) (2024-10-11) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index e761dfe5f8..4c019c6b7a 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.91", + "version": "5.2.92", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.40.2", + "@netlify/zip-it-and-ship-it": "9.41.0", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index d8cedbd19a..1b8f79ada9 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.41.0](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.40.2...zip-it-and-ship-it-v9.41.0) (2024-10-21) + + +### Features + +* add `bootstrapVersion` field to manifest ([#5890](https://github.com/netlify/build/issues/5890)) ([46de664](https://github.com/netlify/build/commit/46de664d2815c430f7d1b45c8bd92d42a5cc4502)) + ## [9.40.2](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.40.1...zip-it-and-ship-it-v9.40.2) (2024-10-11) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 38f526a33b..b77b82d549 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.40.2", + "version": "9.41.0", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 07e567c61d25dbade69c3f913a300c055d8f465a Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Mon, 21 Oct 2024 09:11:33 -0700 Subject: [PATCH 40/71] fix: various fixes to extension dev/test flow (#5885) * fix: pass pluginsEnv to integration build hooks build step For context: `@netlify/build` automatically builds integrations when `context` is set to `dev`. This PR targets that functionality. Without this change, `buildSite`'s programmatic interface doesn't pass programatically defined `env` variables into the task that builds ~integrations~ extensions' build hooks. ```ts import buildSite from "@netlify/build"; await buildSite({ env: { // This is passed to the build plugin when it's executed, but is not // passed to the task that builds the plugin. SOME_ENV_VAR: "1", }, }); ``` I don't know if `pluginsEnv` or `childEnv` is the more appropriate value to pass here, but `pluginsEnv` seems more consistent with how build treats integrations as plugins, so I chose to use it. Two total digressions I thought of while writing this: - We should probably be passing `extendEnv: false` to the `execa` invocation that builds the integration, but I'm not sure if that would break something at this point, so I'm leaving it as is for now. - I sort of hate that `@netlify/build` builds the integration automatically. It's challenging to use it in tests: every test rebuilds the integration (which is expensive) and you have to make sure that no two tests that auto-build the integration build it concurrently, otherwise you might end up with test flakes when one test writes to the built tarball while another test is installing from it. I don't yet know what the best way to solve this problem is, so I'm punting on solving it for now. * fix: resolve integration dev path relative to buildDir Currently, programmatic executions of `buildSite` resolve a development integration's path (specified via `netlify.toml#integrations[].dev.path`) relative to the current working directory. I don't think this makes any sense, honestly. I find this undocumented behavior unintuitive; if I specify a relative path in a `netlify.toml` I would expect it to be resolved relative to the `netlify.toml`. This is _technically_ a breaking change, but in practice I really doubt any users are testing extension build hooks, it's unlikely to break anything for the platform team (_maybe_ a few tests, but we can update the paths in those tests if it does). I'm tempted to remove `testOpts.cwd` here because I can't find anywhere that we use it internally and it's unintuitive, too, but I'm leaving it in for now as an easy escape hatch in case this change breaks any tests Composable Platform has. * fix: return integration build plugin path in development Currently, when running a build in `context=dev` mode for a site that installs an extension never actually installs the extension's build plugin, if it has one. That's because the integration package resolver doesn't return the path to the built package (tarball), so build never picks it up as a plugin. This changeset fixes that issue. * refactor: print stack on failure to build integration in dev mode * style: run prettier * fix: remove duplicative integration install step In 0cfe6d8 I introduced a duplicative integration install step when `context=dev`, not realizing that we have a special case for resolving integrations in dev mode: https://github.com/netlify/build/blob/main/packages/build/src/plugins/resolve.js#L189-L195 Returning the tarball location meant we were installing the integration's packed tarball and then also installing from the pre-pack build directory. This changeset removes that duplication. It's... weird that we don't just return the location of a packed npm package (tarball) and instead have a special case that points at the pre-pack build artifact directory. This sort of special-cased action at a distance makes it super hard to understand how this works. I'm going to circle back on de-confusing this sometime this quarter when I make the extension build artifact path configurable, which will solve a lot of testing pain points we currently have. The failing test I also fix in this changeset was never realistic and didn't exercise some of the code paths it was supposed to put under test, so I've updated that test fixture to be realistic. --- packages/build/src/core/build.ts | 11 ++++---- packages/build/src/install/missing.js | 23 ++++++++++++---- packages/build/src/plugins/options.ts | 2 ++ packages/build/src/plugins/resolve.js | 26 ++++++++++++++++-- .../integration/.ntli/build/.gitkeep | 0 .../integration/.ntli/build/index.js | 3 ++ .../integration/.ntli/build/manifest.yml | 2 ++ .../integration/.ntli/build/package.json | 7 +++++ .../integration/manifest.yml | 2 +- .../integration/package.json | 2 +- .../local_missing_integration/netlify.toml | 2 +- .../build/tests/install/snapshots/tests.js.md | 13 +++++++-- .../tests/install/snapshots/tests.js.snap | Bin 2534 -> 2534 bytes packages/build/tests/install/tests.js | 11 ++------ 14 files changed, 76 insertions(+), 28 deletions(-) delete mode 100644 packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/.gitkeep create mode 100644 packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/manifest.yml create mode 100644 packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/package.json diff --git a/packages/build/src/core/build.ts b/packages/build/src/core/build.ts index 8f438479f1..63d1a4ad8f 100644 --- a/packages/build/src/core/build.ts +++ b/packages/build/src/core/build.ts @@ -449,6 +449,11 @@ const initAndRunBuild = async function ({ edgeFunctionsBootstrapURL, eventHandlers, }) { + const pluginsEnv = { + ...childEnv, + ...getBlobsEnvironmentContext({ api, deployId: deployId, siteId: siteInfo?.id, token }), + } + const { pluginsOptions: pluginsOptionsA, timers: timersA } = await getPluginsOptions({ pluginsOptions, netlifyConfig, @@ -469,13 +474,9 @@ const initAndRunBuild = async function ({ integrations, context, systemLog, + pluginsEnv, }) - const pluginsEnv = { - ...childEnv, - ...getBlobsEnvironmentContext({ api, deployId: deployId, siteId: siteInfo?.id, token }), - } - if (pluginsOptionsA?.length) { const buildPlugins = {} for (const plugin of pluginsOptionsA) { diff --git a/packages/build/src/install/missing.js b/packages/build/src/install/missing.js index 8df8d5eb29..45c60b810b 100644 --- a/packages/build/src/install/missing.js +++ b/packages/build/src/install/missing.js @@ -34,6 +34,8 @@ export const installIntegrationPlugins = async function ({ logs, context, testOpts, + pluginsEnv, + buildDir, }) { const integrationsToBuild = integrations.filter( (integration) => typeof integration.dev !== 'undefined' && context === 'dev', @@ -46,7 +48,11 @@ export const installIntegrationPlugins = async function ({ ) } const packages = ( - await Promise.all(integrations.map((integration) => getIntegrationPackage({ integration, context, testOpts }))) + await Promise.all( + integrations.map((integration) => + getIntegrationPackage({ integration, context, testOpts, buildDir, pluginsEnv }), + ), + ) ).filter(Boolean) logInstallIntegrations( logs, @@ -64,7 +70,13 @@ export const installIntegrationPlugins = async function ({ await addExactDependencies({ packageRoot: autoPluginsDir, isLocal: mode !== 'buildbot', packages }) } -const getIntegrationPackage = async function ({ integration: { version, dev }, context, testOpts = {} }) { +const getIntegrationPackage = async function ({ + integration: { version, dev }, + context, + testOpts = {}, + buildDir, + pluginsEnv, +}) { if (typeof version !== 'undefined') { return `${version}/packages/buildhooks.tgz` } @@ -72,9 +84,10 @@ const getIntegrationPackage = async function ({ integration: { version, dev }, c if (typeof dev !== 'undefined' && context === 'dev') { const { path } = dev - const integrationDir = testOpts.cwd ? resolve(testOpts.cwd, path) : resolve(path) + const integrationDir = testOpts.cwd ? resolve(testOpts.cwd, path) : resolve(buildDir, path) + try { - const res = await execa('npm', ['run', 'build'], { cwd: integrationDir }) + const res = await execa('npm', ['run', 'build'], { cwd: integrationDir, env: pluginsEnv }) // This is horrible and hacky, but `npm run build` will // return status code 0 even if it fails @@ -82,7 +95,7 @@ const getIntegrationPackage = async function ({ integration: { version, dev }, c throw new Error(res.stdout) } } catch (e) { - throw new Error(`Failed to build integration`) + throw new Error(`Failed to build integration. Error:\n\n${e.stack}`) } return undefined diff --git a/packages/build/src/plugins/options.ts b/packages/build/src/plugins/options.ts index f895006514..e9347f7bba 100644 --- a/packages/build/src/plugins/options.ts +++ b/packages/build/src/plugins/options.ts @@ -32,6 +32,7 @@ const tGetPluginsOptions = async function ({ integrations, context, systemLog, + pluginsEnv, }) { const pluginsOptionsA = await resolvePluginsPath({ pluginsOptions, @@ -51,6 +52,7 @@ const tGetPluginsOptions = async function ({ integrations, context, systemLog, + pluginsEnv, }) const pluginsOptionsB = await Promise.all( pluginsOptionsA.map((pluginOptions) => loadPluginFiles({ pluginOptions, debug })), diff --git a/packages/build/src/plugins/resolve.js b/packages/build/src/plugins/resolve.js index c39a9aef7e..7ff2dc9dcc 100644 --- a/packages/build/src/plugins/resolve.js +++ b/packages/build/src/plugins/resolve.js @@ -33,6 +33,7 @@ export const resolvePluginsPath = async function ({ integrations, context, systemLog, + pluginsEnv, }) { const autoPluginsDir = getAutoPluginsDir(buildDir, packagePath) const pluginsOptionsA = await Promise.all( @@ -77,6 +78,7 @@ export const resolvePluginsPath = async function ({ buildDir, context, testOpts, + pluginsEnv, }) return [...pluginsOptionsE, ...integrationPluginOptions] @@ -164,9 +166,27 @@ const handleMissingPlugins = async function ({ pluginsOptions, autoPluginsDir, m return Promise.all(pluginsOptions.map((pluginOptions) => resolveMissingPluginPath({ pluginOptions, autoPluginsDir }))) } -const handleIntegrations = async function ({ integrations, autoPluginsDir, mode, logs, buildDir, context, testOpts }) { +const handleIntegrations = async function ({ + integrations, + autoPluginsDir, + mode, + logs, + buildDir, + context, + testOpts, + pluginsEnv, +}) { const toInstall = integrations.filter((integration) => integration.has_build) - await installIntegrationPlugins({ integrations: toInstall, autoPluginsDir, mode, logs, context, testOpts }) + await installIntegrationPlugins({ + integrations: toInstall, + autoPluginsDir, + mode, + logs, + context, + testOpts, + buildDir, + pluginsEnv, + }) if (toInstall.length === 0) { return [] @@ -188,7 +208,7 @@ const handleIntegrations = async function ({ integrations, autoPluginsDir, mode, const resolveIntegration = async function ({ integration, autoPluginsDir, buildDir, context, testOpts }) { if (typeof integration.dev !== 'undefined' && context === 'dev') { const { path } = integration.dev - const integrationDir = testOpts.cwd ? resolve(testOpts.cwd, path) : resolve(path) + const integrationDir = testOpts.cwd ? resolve(testOpts.cwd, path) : resolve(buildDir, path) const pluginPath = await resolvePath(`${integrationDir}/.ntli/build`, buildDir) return { pluginPath, packageName: `${integration.slug}`, isIntegration: true, integration, loadedFrom: 'local' } diff --git a/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/.gitkeep b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/index.js b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/index.js index e69de29bb2..8c1f901340 100644 --- a/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/index.js +++ b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/index.js @@ -0,0 +1,3 @@ +export const onPreBuild = function () { + console.log("Hello world"); +} diff --git a/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/manifest.yml b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/manifest.yml new file mode 100644 index 0000000000..bbc1fee978 --- /dev/null +++ b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/manifest.yml @@ -0,0 +1,2 @@ +name: abc-integration +inputs: [] diff --git a/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/package.json b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/package.json new file mode 100644 index 0000000000..507b311db0 --- /dev/null +++ b/packages/build/tests/install/fixtures/local_missing_integration/integration/.ntli/build/package.json @@ -0,0 +1,7 @@ +{ + "main": "index.js", + "type": "module", + "version": "0.0.0", + "name": "abc-integration", + "dependencies": {} +} diff --git a/packages/build/tests/install/fixtures/local_missing_integration/integration/manifest.yml b/packages/build/tests/install/fixtures/local_missing_integration/integration/manifest.yml index a3512f0259..bbc1fee978 100644 --- a/packages/build/tests/install/fixtures/local_missing_integration/integration/manifest.yml +++ b/packages/build/tests/install/fixtures/local_missing_integration/integration/manifest.yml @@ -1,2 +1,2 @@ -name: test +name: abc-integration inputs: [] diff --git a/packages/build/tests/install/fixtures/local_missing_integration/integration/package.json b/packages/build/tests/install/fixtures/local_missing_integration/integration/package.json index 8521f0f9aa..26fafe3703 100644 --- a/packages/build/tests/install/fixtures/local_missing_integration/integration/package.json +++ b/packages/build/tests/install/fixtures/local_missing_integration/integration/package.json @@ -1,5 +1,5 @@ { - "name": "plugin_deps_plugin", + "name": "abc-integration", "version": "0.0.1", "type": "module", "scripts": { diff --git a/packages/build/tests/install/fixtures/local_missing_integration/netlify.toml b/packages/build/tests/install/fixtures/local_missing_integration/netlify.toml index c7204d2e8c..45a6d67bac 100644 --- a/packages/build/tests/install/fixtures/local_missing_integration/netlify.toml +++ b/packages/build/tests/install/fixtures/local_missing_integration/netlify.toml @@ -1,5 +1,5 @@ [[integrations]] -name = "abc-integration" +name = "test" [integrations.dev] path = "./integration" diff --git a/packages/build/tests/install/snapshots/tests.js.md b/packages/build/tests/install/snapshots/tests.js.md index 9b23f807b5..5f3ce01703 100644 --- a/packages/build/tests/install/snapshots/tests.js.md +++ b/packages/build/tests/install/snapshots/tests.js.md @@ -1051,7 +1051,6 @@ Generated by [AVA](https://avajs.dev). debug: true␊ repositoryRoot: packages/build/tests/install/fixtures/local_missing_integration␊ testOpts:␊ - cwd: ./tests/install/fixtures/local_missing_integration/␊ pluginsListUrl: test␊ silentLingeringProcesses: true␊ ␊ @@ -1070,10 +1069,18 @@ Generated by [AVA](https://avajs.dev). dev␊ ␊ > Building integrations␊ - - abc-integration from ./integration␊ + - test from ./integration␊ ␊ > Loading integrations␊ - - abc-integration␊ + - test␊ + ␊ + test (onPreBuild event) ␊ + ────────────────────────────────────────────────────────────────␊ + ␊ + Hello world␊ + ␊ + (test onPreBuild completed in 1ms)␊ + Build step duration: test onPreBuild completed in 1ms␊ ␊ Netlify Build Complete ␊ ────────────────────────────────────────────────────────────────␊ diff --git a/packages/build/tests/install/snapshots/tests.js.snap b/packages/build/tests/install/snapshots/tests.js.snap index 8828ee6096bd6dfb00e898a6dedc1ef40ea1da35..490600bcfb5a5706ec8e9f10fdfbf6b8be9f31bc 100644 GIT binary patch literal 2534 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 literal 2534 zcmVzpvg_I3iPUP(5s#q{*I(w{ZOPBc?4py zOLESfIe*_bq-OSqVc(^L*X&P!!QA04zI^|2NCw=Ygqg@8j9adYZ0uuVV={0sLj*I9 zZHE!dXJg9Q_dnRS#jUU3{py!DZru={U);R$-aGf-HJ)MaI>RY?7&@+v*8Ld&{_}S~ z>%%baqu=9zfh`S$9+1cyoxZfjQTwCzN8*mht~FwC-NyZJWFj7f82$>dPnpAMFzr&x zP2^jH*VYKLsC9>f4_GI5PiN>{@-Tplwi7^Gaq-OO%rt}fWT;flnk8_8bVL&H0{KuYIEwj zLQWSm>Q1nY22vo%k|N>(hJDvznrXyDa$2eAR@`%IKm**24bAbT(B2QI9m?Ab zV>JQjkdpHNM@fn&;P5;9l7CO4VM26gUR8>jVH~b#q@0Zg)bm{oH4r?Cjy!h9h|WV< z^pPC~mS}FG;(`q$t;G=V#FhhjyDI3p%my*;%oM|bdU=1QX=*@{CFdbKZG74O28?JN zE->SYPF$g-F@tj_@%6XJONXijRp5?`v*SIX8)YQxATUD6=6)iJO2l%2bvum{&>F8c9Fb=8eK(h~_XmQ|Qy&7LAcw73MKQN<~B_He<<5Mh-|*nc5th%Iw?)g*~XLOl^;HsZ3{eDgzBq zo-80Te^ZFeUp0{_KxDx5E}cHHO{C&oZ{WaHkJ{uVogZdDdug_)5B?!R(DlA zikA#nb3Hd1YUCFeG>{cw*@YECWdKjfH{@AgZRqCt7{g8CMusOiuv~OuO&Q`8O423h z45NYk>AToV9(Q%IM<-%@QyK=>bxv$#*|xZokFh!i5HHSw?S>W;H9>a4tfBZ73SKDmXeU~Rgh(e4-%Cc^K;XNEc%s)xtSHAY??Mt? z=qD7ygPsz}$Jv;M)OG2F_$$H_F)rD#k*~-NQ~2}c%NTQBy~+wb`W!V@d!E#gF(LIC zT8;=5$wH2z)H7p%TdPW@i;U1|w|mw#p=5?2UIa`K0Z1-{MfYzztR&p=<(9bPT?BD8 zRaz{dlg4X>PX2LrVzBOK59;vF=%nyhO*y5aT2W$|7gi0soUv@(YJp-9%`=y$sOFgk zjJF=oRGF1vnPY2$ui%zu4%6?V1{+&}-_U$h^Uc-x=DjEd*(!u{am`$hb(Yyn7W*2} zW-0E2MHJTu_QD}w0}<&AU5uf)4Dqo z!CzICHeJ!47gFxJ_8AM7v$|awj%J(76G^|utL;(lYrM}k#3{L2XaPojqF~ga#;D3M zN_wU~_>`%$AvUD~O2wtT)k?vnY#17kmM4wIquL(j;?alkSCb=vNv7%fXA$N#+ie{D zQ-PnqYxt=germJHMuDw0%HB|8={6c$ULYZJX=ZW6Mv~jH#Exe9P^st4u>Nw5bwp@zEEODo zyDB(Nuien$;J*q={!61|0hgmPbo z<_)*!_*oDD&!ghdm~A0eM{pbvs2|rX@Y#c;o?q9KElY4bp9VZOt(o5X^0eFSeRcNe z#naQ?v$N;D$7e5|J$hxL6N`veLxz>aMMw$UK=jNO~FbIW1*-s zXj!vPbZ2IIkvBXltA7|nIe`;VOfQJa`4Ily^W&2*(ev){$!R7Ma>U00kEr9fkY?gx zU~`e*n&{28mz(Tc`AK-iC#&&_fQs+?UP~?x-c!iMJ9T*W(pH#sdbCTX73V zJ~tM;W1X4HYPi|a5|Y?)^_b48DivBv5(}wdIZ0;0(x6e#KC4T^de1)9;I4K88o~R% zP7!yO%n8iCdO~E5jUsf0{wDG(Gk4QXv(&dSVw;WRirDrd-&QW>9MWJQ93qE355YG- zS0K23Q$z4N5Il(LuZW9D8Hn7=`Ew4P2N$*oq;=(VY69)b*tP-l${;I){23QrSuqr} w7U2RXWR6AK-K8>Ou(tYxRz8_!^=x-$Y?k2s()N0GRLbn=|4wp86IG1>0JOp1zyJUM diff --git a/packages/build/tests/install/tests.js b/packages/build/tests/install/tests.js index 343da99ad0..3e69408b17 100644 --- a/packages/build/tests/install/tests.js +++ b/packages/build/tests/install/tests.js @@ -153,15 +153,8 @@ test('Install local plugin dependencies: missing plugin in netlify.toml', async t.snapshot(normalizeOutput(output)) }) -test('In integration dev mode, install local plugins and install the integration when forcing build', async (t) => { - const output = await new Fixture('./fixtures/local_missing_integration') - .withFlags({ - context: 'dev', - testOpts: { - cwd: './tests/install/fixtures/local_missing_integration/', - }, - }) - .runWithBuild() +test.only('In integration dev mode, install local plugins and install the integration when forcing build', async (t) => { + const output = await new Fixture('./fixtures/local_missing_integration').withFlags({ context: 'dev' }).runWithBuild() t.snapshot(normalizeOutput(output)) }) From 6ecd378b02bd7ad6f083cd495ad3001e7493c8a5 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Mon, 21 Oct 2024 17:06:47 -0500 Subject: [PATCH 41/71] chore: release main (#5892) --- .release-please-manifest.json | 2 +- package-lock.json | 2 +- packages/build/CHANGELOG.md | 7 +++++++ packages/build/package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index dda8b7f3d1..b7fcfd02fc 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,6 +1,6 @@ { "packages/build-info": "7.15.1", - "packages/build": "29.55.3", + "packages/build": "29.55.4", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", diff --git a/package-lock.json b/package-lock.json index 3dad3422bb..fe93693cc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.55.3", + "version": "29.55.4", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index fe36694c08..56bd8d96a9 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,13 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.55.4](https://github.com/netlify/build/compare/build-v29.55.3...build-v29.55.4) (2024-10-21) + + +### Bug Fixes + +* various fixes to extension dev/test flow ([#5885](https://github.com/netlify/build/issues/5885)) ([07e567c](https://github.com/netlify/build/commit/07e567c61d25dbade69c3f913a300c055d8f465a)) + ## [29.55.3](https://github.com/netlify/build/compare/build-v29.55.2...build-v29.55.3) (2024-10-21) diff --git a/packages/build/package.json b/packages/build/package.json index 2f048e3d0e..f698f88689 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.55.3", + "version": "29.55.4", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", From d07e0d52bf1e3d8410625e216e08914b4f0ae8cc Mon Sep 17 00:00:00 2001 From: Michal Piechowiak Date: Tue, 22 Oct 2024 12:23:37 +0200 Subject: [PATCH 42/71] fix: detect next if typescript config file is used (#5893) --- packages/build-info/src/frameworks/next.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/build-info/src/frameworks/next.ts b/packages/build-info/src/frameworks/next.ts index be9c0bc2fc..15eee5c62e 100644 --- a/packages/build-info/src/frameworks/next.ts +++ b/packages/build-info/src/frameworks/next.ts @@ -8,7 +8,7 @@ export class Next extends BaseFramework implements Framework { category = Category.SSG npmDependencies = ['next'] excludedNpmDependencies = ['@nrwl/next'] - configFiles = ['next.config.js', 'next.config.mjs'] + configFiles = ['next.config.js', 'next.config.mjs', 'next.config.ts'] dev = { command: 'next', From 4074f07dfbc19fad1932230725ad5f91ef1729b3 Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Tue, 22 Oct 2024 08:46:51 -0700 Subject: [PATCH 43/71] test(build): remove test focus (#5895) --- packages/build/tests/install/tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/build/tests/install/tests.js b/packages/build/tests/install/tests.js index 3e69408b17..1a81eb2ac4 100644 --- a/packages/build/tests/install/tests.js +++ b/packages/build/tests/install/tests.js @@ -153,7 +153,7 @@ test('Install local plugin dependencies: missing plugin in netlify.toml', async t.snapshot(normalizeOutput(output)) }) -test.only('In integration dev mode, install local plugins and install the integration when forcing build', async (t) => { +test('In integration dev mode, install local plugins and install the integration when forcing build', async (t) => { const output = await new Fixture('./fixtures/local_missing_integration').withFlags({ context: 'dev' }).runWithBuild() t.snapshot(normalizeOutput(output)) From a849029e10547c717c2291c5f6cd56f8ba72e5d3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 08:55:11 +0000 Subject: [PATCH 44/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.31.0 (#5898) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe93693cc4..647c71738f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.30.1.tgz", - "integrity": "sha512-JkbaWFeydQdeDHz1mAy4rw+E3bl9YtbCgkntfTxq+IlNX/aIMv2/b1kZnQZcil4/sPoZGL831Dq6E374qRpU1A==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.31.0.tgz", + "integrity": "sha512-/ux3fefmw0yGmzRMOqhGrzbAuALtW8HY08bjE4yCk+y8CzB9r9mPd1ApSJe3KlYD+sqDvbQGrEXdifQ/LzUIDQ==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27616,7 +27616,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.30.1", + "@netlify/serverless-functions-api": "^1.31.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index b77b82d549..4ad4e9f2be 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.30.1", + "@netlify/serverless-functions-api": "^1.31.0", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 28a178c52d2c7a58c105b4938eb5722daa7e779a Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Fri, 25 Oct 2024 04:42:39 -0500 Subject: [PATCH 45/71] chore: release main (#5894) --- .release-please-manifest.json | 8 ++++---- package-lock.json | 14 +++++++------- packages/build-info/CHANGELOG.md | 7 +++++++ packages/build-info/package.json | 2 +- packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 6 +++--- packages/functions-utils/CHANGELOG.md | 9 +++++++++ packages/functions-utils/package.json | 4 ++-- packages/zip-it-and-ship-it/CHANGELOG.md | 7 +++++++ packages/zip-it-and-ship-it/package.json | 2 +- 10 files changed, 51 insertions(+), 18 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b7fcfd02fc..1d915e26f3 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,11 +1,11 @@ { - "packages/build-info": "7.15.1", - "packages/build": "29.55.4", + "packages/build-info": "7.15.2", + "packages/build": "29.55.5", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", "packages/framework-info": "9.8.13", - "packages/functions-utils": "5.2.92", + "packages/functions-utils": "5.2.93", "packages/git-utils": "5.1.1", "packages/headers-parser": "7.1.4", "packages/js-client": "13.1.21", @@ -14,5 +14,5 @@ "packages/run-utils": "5.1.1", "packages/opentelemetry-sdk-setup": "1.1.3", "packages/opentelemetry-utils": "1.2.1", - "packages/zip-it-and-ship-it": "9.41.0" + "packages/zip-it-and-ship-it": "9.41.1" } diff --git a/package-lock.json b/package-lock.json index 647c71738f..664419110a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.55.4", + "version": "29.55.5", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26352,12 +26352,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.92", + "@netlify/functions-utils": "^5.2.93", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.41.0", + "@netlify/zip-it-and-ship-it": "9.41.1", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -26450,7 +26450,7 @@ }, "packages/build-info": { "name": "@netlify/build-info", - "version": "7.15.1", + "version": "7.15.2", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.20.0", @@ -27155,10 +27155,10 @@ }, "packages/functions-utils": { "name": "@netlify/functions-utils", - "version": "5.2.92", + "version": "5.2.93", "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.41.0", + "@netlify/zip-it-and-ship-it": "9.41.1", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -27610,7 +27610,7 @@ }, "packages/zip-it-and-ship-it": { "name": "@netlify/zip-it-and-ship-it", - "version": "9.41.0", + "version": "9.41.1", "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", diff --git a/packages/build-info/CHANGELOG.md b/packages/build-info/CHANGELOG.md index c1ed2c7c9d..e7e975bb48 100644 --- a/packages/build-info/CHANGELOG.md +++ b/packages/build-info/CHANGELOG.md @@ -64,6 +64,13 @@ * dependencies * @netlify/framework-info bumped from ^9.8.8 to ^9.8.9 +## [7.15.2](https://github.com/netlify/build/compare/build-info-v7.15.1...build-info-v7.15.2) (2024-10-25) + + +### Bug Fixes + +* detect next if typescript config file is used ([#5893](https://github.com/netlify/build/issues/5893)) ([d07e0d5](https://github.com/netlify/build/commit/d07e0d52bf1e3d8410625e216e08914b4f0ae8cc)) + ## [7.15.1](https://github.com/netlify/build/compare/build-info-v7.15.0...build-info-v7.15.1) (2024-10-01) diff --git a/packages/build-info/package.json b/packages/build-info/package.json index ea6c5bcd9a..943fd21bf7 100644 --- a/packages/build-info/package.json +++ b/packages/build-info/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build-info", - "version": "7.15.1", + "version": "7.15.2", "description": "Build info utility", "type": "module", "exports": { diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 56bd8d96a9..385b91d20c 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,16 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.55.5](https://github.com/netlify/build/compare/build-v29.55.4...build-v29.55.5) (2024-10-25) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/functions-utils bumped from ^5.2.92 to ^5.2.93 + * @netlify/zip-it-and-ship-it bumped from 9.41.0 to 9.41.1 + ## [29.55.4](https://github.com/netlify/build/compare/build-v29.55.3...build-v29.55.4) (2024-10-21) diff --git a/packages/build/package.json b/packages/build/package.json index f698f88689..467e871a73 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.55.4", + "version": "29.55.5", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -73,12 +73,12 @@ "@netlify/config": "^20.19.0", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", - "@netlify/functions-utils": "^5.2.92", + "@netlify/functions-utils": "^5.2.93", "@netlify/git-utils": "^5.1.1", "@netlify/opentelemetry-utils": "^1.2.1", "@netlify/plugins-list": "^6.80.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.41.0", + "@netlify/zip-it-and-ship-it": "9.41.1", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", diff --git a/packages/functions-utils/CHANGELOG.md b/packages/functions-utils/CHANGELOG.md index 6b679dc26c..36edc74196 100644 --- a/packages/functions-utils/CHANGELOG.md +++ b/packages/functions-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.2.93](https://github.com/netlify/build/compare/functions-utils-v5.2.92...functions-utils-v5.2.93) (2024-10-25) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/zip-it-and-ship-it bumped from 9.41.0 to 9.41.1 + ## [5.2.92](https://github.com/netlify/build/compare/functions-utils-v5.2.91...functions-utils-v5.2.92) (2024-10-21) diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index 4c019c6b7a..9f108be7d0 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/functions-utils", - "version": "5.2.92", + "version": "5.2.93", "description": "Utility for adding Functions files in Netlify Build", "type": "module", "exports": "./lib/main.js", @@ -50,7 +50,7 @@ }, "license": "MIT", "dependencies": { - "@netlify/zip-it-and-ship-it": "9.41.0", + "@netlify/zip-it-and-ship-it": "9.41.1", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, diff --git a/packages/zip-it-and-ship-it/CHANGELOG.md b/packages/zip-it-and-ship-it/CHANGELOG.md index 1b8f79ada9..a1074ce18a 100644 --- a/packages/zip-it-and-ship-it/CHANGELOG.md +++ b/packages/zip-it-and-ship-it/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [9.41.1](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.41.0...zip-it-and-ship-it-v9.41.1) (2024-10-25) + + +### Bug Fixes + +* **deps:** update dependency @netlify/serverless-functions-api to ^1.31.0 ([#5898](https://github.com/netlify/build/issues/5898)) ([a849029](https://github.com/netlify/build/commit/a849029e10547c717c2291c5f6cd56f8ba72e5d3)) + ## [9.41.0](https://github.com/netlify/build/compare/zip-it-and-ship-it-v9.40.2...zip-it-and-ship-it-v9.41.0) (2024-10-21) diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 4ad4e9f2be..8e2ef3d2de 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/zip-it-and-ship-it", - "version": "9.41.0", + "version": "9.41.1", "description": "Zip it and ship it", "main": "./dist/main.js", "type": "module", From 21eba9f958a4f03751b60a950115854b798ef228 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 01:02:02 +0000 Subject: [PATCH 46/71] chore(deps): update dependency @playwright/test to v1.48.2 (#5900) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 664419110a..5e38bbb63f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8414,13 +8414,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.1.tgz", - "integrity": "sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==", + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz", + "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.48.1" + "playwright": "1.48.2" }, "bin": { "playwright": "cli.js" @@ -22025,13 +22025,13 @@ } }, "node_modules/playwright": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.1.tgz", - "integrity": "sha512-j8CiHW/V6HxmbntOfyB4+T/uk08tBy6ph0MpBXwuoofkSnLmlfdYNNkFTYD6ofzzlSqLA1fwH4vwvVFvJgLN0w==", + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz", + "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.48.1" + "playwright-core": "1.48.2" }, "bin": { "playwright": "cli.js" @@ -22044,9 +22044,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.1.tgz", - "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==", + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz", + "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -26468,7 +26468,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.30.0", + "@playwright/test": "^1.48.2", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", From a631d8c71316b083017cfd702f138e723043c6da Mon Sep 17 00:00:00 2001 From: David Berlin <47757213+davbree@users.noreply.github.com> Date: Tue, 29 Oct 2024 13:17:40 +0200 Subject: [PATCH 47/71] feat: keep logging pipe for trusted plugins (#5899) * chore: keep logging pipe for trusted plugins --- packages/build/src/steps/plugin.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/build/src/steps/plugin.js b/packages/build/src/steps/plugin.js index 58053fbf23..c4ef936492 100644 --- a/packages/build/src/steps/plugin.js +++ b/packages/build/src/steps/plugin.js @@ -108,7 +108,9 @@ export const firePluginStep = async function ({ }) return { newError } } finally { - await unpipePluginOutput(childProcess, logs, listeners, standardStreams) + if (!isTrustedPlugin(pluginPackageJson?.name) || listeners) { + await unpipePluginOutput(childProcess, logs, listeners, standardStreams) + } logStepCompleted(logs, verbose) } } From bd4930551c95f1a986c92e0f54d184fad92b1369 Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:42:13 -0500 Subject: [PATCH 48/71] chore: release main (#5902) * chore: release main * chore: update lockfile --------- Co-authored-by: netlify-jenkins <33464286+netlify-jenkins@users.noreply.github.com> --- .release-please-manifest.json | 2 +- package-lock.json | 4 ++-- packages/build/CHANGELOG.md | 7 +++++++ packages/build/package.json | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1d915e26f3..31d57b57b3 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,6 +1,6 @@ { "packages/build-info": "7.15.2", - "packages/build": "29.55.5", + "packages/build": "29.56.0", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", "packages/config": "20.19.0", diff --git a/package-lock.json b/package-lock.json index 5e38bbb63f..4f3601b5b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,7 +26343,7 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.55.5", + "version": "29.56.0", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", @@ -26468,7 +26468,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.48.2", + "@playwright/test": "^1.30.0", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 385b91d20c..65a2a60440 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,13 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.56.0](https://github.com/netlify/build/compare/build-v29.55.5...build-v29.56.0) (2024-10-29) + + +### Features + +* keep logging pipe for trusted plugins ([#5899](https://github.com/netlify/build/issues/5899)) ([a631d8c](https://github.com/netlify/build/commit/a631d8c71316b083017cfd702f138e723043c6da)) + ## [29.55.5](https://github.com/netlify/build/compare/build-v29.55.4...build-v29.55.5) (2024-10-25) diff --git a/packages/build/package.json b/packages/build/package.json index 467e871a73..f17dc94222 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.55.5", + "version": "29.56.0", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", From c0ab5479bd533315d39983e50a9c8a1bee5966ff Mon Sep 17 00:00:00 2001 From: Will Date: Fri, 1 Nov 2024 18:08:17 -0500 Subject: [PATCH 49/71] fix: environment variable build context filtering fix (#5887) * build: initial commit initial commit Co-authored-by: Thomas Lane <163203257+tlane25@users.noreply.github.com> * fix: build getEnvelope context fixed issue where build was not injecting env variables that were not dev or all context Co-authored-by: Thomas Lane <163203257+tlane25@users.noreply.github.com> * fix: fixed test that was failing Co-authored-by: Thomas Lane <163203257+tlane25@users.noreply.github.com> Co-authored-by: Thomas Lane --------- Co-authored-by: Thomas Lane <163203257+tlane25@users.noreply.github.com> Co-authored-by: Thomas Lane Co-authored-by: Daniel Lew <51924260+DanielSLew@users.noreply.github.com> --- packages/config/src/env/envelope.ts | 6 +++--- packages/config/src/env/main.ts | 2 +- packages/config/tests/env/tests.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/config/src/env/envelope.ts b/packages/config/src/env/envelope.ts index d75e0786ee..3f4d88e1e3 100644 --- a/packages/config/src/env/envelope.ts +++ b/packages/config/src/env/envelope.ts @@ -17,10 +17,10 @@ export const getEnvelope = async function ({ try { const environmentVariables = await (api as any).getEnvVars({ accountId, siteId, context_name: context }) - const sortedEnvVarsFromDevContext = environmentVariables + const sortedEnvVarsFromContext = environmentVariables .sort((left, right) => (left.key.toLowerCase() < right.key.toLowerCase() ? -1 : 1)) .reduce((acc, cur) => { - const envVar = cur.values.find((val) => ['dev', 'all'].includes(val.context)) + const envVar = cur.values.find((val) => ['all', context].includes(val.context)) if (envVar && envVar.value) { return { ...acc, @@ -29,7 +29,7 @@ export const getEnvelope = async function ({ } return acc }, {}) - return sortedEnvVarsFromDevContext + return sortedEnvVarsFromContext } catch { return {} } diff --git a/packages/config/src/env/main.ts b/packages/config/src/env/main.ts index ea73911eaf..5ce066ba93 100644 --- a/packages/config/src/env/main.ts +++ b/packages/config/src/env/main.ts @@ -181,7 +181,7 @@ const getAccountEnv = async function ({ context?: string }) { if (siteInfo.use_envelope) { - const envelope = await getEnvelope({ api, accountId: siteInfo.account_slug, context }) + const envelope = await getEnvelope({ api, accountId: siteInfo.account_slug, siteId: siteInfo.site_id, context }) return envelope } const { site_env: siteEnv = {} } = accounts.find(({ slug }) => slug === siteInfo.account_slug) || {} diff --git a/packages/config/tests/env/tests.js b/packages/config/tests/env/tests.js index 0d82d7f9d9..a8d6463132 100644 --- a/packages/config/tests/env/tests.js +++ b/packages/config/tests/env/tests.js @@ -310,7 +310,7 @@ test('Sets environment variables when configured to use Envelope', async (t) => t.deepEqual(env.URL.sources, ['general']) t.is(env.URL.value, 'test') t.is(env.SHARED_ENV_VAR.value, 'ENVELOPE_TEAM_ALL') - t.is(env.SITE_ENV_VAR.value, 'ENVELOPE_SITE_DEV') + t.is(env.SITE_ENV_VAR.value, 'ENVELOPE_SITE_PROD') t.is(env.MONGO_ENV_VAR, undefined) }) From 8e806149f7395deeb3e811a8a06ff5bc4070c3fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 00:49:42 +0000 Subject: [PATCH 50/71] fix(deps): update dependency @vercel/nft to v0.27.6 (#5904) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f3601b5b7..0a1f3ad1de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9084,12 +9084,12 @@ "license": "ISC" }, "node_modules/@vercel/nft": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.4.tgz", - "integrity": "sha512-Rioz3LJkEKicKCi9BSyc1RXZ5R6GmXosFMeBSThh6msWSOiArKhb7c75MiWwZEgPL7x0/l3TAfH/l0cxKNuUFA==", + "version": "0.27.6", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.6.tgz", + "integrity": "sha512-mwuyUxskdcV8dd7N7JnxBgvFEz1D9UOePI/WyLLzktv6HSCwgPNQGit/UJ2IykAWGlypKw4pBQjOKWvIbXITSg==", "license": "MIT", "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", + "@mapbox/node-pre-gyp": "^1.0.11", "@rollup/pluginutils": "^4.0.0", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", @@ -9098,7 +9098,7 @@ "estree-walker": "2.0.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", + "micromatch": "^4.0.8", "node-gyp-build": "^4.2.2", "resolve-from": "^5.0.0" }, @@ -26789,7 +26789,7 @@ "license": "MIT", "dependencies": { "@import-maps/resolve": "^1.0.1", - "@vercel/nft": "^0.27.0", + "@vercel/nft": "^0.27.6", "ajv": "^8.11.2", "ajv-errors": "^3.0.0", "better-ajv-errors": "^1.2.0", @@ -27617,7 +27617,7 @@ "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", "@netlify/serverless-functions-api": "^1.31.0", - "@vercel/nft": "^0.27.1", + "@vercel/nft": "^0.27.6", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", "cp-file": "^10.0.0", From 5215be2ac08aeac073c4316b77e8b55da47c33b6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 02:33:17 +0000 Subject: [PATCH 51/71] chore(deps): update dependency nock to v13.5.6 (#5905) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a1f3ad1de..db1930f883 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20084,9 +20084,9 @@ } }, "node_modules/nock": { - "version": "13.5.5", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.5.tgz", - "integrity": "sha512-XKYnqUrCwXC8DGG1xX4YH5yNIrlh9c065uaMZZHUoeUUINTOyt+x/G+ezYk0Ft6ExSREVIs+qBJDK503viTfFA==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", + "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26789,7 +26789,7 @@ "license": "MIT", "dependencies": { "@import-maps/resolve": "^1.0.1", - "@vercel/nft": "^0.27.6", + "@vercel/nft": "^0.27.0", "ajv": "^8.11.2", "ajv-errors": "^3.0.0", "better-ajv-errors": "^1.2.0", @@ -26822,7 +26822,7 @@ "chalk": "^4.1.2", "cpy": "^9.0.1", "cross-env": "^7.0.3", - "nock": "^13.2.4", + "nock": "^13.5.6", "tar": "^6.1.11", "typescript": "^5.0.0", "vitest": "^0.34.0" @@ -27307,7 +27307,7 @@ "ava": "^4.0.0", "c8": "^7.11.0", "from2-string": "^1.1.0", - "nock": "^13.0.0", + "nock": "^13.5.6", "ts-node": "^10.9.1", "typescript": "^5.0.0", "uuid": "^9.0.0" @@ -27617,7 +27617,7 @@ "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", "@netlify/serverless-functions-api": "^1.31.0", - "@vercel/nft": "^0.27.6", + "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", "cp-file": "^10.0.0", From ced3f33658b54855ac5f7cbb5ec12ee234ef1370 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 02:58:57 +0000 Subject: [PATCH 52/71] fix(deps): update dependency hot-shots to v10.2.1 (#5906) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ packages/build/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index db1930f883..62a106c2e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16817,9 +16817,9 @@ } }, "node_modules/hot-shots": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.1.1.tgz", - "integrity": "sha512-KTsH9hb+YZHH0IIRf22y0X8mPw8j521W5xRAUeaUlGNBDsf44ixE7ZeyXbUHd/nQ1n04UEhi2ja05/QVOS/CgQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.2.1.tgz", + "integrity": "sha512-tmjcyZkG/qADhcdC7UjAp8D7v7W2DOYFgaZ48fYMuayMQmVVUg8fntKmrjes/b40ef6yZ+qt1lB8kuEDfLC4zw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -26367,7 +26367,7 @@ "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", - "hot-shots": "10.1.1", + "hot-shots": "10.2.1", "indent-string": "^5.0.0", "is-plain-obj": "^4.0.0", "js-yaml": "^4.0.0", @@ -26822,7 +26822,7 @@ "chalk": "^4.1.2", "cpy": "^9.0.1", "cross-env": "^7.0.3", - "nock": "^13.5.6", + "nock": "^13.2.4", "tar": "^6.1.11", "typescript": "^5.0.0", "vitest": "^0.34.0" @@ -27307,7 +27307,7 @@ "ava": "^4.0.0", "c8": "^7.11.0", "from2-string": "^1.1.0", - "nock": "^13.5.6", + "nock": "^13.0.0", "ts-node": "^10.9.1", "typescript": "^5.0.0", "uuid": "^9.0.0" diff --git a/packages/build/package.json b/packages/build/package.json index f17dc94222..d8ae4c6626 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -88,7 +88,7 @@ "figures": "^5.0.0", "filter-obj": "^5.0.0", "got": "^12.0.0", - "hot-shots": "10.1.1", + "hot-shots": "10.2.1", "indent-string": "^5.0.0", "is-plain-obj": "^4.0.0", "js-yaml": "^4.0.0", From 19b321ed792437d3aa827e821373b1fa7146f1c3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 03:18:53 +0000 Subject: [PATCH 53/71] fix(deps): update dependency yaml to v2.6.0 (#5907) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62a106c2e9..1cb53d5dde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26109,9 +26109,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -26460,7 +26460,7 @@ "minimatch": "^9.0.0", "read-pkg": "^7.1.0", "semver": "^7.3.8", - "yaml": "^2.1.3", + "yaml": "^2.6.0", "yargs": "^17.6.0" }, "bin": { From 227bb9d2fd21337df2c7d210f3946137ea20f838 Mon Sep 17 00:00:00 2001 From: Mike Gualtieri <36079536+mlgualtieri@users.noreply.github.com> Date: Fri, 15 Nov 2024 11:45:39 -0500 Subject: [PATCH 54/71] chore: adding sleep 5 to IGNORED_COMMANDS (#5908) * chore: adding sleep 5 to IGNORED_COMMANDS --- packages/build/src/core/lingering.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/build/src/core/lingering.js b/packages/build/src/core/lingering.js index ef6d18507f..a436a7d061 100644 --- a/packages/build/src/core/lingering.js +++ b/packages/build/src/core/lingering.js @@ -66,6 +66,7 @@ const IGNORED_COMMANDS = [ // Internal buildbot commands '[build]', + 'sleep 5', /buildbot.*\[node]/, // buildbot's main Bash script '/opt/build-bin/build', From 319d6b39f8382f114b1f7d138b3ea3a312a7b55c Mon Sep 17 00:00:00 2001 From: netlify-circleci <90861860+netlify-circleci@users.noreply.github.com> Date: Fri, 15 Nov 2024 11:09:17 -0600 Subject: [PATCH 55/71] chore: release main (#5903) * chore: release main * chore: update lockfile --------- Co-authored-by: netlify-jenkins <33464286+netlify-jenkins@users.noreply.github.com> --- .release-please-manifest.json | 4 ++-- package-lock.json | 8 ++++---- packages/build/CHANGELOG.md | 14 ++++++++++++++ packages/build/package.json | 4 ++-- packages/config/CHANGELOG.md | 7 +++++++ packages/config/package.json | 2 +- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 31d57b57b3..3373fd9e33 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,9 +1,9 @@ { "packages/build-info": "7.15.2", - "packages/build": "29.56.0", + "packages/build": "29.56.1", "packages/edge-bundler": "12.2.3", "packages/cache-utils": "5.1.6", - "packages/config": "20.19.0", + "packages/config": "20.19.1", "packages/framework-info": "9.8.13", "packages/functions-utils": "5.2.93", "packages/git-utils": "5.1.1", diff --git a/package-lock.json b/package-lock.json index 1cb53d5dde..179f159be8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26343,13 +26343,13 @@ }, "packages/build": { "name": "@netlify/build", - "version": "29.56.0", + "version": "29.56.1", "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", "@netlify/blobs": "^7.4.0", "@netlify/cache-utils": "^5.1.6", - "@netlify/config": "^20.19.0", + "@netlify/config": "^20.19.1", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", "@netlify/functions-utils": "^5.2.93", @@ -26460,7 +26460,7 @@ "minimatch": "^9.0.0", "read-pkg": "^7.1.0", "semver": "^7.3.8", - "yaml": "^2.6.0", + "yaml": "^2.1.3", "yargs": "^17.6.0" }, "bin": { @@ -26665,7 +26665,7 @@ }, "packages/config": { "name": "@netlify/config", - "version": "20.19.0", + "version": "20.19.1", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 65a2a60440..23d39219bc 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -105,6 +105,20 @@ * dependencies * @netlify/config bumped from ^20.8.0 to ^20.8.1 +## [29.56.1](https://github.com/netlify/build/compare/build-v29.56.0...build-v29.56.1) (2024-11-15) + + +### Bug Fixes + +* **deps:** update dependency hot-shots to v10.2.1 ([#5906](https://github.com/netlify/build/issues/5906)) ([ced3f33](https://github.com/netlify/build/commit/ced3f33658b54855ac5f7cbb5ec12ee234ef1370)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @netlify/config bumped from ^20.19.0 to ^20.19.1 + ## [29.56.0](https://github.com/netlify/build/compare/build-v29.55.5...build-v29.56.0) (2024-10-29) diff --git a/packages/build/package.json b/packages/build/package.json index d8ae4c6626..92c5c87979 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/build", - "version": "29.56.0", + "version": "29.56.1", "description": "Netlify build module", "type": "module", "exports": "./lib/index.js", @@ -70,7 +70,7 @@ "@bugsnag/js": "^7.0.0", "@netlify/blobs": "^7.4.0", "@netlify/cache-utils": "^5.1.6", - "@netlify/config": "^20.19.0", + "@netlify/config": "^20.19.1", "@netlify/edge-bundler": "12.2.3", "@netlify/framework-info": "^9.8.13", "@netlify/functions-utils": "^5.2.93", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index 6bee6a4aaa..a216de5f51 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -76,6 +76,13 @@ * dependencies * netlify bumped from ^13.1.8 to ^13.1.9 +## [20.19.1](https://github.com/netlify/build/compare/config-v20.19.0...config-v20.19.1) (2024-11-15) + + +### Bug Fixes + +* environment variable build context filtering fix ([#5887](https://github.com/netlify/build/issues/5887)) ([c0ab547](https://github.com/netlify/build/commit/c0ab5479bd533315d39983e50a9c8a1bee5966ff)) + ## [20.19.0](https://github.com/netlify/build/compare/config-v20.18.0...config-v20.19.0) (2024-08-21) diff --git a/packages/config/package.json b/packages/config/package.json index 92e9d3c8f5..571897ba0c 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@netlify/config", - "version": "20.19.0", + "version": "20.19.1", "description": "Netlify config module", "type": "module", "exports": "./lib/index.js", From ef92c480c5411ba20ee869d8502f58f1e8418268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Mon, 18 Nov 2024 13:49:39 +0000 Subject: [PATCH 56/71] fix: turn log line into system log (#5910) --- packages/build/src/plugins_core/pre_dev_cleanup/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/build/src/plugins_core/pre_dev_cleanup/index.ts b/packages/build/src/plugins_core/pre_dev_cleanup/index.ts index c4a41a9c1c..95c50eefa1 100644 --- a/packages/build/src/plugins_core/pre_dev_cleanup/index.ts +++ b/packages/build/src/plugins_core/pre_dev_cleanup/index.ts @@ -3,7 +3,6 @@ import { resolve } from 'node:path' import { listFrameworks } from '@netlify/framework-info' -import { log } from '../../log/logger.js' import { CoreStep, CoreStepCondition, CoreStepFunction, CoreStepFunctionArgs } from '../types.js' const dirExists = async (path: string): Promise => { @@ -37,7 +36,7 @@ const coreStep: CoreStepFunction = async (input) => { for (const dir of dirs) { await rm(resolve(input.buildDir, dir), { recursive: true, force: true }) } - log(input.logs, `Cleaned up ${dirs.join(', ')}.`) + input.systemLog(input.logs, `Cleaned up ${dirs.join(', ')}.`) return {} } From 7ea3e7b70a42b4b911d8fbd966fe0d223ee0b5e6 Mon Sep 17 00:00:00 2001 From: Michal Piechowiak Date: Tue, 10 Dec 2024 18:37:31 +0100 Subject: [PATCH 57/71] fix: catch and ignore .kill exceptions and don't force timeout kill in windows (#5932) --- packages/build/src/plugins/spawn.ts | 17 +++++++++++++++-- packages/edge-bundler/node/server/util.ts | 19 ++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/build/src/plugins/spawn.ts b/packages/build/src/plugins/spawn.ts index 75073ad482..7e67a30a52 100644 --- a/packages/build/src/plugins/spawn.ts +++ b/packages/build/src/plugins/spawn.ts @@ -1,10 +1,11 @@ import { createRequire } from 'module' +import { platform } from 'os' import { fileURLToPath, pathToFileURL } from 'url' import { promisify } from 'util' import { trace } from '@opentelemetry/api' import { ExecaChildProcess, execaNode } from 'execa' -import { gte } from 'semver' +import { gte, satisfies } from 'semver' import { FeatureFlags } from '../core/feature_flags.js' import { addErrorInfo } from '../error/info.js' @@ -217,5 +218,17 @@ const stopPlugin = async function ({ }) childProcess.disconnect() } - childProcess.kill() + + // On Windows with Node 21+, there's a bug where attempting to kill a child process + // results in an EPERM error. Ignore the error in that case. + // See: https://github.com/nodejs/node/issues/51766 + // We also disable execa's `forceKillAfterTimeout` in this case + // which can cause unhandled rejection. + try { + childProcess.kill('SIGTERM', { + forceKillAfterTimeout: platform() === 'win32' && satisfies(process.version, '>=21') ? false : undefined, + }) + } catch { + // no-op + } } diff --git a/packages/edge-bundler/node/server/util.ts b/packages/edge-bundler/node/server/util.ts index 058018456a..e3c416c634 100644 --- a/packages/edge-bundler/node/server/util.ts +++ b/packages/edge-bundler/node/server/util.ts @@ -1,6 +1,9 @@ +import { platform } from 'os' + import { ExecaChildProcess } from 'execa' import fetch from 'node-fetch' import waitFor from 'p-wait-for' +import { satisfies } from 'semver' // 1 second const SERVER_KILL_TIMEOUT = 1e3 @@ -43,9 +46,19 @@ const killProcess = (ps: ExecaChildProcess) => { ps.on('close', resolve) ps.on('error', reject) - ps.kill('SIGTERM', { - forceKillAfterTimeout: SERVER_KILL_TIMEOUT, - }) + // On Windows with Node 21+, there's a bug where attempting to kill a child process + // results in an EPERM error. Ignore the error in that case. + // See: https://github.com/nodejs/node/issues/51766 + // We also disable execa's `forceKillAfterTimeout` in this case + // which can cause unhandled rejection. + try { + ps.kill('SIGTERM', { + forceKillAfterTimeout: + platform() === 'win32' && satisfies(process.version, '>=21') ? false : SERVER_KILL_TIMEOUT, + }) + } catch { + // no-op + } }) } From cc677e9c50a552a6a027e061be09671ab2352e03 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 18:10:33 +0000 Subject: [PATCH 58/71] fix(deps): update dependency @netlify/serverless-functions-api to ^1.31.1 (#5923) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 179f159be8..8f20e6b754 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6690,9 +6690,9 @@ "link": true }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.31.0.tgz", - "integrity": "sha512-/ux3fefmw0yGmzRMOqhGrzbAuALtW8HY08bjE4yCk+y8CzB9r9mPd1ApSJe3KlYD+sqDvbQGrEXdifQ/LzUIDQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.31.1.tgz", + "integrity": "sha512-SkNxzfCwctS5ETnCqJOJfZZ/jB0pTkbWEAsApHoL7HzUQGWoRM6wYf4baJAJVMTfZBQu534SbKuwRs7WDAs43A==", "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -27616,7 +27616,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.31.0", + "@netlify/serverless-functions-api": "^1.31.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 8e2ef3d2de..86835b4190 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -44,7 +44,7 @@ "@babel/parser": "^7.22.5", "@babel/types": "7.25.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.31.0", + "@netlify/serverless-functions-api": "^1.31.1", "@vercel/nft": "^0.27.1", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", From 3a2da9937eb859d52de9d0e1ef5ea8a0a76af35a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 18:31:35 +0000 Subject: [PATCH 59/71] fix(deps): update dependency @netlify/open-api to ^2.35.0 (#5928) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/js-client/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f20e6b754..599f6509d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6660,9 +6660,9 @@ } }, "node_modules/@netlify/open-api": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.34.0.tgz", - "integrity": "sha512-C4v7Od/vnGgZ1P4JK3Fn9uUi9HkTxeUqUtj4OLnGD+rGyaVrl4JY89xMCoVksijDtO8XylYFU59CSTnQNeNw7g==", + "version": "2.35.0", + "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.35.0.tgz", + "integrity": "sha512-c6LpV29CKMgq6/eViItE6L2ova9UldBO9tHRvvwpJfSBgCwWaFhmiepe07E3xIW4GfTCGoWE816mNzXB/2ceZg==", "license": "MIT", "engines": { "node": ">=14" @@ -27293,7 +27293,7 @@ "version": "13.1.21", "license": "MIT", "dependencies": { - "@netlify/open-api": "^2.34.0", + "@netlify/open-api": "^2.35.0", "lodash-es": "^4.17.21", "micro-api-client": "^3.3.0", "node-fetch": "^3.0.0", diff --git a/packages/js-client/package.json b/packages/js-client/package.json index 65c132544f..a2e876746f 100644 --- a/packages/js-client/package.json +++ b/packages/js-client/package.json @@ -41,7 +41,7 @@ "node client" ], "dependencies": { - "@netlify/open-api": "^2.34.0", + "@netlify/open-api": "^2.35.0", "lodash-es": "^4.17.21", "micro-api-client": "^3.3.0", "node-fetch": "^3.0.0", From ebfc770ba1a9ded15895fbc1d46caf2bf9ced34d Mon Sep 17 00:00:00 2001 From: Jake Champion Date: Tue, 10 Dec 2024 18:52:06 +0000 Subject: [PATCH 60/71] fix: ensure we pass an ArrayBuffer to blobStore.set and not a NodeJS Buffer (#5927) * fix: ensure we pass an ArrayBufferLike to blobStore.set and not a NodeJS Buffer * fix: use buffer.slice to create ArrayBuffer --------- Co-authored-by: Yujohn Nattrass --- packages/build/src/plugins_core/blobs_upload/index.ts | 3 ++- packages/build/src/plugins_core/dev_blobs_upload/index.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/build/src/plugins_core/blobs_upload/index.ts b/packages/build/src/plugins_core/blobs_upload/index.ts index b7d76a52a7..7ee7596146 100644 --- a/packages/build/src/plugins_core/blobs_upload/index.ts +++ b/packages/build/src/plugins_core/blobs_upload/index.ts @@ -72,7 +72,8 @@ const coreStep: CoreStepFunction = async function ({ systemLog(`Uploading blob ${key}`) const { data, metadata } = await getFileWithMetadata(key, contentPath, metadataPath) - await blobStore.set(key, data, { metadata }) + const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.length) + await blobStore.set(key, arrayBuffer, { metadata }) }, { concurrency: 10 }, ) diff --git a/packages/build/src/plugins_core/dev_blobs_upload/index.ts b/packages/build/src/plugins_core/dev_blobs_upload/index.ts index 525a8066b2..2b7a645067 100644 --- a/packages/build/src/plugins_core/dev_blobs_upload/index.ts +++ b/packages/build/src/plugins_core/dev_blobs_upload/index.ts @@ -77,7 +77,8 @@ const coreStep: CoreStepFunction = async function ({ log(logs, `- Uploading blob ${key}`, { indent: true }) } const { data, metadata } = await getFileWithMetadata(key, contentPath, metadataPath) - await blobStore.set(key, data, { metadata }) + const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.length) + await blobStore.set(key, arrayBuffer, { metadata }) }, { concurrency: 10 }, ) From 736676194b4d0c4ec66ced7c92efaabeec74d3d7 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 10 Dec 2024 14:10:43 -0500 Subject: [PATCH 61/71] chore: remove released feature flag for extensions/ future state (#5926) * chore: remove released feature flag for future state v2 * chore: format * chore: tests * test: modify tests * fix: convert normalize case file to typescript to make the build not take 4 minutes * chore: change test name --- packages/config/src/api/site_info.ts | 47 ++---------- packages/config/src/{case.js => case.ts} | 14 +++- packages/config/tests/api/tests.js | 96 ++++++++++-------------- 3 files changed, 55 insertions(+), 102 deletions(-) rename packages/config/src/{case.js => case.ts} (68%) diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index 699219768d..4ac6db793e 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -35,53 +35,18 @@ export const getSiteInfo = async function ({ context, offline = false, testOpts = {}, - featureFlags = {}, siteFeatureFlagPrefix, }: GetSiteInfoOpts) { const { env: testEnv = false } = testOpts - const useV2Endpoint = !!accountId && featureFlags.cli_integration_installations_meta - - if (useV2Endpoint) { - if (api === undefined || mode === 'buildbot' || testEnv) { - const siteInfo: { id?: string; account_id?: string } = {} - - if (siteId !== undefined) siteInfo.id = siteId - if (accountId !== undefined) siteInfo.account_id = accountId - - const integrations = - mode === 'buildbot' && !offline - ? await getIntegrations({ siteId, testOpts, offline, useV2Endpoint, accountId }) - : [] - - return { siteInfo, accounts: [], addons: [], integrations } - } - - const promises = [ - getSite(api, siteId, siteFeatureFlagPrefix), - getAccounts(api), - getAddons(api, siteId), - getIntegrations({ siteId, testOpts, offline, useV2Endpoint, accountId }), - ] - - const [siteInfo, accounts, addons, integrations] = await Promise.all(promises) - - if (siteInfo.use_envelope) { - const envelope = await getEnvelope({ api, accountId: siteInfo.account_slug, siteId, context }) - - siteInfo.build_settings.env = envelope - } - - return { siteInfo, accounts, addons, integrations } - } - if (api === undefined || mode === 'buildbot' || testEnv) { const siteInfo: { id?: string; account_id?: string } = {} if (siteId !== undefined) siteInfo.id = siteId if (accountId !== undefined) siteInfo.account_id = accountId - const integrations = mode === 'buildbot' && !offline ? await getIntegrations({ siteId, testOpts, offline }) : [] + const integrations = + mode === 'buildbot' && !offline ? await getIntegrations({ siteId, testOpts, offline, accountId }) : [] return { siteInfo, accounts: [], addons: [], integrations } } @@ -90,7 +55,7 @@ export const getSiteInfo = async function ({ getSite(api, siteId, siteFeatureFlagPrefix), getAccounts(api), getAddons(api, siteId), - getIntegrations({ siteId, testOpts, offline }), + getIntegrations({ siteId, testOpts, offline, accountId }), ] const [siteInfo, accounts, addons, integrations] = await Promise.all(promises) @@ -144,7 +109,6 @@ type GetIntegrationsOpts = { accountId?: string testOpts: TestOptions offline: boolean - useV2Endpoint?: boolean } const getIntegrations = async function ({ @@ -152,7 +116,6 @@ const getIntegrations = async function ({ accountId, testOpts, offline, - useV2Endpoint, }: GetIntegrationsOpts): Promise { if (!siteId || offline) { return [] @@ -162,8 +125,8 @@ const getIntegrations = async function ({ const baseUrl = new URL(host ? `http://${host}` : `https://api.netlifysdk.com`) - // use future state feature flag - const url = useV2Endpoint + // if accountId isn't present, use safe v1 endpoint + const url = accountId ? `${baseUrl}team/${accountId}/integrations/installations/meta/${siteId}` : `${baseUrl}site/${siteId}/integrations/safe` diff --git a/packages/config/src/case.js b/packages/config/src/case.ts similarity index 68% rename from packages/config/src/case.js rename to packages/config/src/case.ts index e8755ed876..0bbdad2180 100644 --- a/packages/config/src/case.js +++ b/packages/config/src/case.ts @@ -1,10 +1,18 @@ // Some properties can be optionally capitalized. We normalize them to lowercase -export const normalizeConfigCase = function ({ Build, build = Build, ...config }) { +export const normalizeConfigCase = function ({ + Build, + build = Build, + ...config +}: { + Build: Record + build: Record + [key: string]: unknown +}): Record { const buildA = normalizeBuildCase(build) return { ...config, build: buildA } } -const normalizeBuildCase = function ({ +const normalizeBuildCase = ({ Base, base = Base, Command, @@ -22,7 +30,7 @@ const normalizeBuildCase = function ({ Publish, publish = Publish, ...build -} = {}) { +}: Record = {}): Record => { return { ...build, base, diff --git a/packages/config/tests/api/tests.js b/packages/config/tests/api/tests.js index 8910aea2a8..897c9cc9ce 100644 --- a/packages/config/tests/api/tests.js +++ b/packages/config/tests/api/tests.js @@ -20,7 +20,7 @@ const SITE_INTEGRATIONS_RESPONSE = { response: [ { slug: 'test', - version: 'so-cool', + version: 'so-cool-v1', has_build: true, }, ], @@ -31,7 +31,7 @@ const TEAM_INSTALLATIONS_META_RESPONSE = { response: [ { slug: 'test', - version: 'so-cool', + version: 'so-cool-v2', has_build: true, }, ], @@ -42,6 +42,11 @@ const SITE_INTEGRATIONS_EMPTY_RESPONSE = { response: [], } +const TEAM_INSTALLATIONS_META_EMPTY_RESPONSE = { + path: '/team/account1/integrations/installations/meta/test', + response: [], +} + const SITE_INFO_BUILD_SETTINGS = { path: SITE_INFO_PATH, response: { @@ -222,7 +227,7 @@ test('Build settings are not used in CI', async (t) => { t.snapshot(normalizeOutput(output)) }) -test('Integrations are returned if feature flag is true', async (t) => { +test('Integrations are returned from getSiteInfo from v1 safe API when there is not accountID', async (t) => { const { output } = await new Fixture('./fixtures/base') .withFlags({ token: 'test', @@ -235,7 +240,7 @@ test('Integrations are returned if feature flag is true', async (t) => { t.assert(config.integrations) t.assert(config.integrations.length === 1) t.assert(config.integrations[0].slug === 'test') - t.assert(config.integrations[0].version === 'so-cool') + t.assert(config.integrations[0].version === 'so-cool-v1') t.assert(config.integrations[0].has_build === true) }) @@ -244,8 +249,9 @@ test('Integration specified in config is also returned if integration is availab .withFlags({ token: 'test', siteId: 'test', + accountId: 'account1', }) - .runConfigServer([SITE_INFO_DATA, SITE_INTEGRATIONS_RESPONSE, FETCH_INTEGRATIONS_RESPONSE]) + .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_RESPONSE, FETCH_INTEGRATIONS_RESPONSE]) const config = JSON.parse(output) @@ -262,8 +268,9 @@ test('Integration specified in config is not returned if integration is not avai .withFlags({ token: 'test', siteId: 'test', + accountId: 'account1', }) - .runConfigServer([SITE_INFO_DATA, SITE_INTEGRATIONS_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) + .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) const config = JSON.parse(output) @@ -278,8 +285,9 @@ test('In integration dev mode, integration specified in config is returned even token: 'test', siteId: 'test', context: 'dev', + accountId: 'account1', }) - .runConfigServer([SITE_INFO_DATA, SITE_INTEGRATIONS_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) + .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) const config = JSON.parse(output) @@ -297,8 +305,9 @@ test('In integration dev mode, integration specified in config is returned even token: 'test', siteId: 'test', context: 'dev', + accountId: 'account1', }) - .runConfigServer([SITE_INFO_DATA, SITE_INTEGRATIONS_EMPTY_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) + .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_EMPTY_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) const config = JSON.parse(output) @@ -309,8 +318,8 @@ test('In integration dev mode, integration specified in config is returned even t.assert(config.integrations[0].version === undefined) }) -test('In integration dev mode, integration specified in config is returned and build is forced by config', async (t) => { - const { output } = await new Fixture('./fixtures/dev_integration_with_force_build') +test('In integration dev mode, integration specified in config is returned even if integration is not enabled on site and accountId not present', async (t) => { + const { output } = await new Fixture('./fixtures/dev_integration') .withFlags({ token: 'test', siteId: 'test', @@ -323,76 +332,52 @@ test('In integration dev mode, integration specified in config is returned and b t.assert(config.integrations) t.assert(config.integrations.length === 1) t.assert(config.integrations[0].slug === 'abc-integration') - t.assert(config.integrations[0].has_build === true) + t.assert(config.integrations[0].has_build === false) t.assert(config.integrations[0].version === undefined) }) -test('Integrations are not returned if offline', async (t) => { - const { output } = await new Fixture('./fixtures/base') +test('In integration dev mode, integration specified in config is returned and build is forced by config', async (t) => { + const { output } = await new Fixture('./fixtures/dev_integration_with_force_build') .withFlags({ - offline: true, + token: 'test', siteId: 'test', - mode: 'buildbot', + context: 'dev', + accountId: 'account1', }) - .runConfigServer([SITE_INTEGRATIONS_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) + .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_EMPTY_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) const config = JSON.parse(output) t.assert(config.integrations) - t.assert(config.integrations.length === 0) + t.assert(config.integrations.length === 1) + t.assert(config.integrations[0].slug === 'abc-integration') + t.assert(config.integrations[0].has_build === true) + t.assert(config.integrations[0].version === undefined) }) -test('Integrations and account id are returned if feature flag is false and mode is buildbot', async (t) => { +test('Integrations are not returned if offline', async (t) => { const { output } = await new Fixture('./fixtures/base') .withFlags({ + offline: true, siteId: 'test', mode: 'buildbot', accountId: 'account1', - token: 'test', }) - .runConfigServer([SITE_INFO_DATA, SITE_INTEGRATIONS_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) + .runConfigServer([TEAM_INSTALLATIONS_META_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) const config = JSON.parse(output) t.assert(config.integrations) - t.is(config.integrations.length, 1) - t.is(config.integrations[0].slug, 'test') - t.is(config.integrations[0].version, 'so-cool') - t.is(config.integrations[0].has_build, true) - - // account id is also available - t.assert(config.siteInfo) - t.is(config.siteInfo.account_id, 'account1') -}) - -test('Integrations are returned if feature flag is false and mode is dev', async (t) => { - const { output } = await new Fixture('./fixtures/base') - .withFlags({ - siteId: 'test', - mode: 'dev', - token: 'test', - }) - .runConfigServer([SITE_INFO_DATA, SITE_INTEGRATIONS_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) - - const config = JSON.parse(output) - - t.assert(config.integrations) - t.assert(config.integrations.length === 1) - t.assert(config.integrations[0].slug === 'test') - t.assert(config.integrations[0].version === 'so-cool') - t.assert(config.integrations[0].has_build === true) + t.assert(config.integrations.length === 0) }) -test('Integrations and account id are returned if flag is true for site and mode is buildbot', async (t) => { +test('Integrations and account id are returned if mode is buildbot', async (t) => { const { output } = await new Fixture('./fixtures/base') .withFlags({ siteId: 'test', mode: 'buildbot', - token: 'test', accountId: 'account1', - featureFlags: { - cli_integration_installations_meta: true, - }, + token: 'test', }) .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) @@ -401,7 +386,7 @@ test('Integrations and account id are returned if flag is true for site and mode t.assert(config.integrations) t.is(config.integrations.length, 1) t.is(config.integrations[0].slug, 'test') - t.is(config.integrations[0].version, 'so-cool') + t.is(config.integrations[0].version, 'so-cool-v2') t.is(config.integrations[0].has_build, true) // account id is also available @@ -409,16 +394,13 @@ test('Integrations and account id are returned if flag is true for site and mode t.is(config.siteInfo.account_id, 'account1') }) -test('Integrations are returned if flag is true for site and mode is dev', async (t) => { +test('Integrations are returned if accountId is present and mode is dev', async (t) => { const { output } = await new Fixture('./fixtures/base') .withFlags({ siteId: 'test', mode: 'dev', token: 'test', accountId: 'account1', - featureFlags: { - cli_integration_installations_meta: true, - }, }) .runConfigServer([SITE_INFO_DATA, TEAM_INSTALLATIONS_META_RESPONSE, FETCH_INTEGRATIONS_EMPTY_RESPONSE]) @@ -427,7 +409,7 @@ test('Integrations are returned if flag is true for site and mode is dev', async t.assert(config.integrations) t.assert(config.integrations.length === 1) t.assert(config.integrations[0].slug === 'test') - t.assert(config.integrations[0].version === 'so-cool') + t.assert(config.integrations[0].version === 'so-cool-v2') t.assert(config.integrations[0].has_build === true) }) From 689a8dd5b26d6370b7e53005dca39b2b8efb9768 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 10 Dec 2024 15:01:05 -0500 Subject: [PATCH 62/71] fix: detect `bun.lock` files in addition to `bun.lockb` files (#5918) --- packages/build-info/src/runtime/bun.test.ts | 9 +++++++++ packages/build-info/src/runtime/bun.ts | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/build-info/src/runtime/bun.test.ts b/packages/build-info/src/runtime/bun.test.ts index 65e7d4e789..07f4e102a8 100644 --- a/packages/build-info/src/runtime/bun.test.ts +++ b/packages/build-info/src/runtime/bun.test.ts @@ -17,6 +17,15 @@ test('detects node when bunfig.toml is present', async ({ fs }) => { expect(detected[0].name).toBe('Bun') }) +test('detects node when bun.lock is present', async ({ fs }) => { + const cwd = mockFileSystem({ + 'bun.lock': '', + }) + + const detected = await new Project(fs, cwd).detectRuntime() + expect(detected[0].name).toBe('Bun') +}) + test('detects node when bun.lockb is present', async ({ fs }) => { const cwd = mockFileSystem({ 'bun.lockb': '', diff --git a/packages/build-info/src/runtime/bun.ts b/packages/build-info/src/runtime/bun.ts index 8b11e6f667..3112d4c7a3 100644 --- a/packages/build-info/src/runtime/bun.ts +++ b/packages/build-info/src/runtime/bun.ts @@ -3,5 +3,5 @@ import { LangRuntime } from './runtime.js' export class Bun extends LangRuntime { id = 'bun' name = 'Bun' - configFiles = ['bun.lockb', 'bunfig.toml'] + configFiles = ['bun.lock', 'bun.lockb', 'bunfig.toml'] } From b62d01d3089919737a2123802d184181a9c4f68c Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 10 Dec 2024 15:14:43 -0500 Subject: [PATCH 63/71] chore: add node 22 to supported versions list (#5917) --- .../zip-it-and-ship-it/src/runtimes/node/utils/node_runtime.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/zip-it-and-ship-it/src/runtimes/node/utils/node_runtime.ts b/packages/zip-it-and-ship-it/src/runtimes/node/utils/node_runtime.ts index 8b399ace61..194320bac4 100644 --- a/packages/zip-it-and-ship-it/src/runtimes/node/utils/node_runtime.ts +++ b/packages/zip-it-and-ship-it/src/runtimes/node/utils/node_runtime.ts @@ -5,6 +5,7 @@ const validRuntimeMap = { 16: 'nodejs16.x', 18: 'nodejs18.x', 20: 'nodejs20.x', + 22: 'nodejs22.x', } as const const minimumV2Version = 18 From 44527a04b6b3668db88a7db42fce37c1390f9c1f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:53:20 +0000 Subject: [PATCH 64/71] fix(deps): update dependency qs to v6.13.1 (#5909) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 599f6509d3..b393ccf4c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22456,9 +22456,9 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" @@ -27299,7 +27299,7 @@ "node-fetch": "^3.0.0", "omit.js": "^2.0.2", "p-wait-for": "^4.0.0", - "qs": "^6.9.6" + "qs": "^6.13.1" }, "devDependencies": { "@types/lodash-es": "^4.17.6", From 05d077afc50d4fa7a7522414f519bc953ead4b10 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:38:29 +0000 Subject: [PATCH 65/71] fix(deps): update dependency typescript to v5.7.2 (#5924) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- package-lock.json | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index b393ccf4c7..e0a7f1de93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24929,9 +24929,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -26401,7 +26401,7 @@ "supports-color": "^9.0.0", "terminal-link": "^3.0.0", "ts-node": "^10.9.1", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "uuid": "^9.0.0", "yargs": "^17.6.0" }, @@ -26476,7 +26476,7 @@ "execa": "^6.0.0", "memfs": "^3.4.7", "node-fetch": "^3.3.1", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "unionfs": "^4.4.0", "vite": "^4.0.4", "vitest": "^0.34.0" @@ -26656,7 +26656,7 @@ "devDependencies": { "@types/node": "^14.18.53", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -26703,7 +26703,7 @@ "has-ansi": "^5.0.0", "is-ci": "^3.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "typescript": "^5.7.2" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -26824,7 +26824,7 @@ "cross-env": "^7.0.3", "nock": "^13.2.4", "tar": "^6.1.11", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27145,7 +27145,7 @@ "path-browserify": "^1.0.1", "rollup-plugin-node-polyfills": "^0.2.1", "tmp-promise": "^3.0.2", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27166,7 +27166,7 @@ "@types/node": "^14.18.53", "sort-on": "^5.0.0", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27186,7 +27186,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27281,7 +27281,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27309,7 +27309,7 @@ "from2-string": "^1.1.0", "nock": "^13.0.0", "ts-node": "^10.9.1", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "uuid": "^9.0.0" }, "engines": { @@ -27322,7 +27322,7 @@ "license": "MIT", "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27349,7 +27349,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27378,7 +27378,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27403,7 +27403,7 @@ "devDependencies": { "@types/node": "^14.18.53", "ts-node": "^10.9.1", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27420,7 +27420,7 @@ "devDependencies": { "@types/node": "^14.18.53", "semver": "^7.3.8", - "typescript": "^5.0.0", + "typescript": "^5.7.2", "vitest": "^0.34.0" }, "engines": { @@ -27522,7 +27522,7 @@ "path-key": "^4.0.0", "strip-ansi": "^7.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "typescript": "^5.7.2" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -28397,7 +28397,7 @@ "@types/node": "^14.18.53", "execa": "^6.1.0", "globby": "^13.1.2", - "typescript": "^5.0.0" + "typescript": "^5.7.2" } }, "tools/node_modules/execa": { From 545539369a3f1a0e9d2036df7d41a8bed1df8272 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 10 Dec 2024 17:34:20 -0500 Subject: [PATCH 66/71] feat: add node 22 to supported versions list (#5917) From 93ce99f6e506cc343f317291d4495e116e0c9155 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 03:23:14 +0000 Subject: [PATCH 67/71] fix(deps): update dependency zod to v3.24.1 (#5937) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0a7f1de93..2f64821dff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26334,9 +26334,10 @@ } }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -26401,7 +26402,7 @@ "supports-color": "^9.0.0", "terminal-link": "^3.0.0", "ts-node": "^10.9.1", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "uuid": "^9.0.0", "yargs": "^17.6.0" }, @@ -26476,7 +26477,7 @@ "execa": "^6.0.0", "memfs": "^3.4.7", "node-fetch": "^3.3.1", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "unionfs": "^4.4.0", "vite": "^4.0.4", "vitest": "^0.34.0" @@ -26656,7 +26657,7 @@ "devDependencies": { "@types/node": "^14.18.53", "tmp-promise": "^3.0.0", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -26703,7 +26704,7 @@ "has-ansi": "^5.0.0", "is-ci": "^3.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.7.2" + "typescript": "^5.0.0" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -26824,7 +26825,7 @@ "cross-env": "^7.0.3", "nock": "^13.2.4", "tar": "^6.1.11", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27145,7 +27146,7 @@ "path-browserify": "^1.0.1", "rollup-plugin-node-polyfills": "^0.2.1", "tmp-promise": "^3.0.2", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27166,7 +27167,7 @@ "@types/node": "^14.18.53", "sort-on": "^5.0.0", "tmp-promise": "^3.0.0", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27186,7 +27187,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27281,7 +27282,7 @@ }, "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27299,7 +27300,7 @@ "node-fetch": "^3.0.0", "omit.js": "^2.0.2", "p-wait-for": "^4.0.0", - "qs": "^6.13.1" + "qs": "^6.9.6" }, "devDependencies": { "@types/lodash-es": "^4.17.6", @@ -27309,7 +27310,7 @@ "from2-string": "^1.1.0", "nock": "^13.0.0", "ts-node": "^10.9.1", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "uuid": "^9.0.0" }, "engines": { @@ -27322,7 +27323,7 @@ "license": "MIT", "devDependencies": { "@types/node": "^14.18.53", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27349,7 +27350,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27378,7 +27379,7 @@ "@types/node": "^14.18.53", "@vitest/coverage-c8": "^0.33.0", "@vitest/ui": "^0.34.0", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vite": "^4.0.4", "vitest": "^0.34.0" }, @@ -27403,7 +27404,7 @@ "devDependencies": { "@types/node": "^14.18.53", "ts-node": "^10.9.1", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27420,7 +27421,7 @@ "devDependencies": { "@types/node": "^14.18.53", "semver": "^7.3.8", - "typescript": "^5.7.2", + "typescript": "^5.0.0", "vitest": "^0.34.0" }, "engines": { @@ -27522,7 +27523,7 @@ "path-key": "^4.0.0", "strip-ansi": "^7.0.0", "tmp-promise": "^3.0.2", - "typescript": "^5.7.2" + "typescript": "^5.0.0" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -27646,7 +27647,7 @@ "unixify": "^1.0.0", "urlpattern-polyfill": "8.0.2", "yargs": "^17.0.0", - "zod": "^3.23.8" + "zod": "^3.24.1" }, "bin": { "zip-it-and-ship-it": "bin.js" @@ -28397,7 +28398,7 @@ "@types/node": "^14.18.53", "execa": "^6.1.0", "globby": "^13.1.2", - "typescript": "^5.7.2" + "typescript": "^5.0.0" } }, "tools/node_modules/execa": { From e0bcab4ec70f4ccc8fb119ff18d7d6baffcf1c42 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 04:05:59 +0000 Subject: [PATCH 68/71] chore(deps): update dependency @playwright/test to v1.49.1 (#5936) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f64821dff..49bf3f9619 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8414,13 +8414,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz", - "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.48.2" + "playwright": "1.49.1" }, "bin": { "playwright": "cli.js" @@ -22025,13 +22025,13 @@ } }, "node_modules/playwright": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz", - "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.48.2" + "playwright-core": "1.49.1" }, "bin": { "playwright": "cli.js" @@ -22044,9 +22044,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz", - "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -26469,7 +26469,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.30.0", + "@playwright/test": "^1.49.1", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", From bfffb5810c554aea7a1ae6f404ef2ed22047b168 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 04:42:19 +0000 Subject: [PATCH 69/71] fix(deps): update dependency yaml to v2.6.1 (#5935) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49bf3f9619..4c00630da3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26109,9 +26109,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -26461,7 +26461,7 @@ "minimatch": "^9.0.0", "read-pkg": "^7.1.0", "semver": "^7.3.8", - "yaml": "^2.1.3", + "yaml": "^2.6.1", "yargs": "^17.6.0" }, "bin": { @@ -26469,7 +26469,7 @@ }, "devDependencies": { "@bugsnag/source-maps": "^2.3.1", - "@playwright/test": "^1.49.1", + "@playwright/test": "^1.30.0", "@types/node": "^14.18.53", "@types/semver": "^7.3.13", "@vitest/coverage-c8": "^0.33.0", @@ -27647,7 +27647,7 @@ "unixify": "^1.0.0", "urlpattern-polyfill": "8.0.2", "yargs": "^17.0.0", - "zod": "^3.24.1" + "zod": "^3.23.8" }, "bin": { "zip-it-and-ship-it": "bin.js" From d56933dca72d2c4ce9b111f76cc0175275c77f44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:19:53 +0000 Subject: [PATCH 70/71] fix(deps): update babel monorepo to v7.26.3 (#5871) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- package-lock.json | 42 ++++++++++-------------- packages/zip-it-and-ship-it/package.json | 2 +- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c00630da3..1eb4f682f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -300,18 +300,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -399,12 +399,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -458,14 +458,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -24552,13 +24551,6 @@ "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -27614,8 +27606,8 @@ "version": "9.41.1", "license": "MIT", "dependencies": { - "@babel/parser": "^7.22.5", - "@babel/types": "7.25.6", + "@babel/parser": "^7.26.3", + "@babel/types": "7.26.3", "@netlify/binary-info": "^1.0.0", "@netlify/serverless-functions-api": "^1.31.1", "@vercel/nft": "^0.27.1", diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 86835b4190..a53ac5ee1b 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -42,7 +42,7 @@ }, "dependencies": { "@babel/parser": "^7.22.5", - "@babel/types": "7.25.6", + "@babel/types": "7.26.3", "@netlify/binary-info": "^1.0.0", "@netlify/serverless-functions-api": "^1.31.1", "@vercel/nft": "^0.27.1", From 5bb784a814b472462ea972cdd9b81048f36c2c29 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Wed, 11 Dec 2024 12:50:37 -0500 Subject: [PATCH 71/71] fix: update DENO_VERSION_RANGE (#5929) * Update DENO_VERSION_RANGE * chore: update lower end of deno version range * test: match deno ranges in tests to DENO_VERSION_RANGE * fix: update comment with a link to buildbot --- .github/workflows/workflow.yml | 6 +++--- packages/edge-bundler/node/bridge.ts | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index bc94a7a980..15d4f3abf0 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -52,11 +52,11 @@ jobs: os: [ubuntu-latest, macOS-latest, windows-latest] node-version: ['*'] # Must include the minimum deno version from the `DENO_VERSION_RANGE` constant in `node/bridge.ts`. - deno-version: ['v1.37.0', 'v1.44.4'] + deno-version: ['v1.39.0', 'v1.46.3'] include: - os: ubuntu-latest node-version: '14.16.0' - deno-version: 'v1.44.4' + deno-version: 'v1.46.3' fail-fast: false steps: # Increasing the maximum number of open files. See: @@ -192,7 +192,7 @@ jobs: - name: Setup Deno uses: denoland/setup-deno@v1 with: - deno-version: v1.44.4 + deno-version: v1.46.3 if: ${{ !steps.release-check.outputs.IS_RELEASE }} - name: Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 diff --git a/packages/edge-bundler/node/bridge.ts b/packages/edge-bundler/node/bridge.ts index 8405c60978..a597bd3275 100644 --- a/packages/edge-bundler/node/bridge.ts +++ b/packages/edge-bundler/node/bridge.ts @@ -13,11 +13,10 @@ import { getBinaryExtension } from './platform.js' const DENO_VERSION_FILE = 'version.txt' -// When updating DENO_VERSION_RANGE, ensure that the deno version installed in the -// build-image/buildbot does satisfy this range! -// We're pinning the range because of an issue with v1.45.0 of the Deno CLI: -// https://linear.app/netlify/issue/FRP-775/deno-cli-v1450-causing-issues -const DENO_VERSION_RANGE = '1.37.0 - 1.44.4' +// When updating DENO_VERSION_RANGE, ensure that the deno version +// on the netlify/buildbot build image satisfies this range! +// https://github.com/netlify/buildbot/blob/f9c03c9dcb091d6570e9d0778381560d469e78ad/build-image/noble/Dockerfile#L410 +const DENO_VERSION_RANGE = '1.39.0 - 1.46.3' type OnBeforeDownloadHook = () => void | Promise type OnAfterDownloadHook = (error?: Error) => void | Promise