From d2ffc78e975fdfed89da00931349b9da7f7d894c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Wed, 30 Apr 2025 10:05:34 -0300 Subject: [PATCH 01/13] feat: update unenv to version 2.0.0-rc.15 --- package-lock.json | 280 +++++++++++++++--- package.json | 3 +- packages/bundler/package.json | 2 +- .../src/bundlers/esbuild/esbuild.config.ts | 2 + .../plugins/node-polyfills/node-polyfills.ts | 21 +- .../plugins/node-polyfills/node-polyfills.ts | 12 +- .../src/polyfills/fs/context/fs.context.js | 2 + .../bundler/src/polyfills/fs/fs.polyfills.js | 41 +-- packages/bundler/src/polyfills/index.d.ts | 1 + packages/bundler/src/polyfills/index.js | 2 + .../src/polyfills/stream/context/index.js | 3 + .../stream/context/stream.context.js | 18 ++ .../bundler/src/polyfills/stream/index.js | 7 + .../src/polyfills/stream/stream.polyfills.js | 108 +++++++ packages/unenv-preset/src/index.ts | 19 +- .../unenv-preset/src/polyfills/node/crypto.js | 17 ++ .../unenv-preset/src/polyfills/node/empty.js | 3 + .../unenv-preset/src/polyfills/node/fs.js | 15 +- .../src/polyfills/node/globals/process.cjs | 26 +- .../src/polyfills/node/globals/promise.js | 13 + .../src/polyfills/node/globals/stream.js | 104 +++++++ .../unenv-preset/src/polyfills/node/https.js | 196 ++++++++++++ .../unenv-preset/src/polyfills/node/module.js | 41 +-- 23 files changed, 810 insertions(+), 126 deletions(-) create mode 100644 packages/bundler/src/polyfills/stream/context/index.js create mode 100644 packages/bundler/src/polyfills/stream/context/stream.context.js create mode 100644 packages/bundler/src/polyfills/stream/index.js create mode 100644 packages/bundler/src/polyfills/stream/stream.polyfills.js create mode 100644 packages/unenv-preset/src/polyfills/node/empty.js create mode 100644 packages/unenv-preset/src/polyfills/node/globals/promise.js create mode 100644 packages/unenv-preset/src/polyfills/node/globals/stream.js create mode 100644 packages/unenv-preset/src/polyfills/node/https.js diff --git a/package-lock.json b/package-lock.json index d98379ee..1522eb0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azion", - "version": "1.19.0", + "version": "1.19.1-stage.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "azion", - "version": "1.19.0", + "version": "1.19.1-stage.1", "license": "MIT", "workspaces": [ "packages/*" @@ -39,11 +39,10 @@ "pcre-to-regexp": "^1.1.0", "progress": "^2.0.3", "signale": "^1.4.0", - "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", - "unenv": "^1.10.0", + "unenv": "^2.0.0-rc.15", "url": "^0.11.4", "util": "^0.12.5", "vm-browserify": "^1.1.2", @@ -6097,6 +6096,32 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -6220,6 +6245,27 @@ "node": ">= 0.12" } }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/browserify-sign/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6239,6 +6285,21 @@ } ] }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", @@ -6766,6 +6827,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "dev": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -6888,7 +6950,8 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", @@ -7514,6 +7577,32 @@ "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -8140,6 +8229,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/exsolve": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", + "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8524,6 +8619,32 @@ "readable-stream": "^2.0.0" } }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -8671,6 +8792,22 @@ "traverse": "0.6.8" } }, + "node_modules/git-log-parser/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/git-log-parser/node_modules/split2": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", @@ -8680,6 +8817,16 @@ "through2": "~2.0.0" } }, + "node_modules/git-log-parser/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/git-log-parser/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -9429,7 +9576,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", @@ -11355,11 +11503,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch-native": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" - }, "node_modules/node-inspect-extracted": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/node-inspect-extracted/-/node-inspect-extracted-1.1.0.tgz", @@ -14730,6 +14873,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -15091,9 +15240,10 @@ } }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" }, "node_modules/pbkdf2": { "version": "3.1.2", @@ -15423,7 +15573,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", @@ -15835,28 +15986,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -16936,6 +17065,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -16964,10 +17094,37 @@ "readable-stream": "^2.0.2" } }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -17259,6 +17416,32 @@ "node": ">= 0.8.0" } }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -17925,6 +18108,12 @@ } } }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, "node_modules/uglify-js": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", @@ -17978,15 +18167,16 @@ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", + "version": "2.0.0-rc.15", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", + "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", + "license": "MIT", "dependencies": { - "consola": "^3.2.3", "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" + "exsolve": "^1.0.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "ufo": "^1.5.4" } }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -18542,7 +18732,7 @@ "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "ts-loader": "^9.5.2", - "unenv": "^1.10.0", + "unenv": "^2.0.0-rc.15", "url": "^0.11.4", "util": "^0.12.5", "vm-browserify": "^1.1.2", diff --git a/package.json b/package.json index 865dcea6..fcf058ab 100644 --- a/package.json +++ b/package.json @@ -253,11 +253,10 @@ "pcre-to-regexp": "^1.1.0", "progress": "^2.0.3", "signale": "^1.4.0", - "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", - "unenv": "^1.10.0", + "unenv": "^2.0.0-rc.15", "url": "^0.11.4", "util": "^0.12.5", "vm-browserify": "^1.1.2", diff --git a/packages/bundler/package.json b/packages/bundler/package.json index 62b892c4..bceb6300 100644 --- a/packages/bundler/package.json +++ b/packages/bundler/package.json @@ -46,7 +46,7 @@ "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "ts-loader": "^9.5.2", - "unenv": "^1.10.0", + "unenv": "^2.0.0-rc.15", "url": "^0.11.4", "util": "^0.12.5", "vm-browserify": "^1.1.2", diff --git a/packages/bundler/src/bundlers/esbuild/esbuild.config.ts b/packages/bundler/src/bundlers/esbuild/esbuild.config.ts index 61e233a9..5c03279e 100644 --- a/packages/bundler/src/bundlers/esbuild/esbuild.config.ts +++ b/packages/bundler/src/bundlers/esbuild/esbuild.config.ts @@ -6,6 +6,8 @@ export default { platform: 'browser', mainFields: ['browser', 'module', 'main'], target: 'es2022', + keepNames: true, + allowOverwrite: true, loader: { '.js': 'js', }, diff --git a/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts b/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts index eac748b5..a8c1cf1f 100644 --- a/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts +++ b/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts @@ -5,12 +5,20 @@ import fs from 'fs'; import { createRequire } from 'module'; import { builtinModules } from 'node:module'; import path from 'path'; -import { env, nodeless } from 'unenv'; +import { defineEnv } from 'unenv'; import helper from './helper/index'; const requireCustom = createRequire(import.meta.url); -const { alias, inject, polyfill, external } = env(nodeless, unenvPresetAzion); +const { env } = defineEnv({ + nodeCompat: true, + resolve: false, + overrides: { + ...unenvPresetAzion, + }, +}); + +const { alias, inject, polyfill, external } = env; interface BuildOptions { define?: Record; @@ -21,14 +29,12 @@ interface GlobalInjectResult { exportName: string; } -type GlobalInjectValue = string | string[] | [string, string]; - /** * Get global inject * @param {*} globalInject Global inject * @returns {*} Return import statement and export name */ -function getGlobalInject(globalInject: GlobalInjectValue): GlobalInjectResult { +function getGlobalInject(globalInject: string | string[]): GlobalInjectResult { if (typeof globalInject === 'string') { return { importStatement: `import globalVar from "${globalInject}";`, @@ -186,7 +192,8 @@ function handleNodeJSGlobals(build: PluginBuild, getAbsolutePath: (moving: strin if (!match?.[1]) throw new Error(`Invalid global name: ${args.path}`); const globalName = match[1]; - const { importStatement, exportName } = getGlobalInject(inject[globalName]); + + const { importStatement, exportName } = getGlobalInject(inject[globalName] as string | string[]); return { contents: ` @@ -259,7 +266,7 @@ function defineNextJsRuntime(options: BuildOptions) { // eslint-disable-next-line no-param-reassign options.define = { ...options.define, - 'process.env.NEXT_RUNTIME': '"edge"', + 'process.env.NEXT_RUNTIME': options.define?.['process.env.NEXT_RUNTIME'] || '"edge"', 'process.env.NEXT_COMPUTE_JS': 'true', 'process.env.__NEXT_BUILD_ID': `"${buildId}"`, }; diff --git a/packages/bundler/src/bundlers/webpack/plugins/node-polyfills/node-polyfills.ts b/packages/bundler/src/bundlers/webpack/plugins/node-polyfills/node-polyfills.ts index f36a200c..dff9c656 100644 --- a/packages/bundler/src/bundlers/webpack/plugins/node-polyfills/node-polyfills.ts +++ b/packages/bundler/src/bundlers/webpack/plugins/node-polyfills/node-polyfills.ts @@ -3,12 +3,20 @@ import { getAbsoluteDirPath } from 'azion/utils/node'; import fs from 'fs'; import { createRequire } from 'module'; import path from 'path'; -import { env, nodeless } from 'unenv'; +import { defineEnv } from 'unenv'; import { Compiler, WebpackPluginInstance } from 'webpack'; const require = createRequire(import.meta.url); -const { alias, inject, polyfill, external } = env(nodeless, unenvPresetAzion); +const { env } = defineEnv({ + nodeCompat: true, + resolve: false, + overrides: { + ...unenvPresetAzion, + }, +}); + +const { alias, inject, polyfill, external } = env; class NodePolyfillPlugin implements WebpackPluginInstance { private INTERNAL_POLYFILL_PATH = '/polyfills'; diff --git a/packages/bundler/src/polyfills/fs/context/fs.context.js b/packages/bundler/src/polyfills/fs/context/fs.context.js index d5d0afe6..641eb49e 100644 --- a/packages/bundler/src/polyfills/fs/context/fs.context.js +++ b/packages/bundler/src/polyfills/fs/context/fs.context.js @@ -9,6 +9,7 @@ export const { openSync, close, closeSync, + existsSync, stat, statSync, lstat, @@ -55,6 +56,7 @@ localFs.open = open; localFs.openSync = openSync; localFs.close = close; localFs.closeSync = closeSync; +localFs.existsSync = existsSync; localFs.stat = stat; localFs.statSync = statSync; localFs.lstat = lstat; diff --git a/packages/bundler/src/polyfills/fs/fs.polyfills.js b/packages/bundler/src/polyfills/fs/fs.polyfills.js index b990b379..1f171332 100644 --- a/packages/bundler/src/polyfills/fs/fs.polyfills.js +++ b/packages/bundler/src/polyfills/fs/fs.polyfills.js @@ -24,6 +24,11 @@ function closeSync(...args) { return FS_CONTEXT.closeSync(...args); } +function existsSync(path) { + path = join(BUILD_PATH_PREFIX, path); + return FS_CONTEXT.existsSync(path); +} + function stat(path, ...args) { path = join(BUILD_PATH_PREFIX, path); return FS_CONTEXT.stat(path, ...args); @@ -157,28 +162,16 @@ const W_OK = 2; const X_OK = 1; export { - promises, - open, - openSync, close, closeSync, - stat, - statSync, - lstat, - lstatSync, - readFile, - readFileSync, - readdir, - readdirSync, - mkdir, - rmdir, + constants, copyFile, cp, - writeFile, - rename, - realpath, - constants, + existsSync, F_OK, + lstat, + lstatSync, + mkdir, O_APPEND, O_CREAT, O_DIRECTORY, @@ -193,8 +186,21 @@ export { O_SYNC, O_TRUNC, O_WRONLY, + open, + openSync, + promises, R_OK, + readdir, + readdirSync, + readFile, + readFileSync, + realpath, + rename, + rmdir, + stat, + statSync, W_OK, + writeFile, X_OK, }; @@ -204,6 +210,7 @@ localFs.open = open; localFs.openSync = openSync; localFs.close = close; localFs.closeSync = closeSync; +localFs.existsSync = existsSync; localFs.stat = stat; localFs.statSync = statSync; localFs.lstat = lstat; diff --git a/packages/bundler/src/polyfills/index.d.ts b/packages/bundler/src/polyfills/index.d.ts index 778f22d8..db445515 100644 --- a/packages/bundler/src/polyfills/index.d.ts +++ b/packages/bundler/src/polyfills/index.d.ts @@ -11,4 +11,5 @@ declare module 'azion/bundler/polyfills' { export const NetworkListContext: any; export const fsContext: any; export const FirewallEventContext: any; + export const streamContext: any; } diff --git a/packages/bundler/src/polyfills/index.js b/packages/bundler/src/polyfills/index.js index 733d853d..06512a20 100644 --- a/packages/bundler/src/polyfills/index.js +++ b/packages/bundler/src/polyfills/index.js @@ -6,6 +6,7 @@ import FirewallEventContext from './azion/firewall-event/index.js'; import NetworkListContext from './azion/network-list/index.js'; import { StorageContext } from './azion/storage/index.js'; import { fsContext } from './fs/index.js'; +import { streamContext } from './stream/index.js'; // TODO: transform polyfills to TypeScript @@ -18,4 +19,5 @@ export { fsContext, NetworkListContext, StorageContext, + streamContext, }; diff --git a/packages/bundler/src/polyfills/stream/context/index.js b/packages/bundler/src/polyfills/stream/context/index.js new file mode 100644 index 00000000..d453fb08 --- /dev/null +++ b/packages/bundler/src/polyfills/stream/context/index.js @@ -0,0 +1,3 @@ +import streamContext from './stream.context.js'; + +export default streamContext; diff --git a/packages/bundler/src/polyfills/stream/context/stream.context.js b/packages/bundler/src/polyfills/stream/context/stream.context.js new file mode 100644 index 00000000..2cee8abf --- /dev/null +++ b/packages/bundler/src/polyfills/stream/context/stream.context.js @@ -0,0 +1,18 @@ +/* eslint-disable */ +import * as stream from 'node:stream'; + +export class Duplex extends stream.Duplex {} +export class Writable extends stream.Writable {} +export class Readable extends stream.Readable {} +export class Transform extends stream.Transform {} +export class PassThrough extends stream.PassThrough {} +export class Stream extends stream.Stream {} + +export default { + Duplex, + Writable, + Readable, + Transform, + PassThrough, + Stream, +}; diff --git a/packages/bundler/src/polyfills/stream/index.js b/packages/bundler/src/polyfills/stream/index.js new file mode 100644 index 00000000..1be5acd7 --- /dev/null +++ b/packages/bundler/src/polyfills/stream/index.js @@ -0,0 +1,7 @@ +/** + * We are not exporting the async_hooks.polyfill.js from this structure due to the context definition in runtime.env.js. + * As we are proxying the Node.js async_hooks lib, it is not possible to export the async_hooks.polyfill.js file. + */ +import streamContext from './context/index.js'; + +export { streamContext }; diff --git a/packages/bundler/src/polyfills/stream/stream.polyfills.js b/packages/bundler/src/polyfills/stream/stream.polyfills.js new file mode 100644 index 00000000..546d9227 --- /dev/null +++ b/packages/bundler/src/polyfills/stream/stream.polyfills.js @@ -0,0 +1,108 @@ +/* eslint-disable */ +/** This polyfill is referenced in #build/bundlers/polyfills/polyfills-manager.js + * + * STREAM is defined in runtime.env.js for use on the local server + */ +export class Duplex extends STREAM.Duplex {} +export class Writable extends STREAM.Writable {} +export class Readable extends STREAM.Readable {} +export class Transform extends STREAM.Transform {} +export class PassThrough extends STREAM.PassThrough {} +export class Stream extends STREAM.Stream {} + +Readable.toWeb = function (readable) { + const stream = new ReadableStream({ + start(controller) { + readable.on('data', (chunk) => { + controller.enqueue(chunk); + }); + readable.on('end', () => { + controller.close(); + }); + readable.on('error', (error) => { + controller.error(error); + }); + }, + }); + return stream; +}; + +Readable.fromWeb = function (webStream) { + const reader = webStream.getReader(); + return new Readable({ + async read(size) { + const { done, value } = await reader.read(); + if (done) { + return { done: true }; + } + return { done: false, value }; + }, + async destroy(error) { + await reader.cancel(error); + }, + }); +}; + +Writable.toWeb = function (webStream) { + const writer = webStream.getWriter(); + + // Captura erros no fechamento do stream + writer.closed.catch((error) => { + console.error('WritableStream closed with error:', error); + console.error('Error details:', error?.message, error?.stack); + }); + + return new Writable({ + write(chunk, encoding, callback) { + // Verifica se o stream ainda está ativo antes de escrever + if (writer.desiredSize === null) { + const err = new Error('WritableStream is not writable or has been closed.'); + console.error(err.message); + callback(err); + return; + } + + writer + .write(chunk) + .then(() => callback(undefined)) + .catch((err) => { + // console.error('Error writing to WritableStream:', err); + callback(err); + }); + }, + final(callback) { + // Wait for the writer to be ready before closing + writer.ready + .then(() => { + return writer.close(); + }) + .then(() => callback(undefined)) + .catch((err) => { + // console.error('Error closing WritableStream:', err); + callback(err); + }); + }, + destroy(error, callback) { + // Cancela o stream em caso de destruição + writer + .abort(error) + .then(() => { + // console.log('WritableStream aborted successfully.'); + callback(undefined); + }) + .catch((err) => { + // console.error('Error aborting WritableStream:', err); + callback(err); + }); + }, + }); +}; + +export default { + Duplex, + Writable, + Readable, + Transform, + PassThrough, + Stream, +}; diff --git a/packages/unenv-preset/src/index.ts b/packages/unenv-preset/src/index.ts index dac95cde..ec43ccd8 100644 --- a/packages/unenv-preset/src/index.ts +++ b/packages/unenv-preset/src/index.ts @@ -5,7 +5,6 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const getAbsolutePath = () => path.resolve(__dirname, '../../', 'unenv-preset', 'src'); -const nextNodePresetPath = `${getAbsolutePath()}/polyfills/node/frameworks/next`; const polyfillsPath = `${getAbsolutePath()}/polyfills`; export default { @@ -14,33 +13,23 @@ export default { __filename: `${polyfillsPath}/node/globals/path-filename.js`, process: `${polyfillsPath}/node/globals/process.cjs`, performance: `${polyfillsPath}/node/globals/performance.js`, - navigator: `${polyfillsPath}/node/globals/navigator.js`, + stream: `${polyfillsPath}/node/globals/stream.js`, }, alias: { 'azion/utils': 'azion/utils', 'azion/utils/edge': 'azion/utils/edge', 'azion/utils/node': 'azion/utils/node', - '@fastly/http-compute-js': '@fastly/http-compute-js', - 'next/dist/compiled/etag': `${nextNodePresetPath}/custom-server/12.3.x/util/etag.js`, accepts: 'accepts', - crypto: `${polyfillsPath}/node/crypto.js`, - events: 'events/events.js', - http: 'stream-http', + https: `${polyfillsPath}/node/https.js`, module: `${polyfillsPath}/node/module.js`, - stream: 'stream-browserify/', - string_decoder: 'string_decoder/lib/string_decoder.js', - url: 'url/url.js', - util: 'util/util.js', timers: 'timers-browserify/', - inherits: 'inherits/inherits_browser.js', - vm: 'vm-browserify/', - zlib: 'browserify-zlib', }, - external: ['node:async_hooks', 'node:fs/promises'], + external: ['node:async_hooks', 'node:fs/promises', '@fastly/http-compute-js', 'node:stream'], polyfill: [ 'aziondev:async_hooks:/async-hooks/async-hooks.polyfills.js', 'aziondev:fs:/fs/fs.polyfills.js', 'aziondev:fs/promises:/fs/promises/promises.polyfills.js', + 'aziondev:stream:/stream/stream.polyfills.js', `azionprd:fs:/fs.js`, ], }; diff --git a/packages/unenv-preset/src/polyfills/node/crypto.js b/packages/unenv-preset/src/polyfills/node/crypto.js index ade2fe3e..dfb0d273 100644 --- a/packages/unenv-preset/src/polyfills/node/crypto.js +++ b/packages/unenv-preset/src/polyfills/node/crypto.js @@ -65,3 +65,20 @@ export var randomUUID = function () { return (c ^ (getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16); }); }; + +export var generateKeyPair = function (type, options, callback) { + if (typeof options === 'function') { + callback = options; + options = undefined; + } + if (typeof type === 'function') { + callback = type; + type = undefined; + } + + if (type === 'rsa') { + return crypto.generateKeyPair('rsa', options, callback); + } else { + throw new Error('Unsupported key type'); + } +}; diff --git a/packages/unenv-preset/src/polyfills/node/empty.js b/packages/unenv-preset/src/polyfills/node/empty.js new file mode 100644 index 00000000..89f4afba --- /dev/null +++ b/packages/unenv-preset/src/polyfills/node/empty.js @@ -0,0 +1,3 @@ +export function loadEnvConfig() {} + +export default {}; diff --git a/packages/unenv-preset/src/polyfills/node/fs.js b/packages/unenv-preset/src/polyfills/node/fs.js index 6e97dc17..ef3f37de 100644 --- a/packages/unenv-preset/src/polyfills/node/fs.js +++ b/packages/unenv-preset/src/polyfills/node/fs.js @@ -381,6 +381,17 @@ function readdirSync(path, options = {}) { return result; } +function existsSync(path) { + path = getValidatedPath(path); + const filesInfos = getFilesInfos(); + + if (filesInfos.paths.includes(path)) { + return true; + } + + return false; +} + // Use Cells node:fs API const fsPolyfill = Object.create(SRC_NODE_FS); fsPolyfill.close = close; @@ -390,10 +401,11 @@ fsPolyfill.statSync = statSync; fsPolyfill.lstatSync = statSync; fsPolyfill.readFileSync = readFileSync; fsPolyfill.readdirSync = readdirSync; +fsPolyfill.existsSync = existsSync; export default fsPolyfill; -export { close, closeSync, statSync as lstatSync, openSync, readdirSync, readFileSync, statSync }; +export { close, closeSync, existsSync, statSync as lstatSync, openSync, readdirSync, readFileSync, statSync }; export const { access, @@ -414,7 +426,6 @@ export const { Dir, Dirent, exists, - existsSync, F_OK, fdatasync, fdatasyncSync, diff --git a/packages/unenv-preset/src/polyfills/node/globals/process.cjs b/packages/unenv-preset/src/polyfills/node/globals/process.cjs index 5a691ee3..6e6e524e 100644 --- a/packages/unenv-preset/src/polyfills/node/globals/process.cjs +++ b/packages/unenv-preset/src/polyfills/node/globals/process.cjs @@ -154,8 +154,25 @@ Item.prototype.run = function () { }; processShim.title = 'browser'; processShim.browser = true; -processShim.env = processShim.env = - typeof globalThis.process !== 'undefined' && globalThis.process.env ? globalThis.process.env : {}; +const initialValues = globalThis.process !== 'undefined' && globalThis.process?.env ? globalThis.process.env : {}; +Object.defineProperty(processShim, 'env', { + value: new Proxy( + { ...initialValues }, + { + get(target, prop) { + return target[prop] || undefined; + }, + set(target, prop, value) { + target[prop] = value; + return true; + }, + }, + ), + writable: true, + enumerable: true, + configurable: true, +}); + processShim.argv = []; processShim.version = ''; // empty string to avoid regexp issues processShim.versions = { node: '18.3.1' }; @@ -185,11 +202,12 @@ processShim.cwd = function () { }; processShim.chdir = function (dir) { - throw new Error('process.chdir is not supported'); + return dir ?? '/'; }; processShim.umask = function () { return 0; }; globalThis.process = processShim; -globalThis.process.env = processShim.env; + +module.exports = processShim; diff --git a/packages/unenv-preset/src/polyfills/node/globals/promise.js b/packages/unenv-preset/src/polyfills/node/globals/promise.js new file mode 100644 index 00000000..afab94ce --- /dev/null +++ b/packages/unenv-preset/src/polyfills/node/globals/promise.js @@ -0,0 +1,13 @@ +globalThis.Promise = Promise || globalThis.Promise; + +globalThis.Promise.withResolvers = function () { + let resolve; + let reject; + const promise = new globalThis.Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve: resolve, reject: reject }; +}; + +export default globalThis.Promise; diff --git a/packages/unenv-preset/src/polyfills/node/globals/stream.js b/packages/unenv-preset/src/polyfills/node/globals/stream.js new file mode 100644 index 00000000..2a2ca105 --- /dev/null +++ b/packages/unenv-preset/src/polyfills/node/globals/stream.js @@ -0,0 +1,104 @@ +import { Duplex, Readable, Transform, Writable } from 'node:stream'; + +globalThis.Readable = Readable; +globalThis.Writable = Writable; +globalThis.Duplex = Duplex; +globalThis.Transform = Transform; + +globalThis.Readable.toWeb = function (readable) { + const stream = new ReadableStream({ + start(controller) { + readable.on('data', (chunk) => { + controller.enqueue(chunk); + }); + readable.on('end', () => { + controller.close(); + }); + readable.on('error', (error) => { + controller.error(error); + }); + }, + }); + return stream; +}; + +globalThis.Readable.fromWeb = function (webStream) { + const reader = webStream.getReader(); + return new Readable({ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async read(size) { + const { done, value } = await reader.read(); + if (done) { + return { done: true }; + } + return { done: false, value }; + }, + async destroy(error) { + await reader.cancel(error); + }, + }); +}; + +globalThis.Writable.toWeb = function (webStream) { + const writer = webStream.getWriter(); + + // Captura erros no fechamento do stream + writer.closed.catch((error) => { + console.error('WritableStream closed with error:', error); + console.error('Error details:', error?.message, error?.stack); + }); + + return new Writable({ + write(chunk, encoding, callback) { + // Verifica se o stream ainda está ativo antes de escrever + if (writer.desiredSize === null) { + const err = new Error('WritableStream is not writable or has been closed.'); + console.error(err.message); + callback(err); + return; + } + + writer + .write(chunk) + .then(() => callback(undefined)) + .catch((err) => { + // console.error('Error writing to WritableStream:', err); + callback(err); + }); + }, + final(callback) { + // Wait for the writer to be ready before closing + writer.ready + .then(() => { + return writer.close(); + }) + .then(() => callback(undefined)) + .catch((err) => { + // console.error('Error closing WritableStream:', err); + callback(err); + }); + }, + destroy(error, callback) { + // Cancela o stream em caso de destruição + writer + .abort(error) + .then(() => { + // console.log('WritableStream aborted successfully.'); + callback(undefined); + }) + .catch((err) => { + // console.error('Error aborting WritableStream:', err); + callback(err); + }); + }, + }); +}; + +globalThis.stream = { + Readable: globalThis.Readable, + Writable: globalThis.Writable, + Duplex: Duplex, + Transform: Transform, +}; + +export default globalThis.stream; diff --git a/packages/unenv-preset/src/polyfills/node/https.js b/packages/unenv-preset/src/polyfills/node/https.js new file mode 100644 index 00000000..bc7f2ed8 --- /dev/null +++ b/packages/unenv-preset/src/polyfills/node/https.js @@ -0,0 +1,196 @@ +// https://nodejs.org/api/https.html +import { EventEmitter } from 'node:events'; + +function notImplementedClass(name) { + return class { + __unenv__ = true; + constructor() { + throw new Error(`[unenv] ${name} is not implemented yet!`); + } + }; +} +function createNotImplementedError(name) { + return new Error(`[unenv] ${name} is not implemented yet!`); +} + +function notImplemented(name) { + const fn = () => { + throw createNotImplementedError(name); + }; + return Object.assign(fn, { __unenv__: true }); +} + +class HttpAgent extends EventEmitter { + __unenv__ = {}; + maxFreeSockets = 256; + maxSockets = Infinity; + maxTotalSockets = Infinity; + freeSockets = {}; + sockets = {}; + requests = {}; + destroy() {} +} + +export const Server = notImplementedClass('https.Server'); + +export const Agent = HttpAgent; + +export const globalAgent = new Agent(); + +export const get = notImplemented('https.get'); + +export const createServer = notImplemented('https.createServer'); + +export const request = (options, callback) => { + let fullUrl; + let headers = {}; + let method; + + if (typeof options === 'object') { + const protocol = options.protocol || 'https:'; + const hostname = options.hostname || 'localhost'; + const port = options.port ? `:${options.port}` : ''; + const path = options.path || '/'; + method = options.method || 'GET'; + + // Adiciona os query params, se existirem + const queryParams = options.query ? new URLSearchParams(options.query).toString() : ''; + const queryString = queryParams ? `?${queryParams}` : ''; + + fullUrl = `${protocol}//${hostname}${port}${path}${queryString}`; + headers = { ...options.headers }; + } else { + fullUrl = options; + headers = options.headers || {}; + } + + const { body } = options; + + // Verifica o tipo de conteúdo e formata o corpo adequadamente + let formattedBody; + if (headers['Content-Type'] === 'application/json') { + formattedBody = body ? JSON.stringify(body) : undefined; + } else if (headers['Content-Type'] === 'application/x-www-form-urlencoded') { + formattedBody = body ? new URLSearchParams(body).toString() : undefined; + } else { + formattedBody = body; // Envia o corpo como está para outros tipos de conteúdo + } + + const fetchOptions = { + method, + headers, + body: JSON.stringify(formattedBody) || JSON.stringify({}), + }; + + const controller = new AbortController(); + const signal = controller.signal; + + let timeoutId; + if (options.timeout) { + timeoutId = setTimeout(() => { + controller.abort(); + reqEvents.emit('error', new Error('Request timed out')); + }, 5000); + } + + const reqEvents = new EventEmitter(); + + let endCalled = false; + + const req = { + _bodyBuffer: [], + write: (chunk) => { + if (typeof chunk === 'string' || chunk instanceof Buffer) { + req._bodyBuffer.push(chunk); // Adiciona o chunk ao buffer + } else { + throw new Error('Invalid chunk type. Expected string or Buffer.'); + } + }, + on: (event, listener) => { + reqEvents.on(event, listener); + return req; + }, + once: (event, listener) => { + reqEvents.once(event, listener); + return req; + }, + abort: () => { + clearTimeout(timeoutId); + controller.abort(); + }, + end: () => { + if (endCalled) { + console.error('end() called multiple times'); + return; + } + endCalled = true; + + // Concatena os chunks do buffer para formar o corpo completo + const body = req._bodyBuffer.length > 0 ? req._bodyBuffer.join('') : undefined; + + fetch(fullUrl, { ...fetchOptions, body, signal }) + .then(async (response) => { + clearTimeout(timeoutId); + + const res = new EventEmitter(); + res.statusCode = response.status; + res.headers = Object.fromEntries(response.headers.entries()); + + const reader = response.body?.getReader(); + + const processStream = async () => { + try { + if (!reader) { + console.log('No reader available'); + res.emit('end'); // Emite 'end' se não houver corpo na resposta + return; + } + // eslint-disable-next-line no-constant-condition + while (true) { + const { done, value } = await reader.read(); + if (done) { + res.emit('end'); + break; + } + res.emit('data', Buffer.from(value)); + } + } catch (err) { + console.error('Error processing stream:', err); + res.emit('error', err); + } + }; + + if (reader) { + if (!reader.locked) { + processStream(); + } else { + res.emit('error', new Error('Stream is already locked')); + } + } else { + res.emit('end'); + } + + reqEvents.emit('response', res); + + if (callback) { + callback(res); + } + }) + .catch((err) => { + clearTimeout(timeoutId); + reqEvents.emit('error', err); + }); + }, + }; + + return req; +}; + +export default { + Server, + Agent, + globalAgent, + get, + createServer, + request, +}; diff --git a/packages/unenv-preset/src/polyfills/node/module.js b/packages/unenv-preset/src/polyfills/node/module.js index 31569dce..506d7038 100644 --- a/packages/unenv-preset/src/polyfills/node/module.js +++ b/packages/unenv-preset/src/polyfills/node/module.js @@ -8,7 +8,7 @@ function unimplemented() { throw new Error('Not implemented yet!'); } -var builtinModules = [ +const builtinModules = [ '_http_agent', '_http_client', '_http_common', @@ -84,11 +84,8 @@ function _nodeModulePaths(...args) { /* EMPTY */ } -function _resolveFilename(...args) { - /* EMPTY */ -} - -export default { +// Crie um objeto para exportação +const moduleExports = { builtinModules: builtinModules, _cache: null, _pathCache: null, @@ -99,7 +96,7 @@ export default { _nodeModulePaths: _nodeModulePaths, _resolveLookupPaths: unimplemented, _load: _load, - _resolveFilename: _resolveFilename, + _resolveFilename: unimplemented, createRequireFromPath: unimplemented, createRequire: createRequire, _initPaths: unimplemented, @@ -111,28 +108,10 @@ export default { SourceMap: unimplemented, }; -export var _cache = null, - _pathCache = null, - _extensions = null, - globalPaths = null; - -export { - builtinModules, - unimplemented as _debug, - unimplemented as _findPath, - unimplemented as _nodeModulePaths, - unimplemented as _resolveLookupPaths, - unimplemented as _load, - unimplemented as _resolveFilename, - createRequire as createRequireFromPath, - createRequire as createRequire, - unimplemented as _initPaths, - unimplemented as _preloadModules, - unimplemented as syncBuiltinESMExports, - unimplemented as Module, - unimplemented as runMain, - unimplemented as findSourceMap, - unimplemented as SourceMap, -}; +Object.defineProperty(moduleExports, '_resolveFilename', { + value: unimplemented, + writable: true, + configurable: true, +}); -/* eslint-enable */ +export default moduleExports; From 5727893ad56380debfd364d634657d29b1547e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Wed, 30 Apr 2025 10:08:47 -0300 Subject: [PATCH 02/13] feat: add support for require in esbuild when production --- packages/bundler/src/bundlers/esbuild/esbuild.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/bundler/src/bundlers/esbuild/esbuild.ts b/packages/bundler/src/bundlers/esbuild/esbuild.ts index 68cb16a4..9dad3384 100644 --- a/packages/bundler/src/bundlers/esbuild/esbuild.ts +++ b/packages/bundler/src/bundlers/esbuild/esbuild.ts @@ -32,12 +32,19 @@ const bundlerPlugins = createBundlerPlugins + (config: ESBuildConfig, ctx: BuildContext) => (content: string | undefined): ESBuildConfig => { if (!content) return config; - config.banner = config.banner || {}; + config.banner.js = config.banner.js ? `${config.banner.js} ${content}` : content; + if (ctx.production) { + config.banner.js += ` +// This file is generated by Azion. Do not edit it manually. +// Dynamic require is not supported in production mode. +import { createRequire as _createRequire } from "node:module"; +const require = _createRequire(import.meta.url);`; + } return config; }; @@ -66,7 +73,7 @@ export const createAzionESBuildConfig = (buildConfig: BuildConfiguration, ctx: B flow([ () => bundlerPlugins.applyPolyfills(ctx)(config)(buildConfig), () => bundlerPlugins.applyAzionModule(ctx)(config), - () => applyContentInjection(config)(buildConfig?.setup?.contentToInject), + () => applyContentInjection(config, ctx)(buildConfig?.setup?.contentToInject), () => applyDefineVars(config, 'esbuild')(buildConfig?.setup?.defineVars), () => extendConfig(config)(buildConfig.extend as (config: ESBuildConfiguration) => ESBuildConfiguration), ])(config), From 556641ac4cf7fdb96aed4a47dee657d5766c0e1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Wed, 30 Apr 2025 10:12:01 -0300 Subject: [PATCH 03/13] chore: update package-lock.json --- package-lock.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1522eb0c..c1451ed3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azion", - "version": "1.19.1-stage.1", + "version": "1.19.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "azion", - "version": "1.19.1-stage.1", + "version": "1.19.1", "license": "MIT", "workspaces": [ "packages/*" @@ -48,10 +48,6 @@ "vm-browserify": "^1.1.2", "webpack": "^5.97.1" }, - "bin": { - "azion": "bin/azion", - "azlib": "bin/azion" - }, "devDependencies": { "@commitlint/cli": "^18.4.1", "@commitlint/config-conventional": "^18.4.0", From 5f9be0fa75006c4508ac0e036fe364a1be49d9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Wed, 30 Apr 2025 17:55:30 -0300 Subject: [PATCH 04/13] feat: add crypto polyfills to dev runtime and defining with external --- .../crypto/context/crypto.context.js | 68 +++++++++++++++++ .../src/polyfills/crypto/context/index.js | 3 + .../src/polyfills/crypto/crypto.polyfills.js | 73 +++++++++++++++++++ .../bundler/src/polyfills/crypto/index.js | 7 ++ packages/bundler/src/polyfills/index.d.ts | 1 + packages/bundler/src/polyfills/index.js | 2 + packages/unenv-preset/src/index.ts | 3 +- 7 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 packages/bundler/src/polyfills/crypto/context/crypto.context.js create mode 100644 packages/bundler/src/polyfills/crypto/context/index.js create mode 100644 packages/bundler/src/polyfills/crypto/crypto.polyfills.js create mode 100644 packages/bundler/src/polyfills/crypto/index.js diff --git a/packages/bundler/src/polyfills/crypto/context/crypto.context.js b/packages/bundler/src/polyfills/crypto/context/crypto.context.js new file mode 100644 index 00000000..1e023541 --- /dev/null +++ b/packages/bundler/src/polyfills/crypto/context/crypto.context.js @@ -0,0 +1,68 @@ +/* eslint-disable */ +import * as crypto from 'node:crypto'; + +export var { Cipher } = crypto; +export var { Decipher } = crypto; +export var { DiffieHellman } = crypto; +export var { DiffieHellmanGroup } = crypto; +export var { Hash } = crypto; +export var { Hmac } = crypto; +export var { Sign } = crypto; +export var { Verify } = crypto; +export var { constants } = crypto; +export var { createCipheriv } = crypto; +export var { createDecipheriv } = crypto; +export var { createDiffieHellman } = crypto; +export var { createDiffieHellmanGroup } = crypto; +export var { createECDH } = crypto; +export var { createHash } = crypto; +export var { createHmac } = crypto; +export var { createSign } = crypto; +export var { createVerify } = crypto; +export var { getCiphers } = crypto; +export var { getDiffieHellman } = crypto; +export var { getHashes } = crypto; +export var { pbkdf2 } = crypto; +export var { pbkdf2Sync } = crypto; +export var { privateDecrypt } = crypto; +export var { privateEncrypt } = crypto; +export var { pseudoRandomBytes } = crypto; +export var { publicDecrypt } = crypto; +export var { publicEncrypt } = crypto; +export var { randomBytes } = crypto; +export var { randomFill } = crypto; +export var { randomFillSync } = crypto; + +export default { + Cipher, + Decipher, + DiffieHellman, + DiffieHellmanGroup, + Hash, + Hmac, + Sign, + Verify, + constants, + createCipheriv, + createDecipheriv, + createDiffieHellman, + createDiffieHellmanGroup, + createECDH, + createHash, + createHmac, + createSign, + createVerify, + getCiphers, + getDiffieHellman, + getHashes, + pbkdf2, + pbkdf2Sync, + privateDecrypt, + privateEncrypt, + pseudoRandomBytes, + publicDecrypt, + publicEncrypt, + randomBytes, + randomFill, + randomFillSync, +}; diff --git a/packages/bundler/src/polyfills/crypto/context/index.js b/packages/bundler/src/polyfills/crypto/context/index.js new file mode 100644 index 00000000..b25ab622 --- /dev/null +++ b/packages/bundler/src/polyfills/crypto/context/index.js @@ -0,0 +1,3 @@ +import cryptoContext from './crypto.context.js'; + +export default cryptoContext; diff --git a/packages/bundler/src/polyfills/crypto/crypto.polyfills.js b/packages/bundler/src/polyfills/crypto/crypto.polyfills.js new file mode 100644 index 00000000..53215496 --- /dev/null +++ b/packages/bundler/src/polyfills/crypto/crypto.polyfills.js @@ -0,0 +1,73 @@ +/* eslint-disable */ +/** This polyfill is referenced in #build/bundlers/polyfills/polyfills-manager.js + * + * CRYPTO_CONTEXT is defined in runtime.env.js for use on the local server + */ + +/* eslint-disable */ + +export var { Cipher } = CRYPTO_CONTEXT.cryptoContext; +export var { Decipher } = CRYPTO_CONTEXT.cryptoContext; +export var { DiffieHellman } = CRYPTO_CONTEXT.cryptoContext; +export var { DiffieHellmanGroup } = CRYPTO_CONTEXT.cryptoContext; +export var { Hash } = CRYPTO_CONTEXT.cryptoContext; +export var { Hmac } = CRYPTO_CONTEXT.cryptoContext; +export var { Sign } = CRYPTO_CONTEXT.cryptoContext; +export var { Verify } = CRYPTO_CONTEXT.cryptoContext; +export var { constants } = CRYPTO_CONTEXT.cryptoContext; +export var { createCipheriv } = CRYPTO_CONTEXT.cryptoContext; +export var { createDecipheriv } = CRYPTO_CONTEXT.cryptoContext; +export var { createDiffieHellman } = CRYPTO_CONTEXT.cryptoContext; +export var { createDiffieHellmanGroup } = CRYPTO_CONTEXT.cryptoContext; +export var { createECDH } = CRYPTO_CONTEXT.cryptoContext; +export var { createHash } = CRYPTO_CONTEXT.cryptoContext; +export var { createHmac } = CRYPTO_CONTEXT.cryptoContext; +export var { createSign } = CRYPTO_CONTEXT.cryptoContext; +export var { createVerify } = CRYPTO_CONTEXT.cryptoContext; +export var { getCiphers } = CRYPTO_CONTEXT.cryptoContext; +export var { getDiffieHellman } = CRYPTO_CONTEXT.cryptoContext; +export var { getHashes } = CRYPTO_CONTEXT.cryptoContext; +export var { pbkdf2 } = CRYPTO_CONTEXT.cryptoContext; +export var { pbkdf2Sync } = CRYPTO_CONTEXT.cryptoContext; +export var { privateDecrypt } = CRYPTO_CONTEXT.cryptoContext; +export var { privateEncrypt } = CRYPTO_CONTEXT.cryptoContext; +export var { pseudoRandomBytes } = CRYPTO_CONTEXT.cryptoContext; +export var { publicDecrypt } = CRYPTO_CONTEXT.cryptoContext; +export var { publicEncrypt } = CRYPTO_CONTEXT.cryptoContext; +export var { randomBytes } = CRYPTO_CONTEXT.cryptoContext; +export var { randomFill } = CRYPTO_CONTEXT.cryptoContext; +export var { randomFillSync } = CRYPTO_CONTEXT.cryptoContext; + +export default { + Cipher, + Decipher, + DiffieHellman, + DiffieHellmanGroup, + Hash, + Hmac, + Sign, + Verify, + constants, + createCipheriv, + createDecipheriv, + createDiffieHellman, + createDiffieHellmanGroup, + createECDH, + createHash, + createHmac, + createSign, + createVerify, + getCiphers, + getDiffieHellman, + getHashes, + pbkdf2, + pbkdf2Sync, + privateDecrypt, + privateEncrypt, + pseudoRandomBytes, + publicDecrypt, + publicEncrypt, + randomBytes, + randomFill, + randomFillSync, +}; diff --git a/packages/bundler/src/polyfills/crypto/index.js b/packages/bundler/src/polyfills/crypto/index.js new file mode 100644 index 00000000..5c6a2584 --- /dev/null +++ b/packages/bundler/src/polyfills/crypto/index.js @@ -0,0 +1,7 @@ +/** + * We are not exporting the crypto.polyfill.js from this structure due to the context definition in runtime.env.js. + * As we are proxying the Node.js crypto lib, it is not possible to export the crypto.polyfill.js file. + */ +import cryptoContext from './context/index.js'; + +export default { cryptoContext }; diff --git a/packages/bundler/src/polyfills/index.d.ts b/packages/bundler/src/polyfills/index.d.ts index db445515..72cca2e3 100644 --- a/packages/bundler/src/polyfills/index.d.ts +++ b/packages/bundler/src/polyfills/index.d.ts @@ -12,4 +12,5 @@ declare module 'azion/bundler/polyfills' { export const fsContext: any; export const FirewallEventContext: any; export const streamContext: any; + export const cryptoContext: any; } diff --git a/packages/bundler/src/polyfills/index.js b/packages/bundler/src/polyfills/index.js index 06512a20..6fc8e0f3 100644 --- a/packages/bundler/src/polyfills/index.js +++ b/packages/bundler/src/polyfills/index.js @@ -5,6 +5,7 @@ import fetchContext from './azion/fetch/index.js'; import FirewallEventContext from './azion/firewall-event/index.js'; import NetworkListContext from './azion/network-list/index.js'; import { StorageContext } from './azion/storage/index.js'; +import cryptoContext from './crypto/index.js'; import { fsContext } from './fs/index.js'; import { streamContext } from './stream/index.js'; @@ -12,6 +13,7 @@ import { streamContext } from './stream/index.js'; export { AsyncHooksContext, + cryptoContext, EnvVarsContext, fetchContext, FetchEventContext, diff --git a/packages/unenv-preset/src/index.ts b/packages/unenv-preset/src/index.ts index ec43ccd8..19751057 100644 --- a/packages/unenv-preset/src/index.ts +++ b/packages/unenv-preset/src/index.ts @@ -24,12 +24,13 @@ export default { module: `${polyfillsPath}/node/module.js`, timers: 'timers-browserify/', }, - external: ['node:async_hooks', 'node:fs/promises', '@fastly/http-compute-js', 'node:stream'], + external: ['node:async_hooks', 'node:fs/promises', '@fastly/http-compute-js', 'node:stream', 'node:crypto'], polyfill: [ 'aziondev:async_hooks:/async-hooks/async-hooks.polyfills.js', 'aziondev:fs:/fs/fs.polyfills.js', 'aziondev:fs/promises:/fs/promises/promises.polyfills.js', 'aziondev:stream:/stream/stream.polyfills.js', + 'aziondev:crypto:/crypto/crypto.polyfills.js', `azionprd:fs:/fs.js`, ], }; From b82515ff9e2127b8baf9496ef361fa3d608266c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Fri, 2 May 2025 15:44:17 -0300 Subject: [PATCH 05/13] fix: prepend 'node:' to non-external module paths in nodeBuiltInModules --- .../bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts b/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts index a8c1cf1f..49164a76 100644 --- a/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts +++ b/packages/bundler/src/bundlers/esbuild/plugins/node-polyfills/node-polyfills.ts @@ -134,7 +134,7 @@ function nodeBuiltInModules( // if polyfill is not found, check if the module is external if (!polyfillResult && externalModule) { return { - path: args.path, + path: args.path.startsWith('node:') ? args.path : `node:${args.path}`, external: externalModule.includes(args.path), }; } From 87c1f0e4cb4bc4a88f5ad788233e5fef36b2b26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Fri, 2 May 2025 15:45:16 -0300 Subject: [PATCH 06/13] refactor: remove unused handlePublicDir function and related logic --- .../src/presets/next/node/prebuild/index.js | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/packages/presets/src/presets/next/node/prebuild/index.js b/packages/presets/src/presets/next/node/prebuild/index.js index e5493417..23b838f7 100644 --- a/packages/presets/src/presets/next/node/prebuild/index.js +++ b/packages/presets/src/presets/next/node/prebuild/index.js @@ -4,21 +4,6 @@ import path, { join } from 'path'; import { copyDirectory, feedback, getAbsoluteDirPath } from 'azion/utils/node'; import BuildStatic from './statics/index.js'; -/** - * If a relative path exists, copy public path to root - * @param {string} pathPrefix - prefix - * @param {string} rootDir - application root dir - */ -function handlePublicDir(pathPrefix, rootDir) { - const validPathPrefix = pathPrefix && typeof pathPrefix === 'string' && pathPrefix !== ''; - - if (validPathPrefix) { - const srcPublicDir = path.resolve(pathPrefix, 'public'); - const destPublicDir = path.resolve(rootDir, 'public'); - copyDirectory(srcPublicDir, destPublicDir); - } -} - /** * Run actions to build next for node runtime. * @param {string} nextVersion - project next version in package.json @@ -47,12 +32,6 @@ async function run(nextVersion, buildContext) { process.exit(1); } - // STATICS - // copy to root public dir if necessary - if (buildContext.memoryFS) { - handlePublicDir(buildContext.memoryFS.removePathPrefix, rootDir); - } - // It is necessary to replace the static directories for the .vercel output, // which has the _next pattern and the public folder does not exist // as the files are in the root (.vercel/output/static). From 7a4d1c32485b9c096cf38956fee0ab889dd4542f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Fri, 2 May 2025 15:45:59 -0300 Subject: [PATCH 07/13] fix: update MEM_FILES declaration and improve path prefix handling in fixMappedFilesPaths function --- packages/unenv-preset/src/polyfills/node/fs.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/unenv-preset/src/polyfills/node/fs.js b/packages/unenv-preset/src/polyfills/node/fs.js index ef3f37de..14a70956 100644 --- a/packages/unenv-preset/src/polyfills/node/fs.js +++ b/packages/unenv-preset/src/polyfills/node/fs.js @@ -4,7 +4,7 @@ import bPath from 'path'; /* eslint-disable */ -const MEM_FILES = globalThis.bundler.__FILES__; +var MEM_FILES = globalThis.bundler.__FILES__; globalThis.bundler.FS_PATHS_CHANGED = false; @@ -13,12 +13,13 @@ globalThis.bundler.FS_PATHS_CHANGED = false; */ function fixMappedFilesPaths() { const prefix = globalThis.bundler.FS_PATH_PREFIX_TO_REMOVE; - if (!globalThis.bundler.FS_PATHS_CHANGED && prefix !== '') { + if (!globalThis.bundler.FS_PATHS_CHANGED && (prefix !== undefined || prefix !== '""')) { + let CHANGED_PATHS = {}; Object.keys(MEM_FILES).forEach((e) => { const newKey = e.replace(prefix, ''); - MEM_FILES[newKey] = MEM_FILES[e]; - delete MEM_FILES[e]; + CHANGED_PATHS[newKey] = MEM_FILES[e]; }); + MEM_FILES = CHANGED_PATHS; } globalThis.bundler.FS_PATHS_CHANGED = true; From b6507ecc97b1a8d7f130be79f37748a88b5c8e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Fri, 2 May 2025 15:47:24 -0300 Subject: [PATCH 08/13] feat: added stream imports to runtime dev --- .../polyfills/stream/context/stream.context.js | 17 ++++++++++------- .../src/polyfills/stream/stream.polyfills.js | 18 +++++++++++------- packages/unenv-preset/src/index.ts | 4 +++- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/bundler/src/polyfills/stream/context/stream.context.js b/packages/bundler/src/polyfills/stream/context/stream.context.js index 2cee8abf..4f9dec57 100644 --- a/packages/bundler/src/polyfills/stream/context/stream.context.js +++ b/packages/bundler/src/polyfills/stream/context/stream.context.js @@ -1,12 +1,13 @@ /* eslint-disable */ -import * as stream from 'node:stream'; +import stream from 'node:stream'; -export class Duplex extends stream.Duplex {} -export class Writable extends stream.Writable {} -export class Readable extends stream.Readable {} -export class Transform extends stream.Transform {} -export class PassThrough extends stream.PassThrough {} -export class Stream extends stream.Stream {} +export var { Duplex } = stream; +export var { Writable } = stream; +export var { Readable } = stream; +export var { Transform } = stream; +export var { PassThrough } = stream; +export var { Stream } = stream; +export var { prototype } = stream; export default { Duplex, @@ -15,4 +16,6 @@ export default { Transform, PassThrough, Stream, + stream, + prototype, }; diff --git a/packages/bundler/src/polyfills/stream/stream.polyfills.js b/packages/bundler/src/polyfills/stream/stream.polyfills.js index 546d9227..e6da0c26 100644 --- a/packages/bundler/src/polyfills/stream/stream.polyfills.js +++ b/packages/bundler/src/polyfills/stream/stream.polyfills.js @@ -1,14 +1,16 @@ /* eslint-disable */ /** This polyfill is referenced in #build/bundlers/polyfills/polyfills-manager.js * - * STREAM is defined in runtime.env.js for use on the local server + * STREAM_CONTEXT is defined in runtime.env.js for use on the local server */ -export class Duplex extends STREAM.Duplex {} -export class Writable extends STREAM.Writable {} -export class Readable extends STREAM.Readable {} -export class Transform extends STREAM.Transform {} -export class PassThrough extends STREAM.PassThrough {} -export class Stream extends STREAM.Stream {} + +export var { Duplex } = STREAM_CONTEXT; +export var { Writable } = STREAM_CONTEXT; +export var { Readable } = STREAM_CONTEXT; +export var { Transform } = STREAM_CONTEXT; +export var { PassThrough } = STREAM_CONTEXT; +export var { Stream } = STREAM_CONTEXT; +export var { prototype } = STREAM_CONTEXT; Readable.toWeb = function (readable) { const stream = new ReadableStream({ @@ -105,4 +107,6 @@ export default { Transform, PassThrough, Stream, + stream: STREAM_CONTEXT, + prototype, }; diff --git a/packages/unenv-preset/src/index.ts b/packages/unenv-preset/src/index.ts index 19751057..4bca74ee 100644 --- a/packages/unenv-preset/src/index.ts +++ b/packages/unenv-preset/src/index.ts @@ -19,12 +19,14 @@ export default { 'azion/utils': 'azion/utils', 'azion/utils/edge': 'azion/utils/edge', 'azion/utils/node': 'azion/utils/node', + '@fastly/http-compute-js': '@fastly/http-compute-js', accepts: 'accepts', https: `${polyfillsPath}/node/https.js`, module: `${polyfillsPath}/node/module.js`, + string_decoder: 'string_decoder/lib/string_decoder.js', timers: 'timers-browserify/', }, - external: ['node:async_hooks', 'node:fs/promises', '@fastly/http-compute-js', 'node:stream', 'node:crypto'], + external: ['node:async_hooks', 'node:fs/promises', 'node:stream', 'node:crypto'], polyfill: [ 'aziondev:async_hooks:/async-hooks/async-hooks.polyfills.js', 'aziondev:fs:/fs/fs.polyfills.js', From 0a6d8694a9f3c2bd40dbad120d6938f29ec1a4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Fri, 2 May 2025 15:48:08 -0300 Subject: [PATCH 09/13] fix: enhance body parsing in handleFetchEvent for various Content-Types --- .../node/custom-server/12.3.x/server/next.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/presets/src/presets/next/node/custom-server/12.3.x/server/next.js b/packages/presets/src/presets/next/node/custom-server/12.3.x/server/next.js index 1624a85c..dc2b1175 100644 --- a/packages/presets/src/presets/next/node/custom-server/12.3.x/server/next.js +++ b/packages/presets/src/presets/next/node/custom-server/12.3.x/server/next.js @@ -56,6 +56,29 @@ export class NextServer { async handleFetchEvent(event) { const { req, res } = toReqRes(event.request); + // Consume the ReadableStream (req._stream) and populate req.body + if (req._stream) { + // Determine Content-Type + const contentType = req.headers['content-type'] || req.headers['Content-Type']; + + if (contentType === 'application/json') { + try { + req.body = await event.request.json(); // Parse JSON if Content-Type is application/json + } catch (error) { + console.error('Invalid JSON body:', error); + req.body = null; // Handle invalid JSON gracefully + } + } else if (contentType === 'application/x-www-form-urlencoded') { + req.body = new URLSearchParams(await event.request.text()).toString(); // Parse URL-encoded data + } else if (contentType === 'text/plain' || !contentType) { + req.body = await event.request.text(); // Handle plain text or no Content-Type + } else { + console.warn(`Unhandled Content-Type: ${contentType}`); + req.body = event.request.body; // Default fallback: raw string + } + } else { + req.body = JSON.stringify({}); // Handle cases where there is no body + } const nextRequest = new ComputeJsNextRequest(req, event.client); const nextResponse = new ComputeJsNextResponse(res); From 092ebbb4f08f94967814aa73cce3a381111ecefb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Mon, 5 May 2025 10:01:55 -0300 Subject: [PATCH 10/13] feat: add promises context and related polyfills to bundler --- packages/bundler/src/polyfills/index.d.ts | 1 + packages/bundler/src/polyfills/index.js | 2 ++ packages/bundler/src/polyfills/promises/context/index.js | 3 +++ .../src/polyfills/promises/context/promises.context.js} | 2 +- packages/bundler/src/polyfills/promises/index.js | 7 +++++++ 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 packages/bundler/src/polyfills/promises/context/index.js rename packages/{unenv-preset/src/polyfills/node/globals/promise.js => bundler/src/polyfills/promises/context/promises.context.js} (85%) create mode 100644 packages/bundler/src/polyfills/promises/index.js diff --git a/packages/bundler/src/polyfills/index.d.ts b/packages/bundler/src/polyfills/index.d.ts index 72cca2e3..7b43519e 100644 --- a/packages/bundler/src/polyfills/index.d.ts +++ b/packages/bundler/src/polyfills/index.d.ts @@ -13,4 +13,5 @@ declare module 'azion/bundler/polyfills' { export const FirewallEventContext: any; export const streamContext: any; export const cryptoContext: any; + export const promisesContext: any; } diff --git a/packages/bundler/src/polyfills/index.js b/packages/bundler/src/polyfills/index.js index 6fc8e0f3..26131e71 100644 --- a/packages/bundler/src/polyfills/index.js +++ b/packages/bundler/src/polyfills/index.js @@ -7,6 +7,7 @@ import NetworkListContext from './azion/network-list/index.js'; import { StorageContext } from './azion/storage/index.js'; import cryptoContext from './crypto/index.js'; import { fsContext } from './fs/index.js'; +import promisesContext from './promises/index.js'; import { streamContext } from './stream/index.js'; // TODO: transform polyfills to TypeScript @@ -20,6 +21,7 @@ export { FirewallEventContext, fsContext, NetworkListContext, + promisesContext, StorageContext, streamContext, }; diff --git a/packages/bundler/src/polyfills/promises/context/index.js b/packages/bundler/src/polyfills/promises/context/index.js new file mode 100644 index 00000000..4c68a3f6 --- /dev/null +++ b/packages/bundler/src/polyfills/promises/context/index.js @@ -0,0 +1,3 @@ +import promisesContext from './promises.context.js'; + +export default promisesContext; diff --git a/packages/unenv-preset/src/polyfills/node/globals/promise.js b/packages/bundler/src/polyfills/promises/context/promises.context.js similarity index 85% rename from packages/unenv-preset/src/polyfills/node/globals/promise.js rename to packages/bundler/src/polyfills/promises/context/promises.context.js index afab94ce..b8a8e0df 100644 --- a/packages/unenv-preset/src/polyfills/node/globals/promise.js +++ b/packages/bundler/src/polyfills/promises/context/promises.context.js @@ -10,4 +10,4 @@ globalThis.Promise.withResolvers = function () { return { promise, resolve: resolve, reject: reject }; }; -export default globalThis.Promise; +export default globalThis.Promise.withResolvers; diff --git a/packages/bundler/src/polyfills/promises/index.js b/packages/bundler/src/polyfills/promises/index.js new file mode 100644 index 00000000..df1d92fd --- /dev/null +++ b/packages/bundler/src/polyfills/promises/index.js @@ -0,0 +1,7 @@ +/** + * We are not exporting the promises.polyfill.js from this structure due to the context definition in runtime.env.js. + * As we are proxying the Node.js promises lib, it is not possible to export the promises.polyfill.js file. + */ +import promisesContext from './context/index.js'; + +export default { promisesContext }; From b07902ad75a09d0294b49f846ce18453f874b9e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Mon, 5 May 2025 10:27:19 -0300 Subject: [PATCH 11/13] docs: add deprecation notice for webpack bundler and update related documentation --- packages/config/README.md | 84 +++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/packages/config/README.md b/packages/config/README.md index 4561312d..49213a8b 100644 --- a/packages/config/README.md +++ b/packages/config/README.md @@ -304,15 +304,18 @@ Converts a Azion JSON configuration object to a AzionConfig object. Type definition for the build configuration. +> ⚠️ \*Deprecation Notice: +> Support for the webpack bundler will be discontinued in future releases. While it is still available for now, new features, fixes, and improvements will be focused exclusively on esbuild. We recommend migrating to esbuild as soon as possible to ensure compatibility and better performance in upcoming versions. + **Properties:** -- `bundler?: 'esbuild' | 'webpack'` - O empacotador a ser usado. -- `preset?: string | AzionBuildPreset` - O preset a ser usado, pode ser uma string ou um objeto AzionBuildPreset. -- `entry?: string | string[] | Record` - O arquivo de entrada, pode ser uma string, array de strings ou um objeto. -- `polyfills?: boolean` - Se deve incluir polyfills. -- `worker?: boolean` - Se deve construir um worker. -- `extend?: (context: T) => T` - Função para estender a configuração do bundler. -- `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - Configuração do sistema de arquivos em memória. +- \*`bundler?: 'esbuild' | 'webpack'` - The bundler to be used. Default is 'esbuild'. +- `preset?: string | AzionBuildPreset` - The preset to be used, can be a string or an AzionBuildPreset object. +- `entry?: string | string[] | Record` - The entry file, can be a string, an array of strings, or an object. +- `polyfills?: boolean` - Whether to include polyfills. +- `worker?: boolean` - Whether to build a worker. +- `extend?: (context: T) => T` - Function to extend the bundler configuration. +- `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - In-memory file system configuration. ### `AzionBuildPreset` @@ -320,14 +323,14 @@ Type definition for the build preset. **Properties:** -- `config: AzionConfig` - A configuração do Azion. -- `handler?: (event: FetchEvent) => Promise` - Manipulador de eventos opcional. -- `prebuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise` - Hook executado antes da construção. -- `postbuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise` - Hook executado após a construção. -- `metadata: PresetMetadata` - Metadados do preset. - - `name: string` - Nome do preset. - - `registry?: string` - Registro do preset. - - `ext?: string` - Extensão do arquivo. +- `config: AzionConfig` - The Azion configuration. +- `handler?: (event: FetchEvent) => Promise` - Optional event handler. +- `prebuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise` - Hook executed before the build process. +- `postbuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise` - Hook executed after the build process. +- `metadata: PresetMetadata` - Preset metadata. + - `name: string` - Preset name. + - `registry?: string` - Preset registry. + - `ext?: string` - File extension. ### `AzionPrebuildResult` @@ -335,14 +338,14 @@ Type definition for the prebuild result. **Properties:** -- `filesToInject: string[]` - Arquivos a serem injetados na memória durante o processo de construção. -- `injection: object` - Configurações de injeção de código. - - `globals: object` - Variáveis globais a serem injetadas. - - `entry?: string` - Código no início do worker. - - `banner?: string` - Código no topo do worker. -- `bundler: object` - Configurações do empacotador. - - `defineVars: object` - Variáveis a serem definidas. - - `plugins: (EsbuildPlugin | WebpackPlugin)[]` - Plugins a serem usados. +- `filesToInject: string[]` - Files to be injected into memory during the build process. +- `injection: object` - Code injection settings. + - `globals: object` - Global variables to be injected. + - `entry?: string` - Code to run at the start of the worker. + - `banner?: string` - Code to place at the top of the worker. +- `bundler: object` - Bundler configuration. + - `defineVars: object` - Variables to be defined. + - `plugins: (EsbuildPlugin | WebpackPlugin)[]` - Plugins to be used. ### `BuildContext` @@ -350,24 +353,27 @@ Type definition for the build context. **Properties:** -- `production: boolean` - Se está em modo de produção. -- `handler: BuildEntryPoint` - O ponto de entrada da construção. +- `production: boolean` - Whether it is in production mode. +- `handler: BuildEntryPoint` - The build entry point. ### `BuildConfiguration` Type definition for the build configuration. +> ⚠️ \*Deprecation Notice: +> Support for the webpack bundler will be discontinued in future releases. While it is still available for now, new features, fixes, and improvements will be focused exclusively on esbuild. We recommend migrating to esbuild as soon as possible to ensure compatibility and better performance in upcoming versions. + **Properties:** -- `entry: Record` - Os pontos de entrada. -- `baseOutputDir?: string` - Diretório base de saída. -- `preset: AzionBuildPreset` - O preset a ser usado. -- `setup: BundlerSetup` - Configuração do empacotador. -- `bundler?: 'webpack' | 'esbuild'` - O empacotador a ser usado. -- `polyfills?: boolean` - Se deve incluir polyfills. -- `worker?: boolean` - Se deve construir um worker. -- `extend?: (context: T) => T` - Função para estender a configuração do bundler. -- `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - Configuração do sistema de arquivos em memória. +- `entry: Record` - The entry points. +- `baseOutputDir?: string` - Base output directory. +- `preset: AzionBuildPreset` - The preset to be used. +- `setup: BundlerSetup` - Bundler configuration. +- \*`bundler?: 'webpack' | 'esbuild'` - The bundler to be used. +- `polyfills?: boolean` - Whether to include polyfills. +- `worker?: boolean` - Whether to build a worker. +- `extend?: (context: T) => T` - Function to extend the bundler configuration. +- `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - In-memory file system configuration. ### `BundlerSetup` @@ -375,8 +381,8 @@ Type definition for the bundler setup. **Properties:** -- `contentToInject?: string` - Conteúdo a ser injetado. -- `defineVars?: Record` - Variáveis a serem definidas. +- `contentToInject?: string` - Content to be injected. +- `defineVars?: Record` - Variables to be defined. ### `PresetMetadata` @@ -384,9 +390,9 @@ Type definition for the preset metadata. **Properties:** -- `name: string` - Nome do preset. -- `registry?: string` - Registro do preset. -- `ext?: string` - Extensão do arquivo. +- `name: string` - Preset name. +- `registry?: string` - Preset registry. +- `ext?: string` - File extension. ### `AzionDomain` From 9c78a49fb5c41dec9acbfe60af203f50fe96d72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Mon, 5 May 2025 11:04:25 -0300 Subject: [PATCH 12/13] refactor: remove deprecated stream polyfills and clean up related code --- .../src/polyfills/stream/stream.polyfills.js | 8 -- packages/unenv-preset/src/index.ts | 1 - .../src/polyfills/node/globals/stream.js | 104 ------------------ 3 files changed, 113 deletions(-) delete mode 100644 packages/unenv-preset/src/polyfills/node/globals/stream.js diff --git a/packages/bundler/src/polyfills/stream/stream.polyfills.js b/packages/bundler/src/polyfills/stream/stream.polyfills.js index e6da0c26..f91de692 100644 --- a/packages/bundler/src/polyfills/stream/stream.polyfills.js +++ b/packages/bundler/src/polyfills/stream/stream.polyfills.js @@ -48,7 +48,6 @@ Readable.fromWeb = function (webStream) { Writable.toWeb = function (webStream) { const writer = webStream.getWriter(); - // Captura erros no fechamento do stream writer.closed.catch((error) => { console.error('WritableStream closed with error:', error); console.error('Error details:', error?.message, error?.stack); @@ -56,7 +55,6 @@ Writable.toWeb = function (webStream) { return new Writable({ write(chunk, encoding, callback) { - // Verifica se o stream ainda está ativo antes de escrever if (writer.desiredSize === null) { const err = new Error('WritableStream is not writable or has been closed.'); console.error(err.message); @@ -68,32 +66,26 @@ Writable.toWeb = function (webStream) { .write(chunk) .then(() => callback(undefined)) .catch((err) => { - // console.error('Error writing to WritableStream:', err); callback(err); }); }, final(callback) { - // Wait for the writer to be ready before closing writer.ready .then(() => { return writer.close(); }) .then(() => callback(undefined)) .catch((err) => { - // console.error('Error closing WritableStream:', err); callback(err); }); }, destroy(error, callback) { - // Cancela o stream em caso de destruição writer .abort(error) .then(() => { - // console.log('WritableStream aborted successfully.'); callback(undefined); }) .catch((err) => { - // console.error('Error aborting WritableStream:', err); callback(err); }); }, diff --git a/packages/unenv-preset/src/index.ts b/packages/unenv-preset/src/index.ts index 4bca74ee..eb5fe4ee 100644 --- a/packages/unenv-preset/src/index.ts +++ b/packages/unenv-preset/src/index.ts @@ -13,7 +13,6 @@ export default { __filename: `${polyfillsPath}/node/globals/path-filename.js`, process: `${polyfillsPath}/node/globals/process.cjs`, performance: `${polyfillsPath}/node/globals/performance.js`, - stream: `${polyfillsPath}/node/globals/stream.js`, }, alias: { 'azion/utils': 'azion/utils', diff --git a/packages/unenv-preset/src/polyfills/node/globals/stream.js b/packages/unenv-preset/src/polyfills/node/globals/stream.js deleted file mode 100644 index 2a2ca105..00000000 --- a/packages/unenv-preset/src/polyfills/node/globals/stream.js +++ /dev/null @@ -1,104 +0,0 @@ -import { Duplex, Readable, Transform, Writable } from 'node:stream'; - -globalThis.Readable = Readable; -globalThis.Writable = Writable; -globalThis.Duplex = Duplex; -globalThis.Transform = Transform; - -globalThis.Readable.toWeb = function (readable) { - const stream = new ReadableStream({ - start(controller) { - readable.on('data', (chunk) => { - controller.enqueue(chunk); - }); - readable.on('end', () => { - controller.close(); - }); - readable.on('error', (error) => { - controller.error(error); - }); - }, - }); - return stream; -}; - -globalThis.Readable.fromWeb = function (webStream) { - const reader = webStream.getReader(); - return new Readable({ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async read(size) { - const { done, value } = await reader.read(); - if (done) { - return { done: true }; - } - return { done: false, value }; - }, - async destroy(error) { - await reader.cancel(error); - }, - }); -}; - -globalThis.Writable.toWeb = function (webStream) { - const writer = webStream.getWriter(); - - // Captura erros no fechamento do stream - writer.closed.catch((error) => { - console.error('WritableStream closed with error:', error); - console.error('Error details:', error?.message, error?.stack); - }); - - return new Writable({ - write(chunk, encoding, callback) { - // Verifica se o stream ainda está ativo antes de escrever - if (writer.desiredSize === null) { - const err = new Error('WritableStream is not writable or has been closed.'); - console.error(err.message); - callback(err); - return; - } - - writer - .write(chunk) - .then(() => callback(undefined)) - .catch((err) => { - // console.error('Error writing to WritableStream:', err); - callback(err); - }); - }, - final(callback) { - // Wait for the writer to be ready before closing - writer.ready - .then(() => { - return writer.close(); - }) - .then(() => callback(undefined)) - .catch((err) => { - // console.error('Error closing WritableStream:', err); - callback(err); - }); - }, - destroy(error, callback) { - // Cancela o stream em caso de destruição - writer - .abort(error) - .then(() => { - // console.log('WritableStream aborted successfully.'); - callback(undefined); - }) - .catch((err) => { - // console.error('Error aborting WritableStream:', err); - callback(err); - }); - }, - }); -}; - -globalThis.stream = { - Readable: globalThis.Readable, - Writable: globalThis.Writable, - Duplex: Duplex, - Transform: Transform, -}; - -export default globalThis.stream; From 4e6a8decfd19800604ce133982ae46a4abc51e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Filho?= Date: Mon, 5 May 2025 14:43:00 -0300 Subject: [PATCH 13/13] feat: add assert-browserify dependency and update polyfills mapping --- package-lock.json | 77 ++++++++++++++++++++++++++++++ package.json | 1 + packages/unenv-preset/src/index.ts | 1 + 3 files changed, 79 insertions(+) diff --git a/package-lock.json b/package-lock.json index c1451ed3..84963ea7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-keywords": "^5.1.0", + "assert-browserify": "^2.0.0", "babel-loader": "^9.2.1", "browserify-zlib": "^0.2.0", "chalk": "^5.3.0", @@ -5813,6 +5814,18 @@ "node": ">=12.0.0" } }, + "node_modules/assert-browserify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert-browserify/-/assert-browserify-2.0.0.tgz", + "integrity": "sha512-SJvtrHmyaOT57oKWIpzWZr2hLkFyXjg5ajNT+RHvd9fhpruhrJF0OYT0yy8rIgvSn3xQp/VpLQAOwO0KNVKrJw==", + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -7442,6 +7455,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/defu": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", @@ -7858,6 +7888,12 @@ "node": ">= 0.4" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -9462,6 +9498,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -14869,6 +14921,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ohash": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", diff --git a/package.json b/package.json index 17092b90..6af78a64 100644 --- a/package.json +++ b/package.json @@ -231,6 +231,7 @@ "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-keywords": "^5.1.0", + "assert-browserify": "^2.0.0", "babel-loader": "^9.2.1", "browserify-zlib": "^0.2.0", "chalk": "^5.3.0", diff --git a/packages/unenv-preset/src/index.ts b/packages/unenv-preset/src/index.ts index eb5fe4ee..69ccad17 100644 --- a/packages/unenv-preset/src/index.ts +++ b/packages/unenv-preset/src/index.ts @@ -20,6 +20,7 @@ export default { 'azion/utils/node': 'azion/utils/node', '@fastly/http-compute-js': '@fastly/http-compute-js', accepts: 'accepts', + assert: 'assert-browserify', https: `${polyfillsPath}/node/https.js`, module: `${polyfillsPath}/node/module.js`, string_decoder: 'string_decoder/lib/string_decoder.js',