From b4a45b7b7028ad52dc12e0c0935dac6766876075 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 11:08:28 +0000 Subject: [PATCH 01/23] fix(deps): update dependency @clerk/clerk-sdk-node to v4.9.1 (#8327) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../auth-providers/clerk/api/package.json | 2 +- yarn.lock | 35 ++++++++++++------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/auth-providers/clerk/api/package.json b/packages/auth-providers/clerk/api/package.json index aa5ceea99e8d..9747327811bf 100644 --- a/packages/auth-providers/clerk/api/package.json +++ b/packages/auth-providers/clerk/api/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.21.5", - "@clerk/clerk-sdk-node": "4.8.7", + "@clerk/clerk-sdk-node": "4.9.1", "core-js": "3.30.2" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 005b0ec6031b..181cac8d0879 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2107,18 +2107,18 @@ __metadata: languageName: node linkType: hard -"@clerk/backend@npm:^0.18.0": - version: 0.18.0 - resolution: "@clerk/backend@npm:0.18.0" +"@clerk/backend@npm:^0.19.1": + version: 0.19.1 + resolution: "@clerk/backend@npm:0.19.1" dependencies: - "@clerk/types": ^3.36.0 + "@clerk/types": ^3.37.1 "@peculiar/webcrypto": 1.4.1 "@types/node": 16.18.6 deepmerge: 4.2.2 node-fetch-native: 1.0.1 snakecase-keys: 5.4.4 tslib: 2.4.1 - checksum: e41aceb9ca844b998d41d879b3abbad5d8faae248edd14f21f539ec74eae4d6d89ef9267f5e8792ae8b8215ccfecbfea2fae5c1828d99fb9f6d0b36fc33f64ae + checksum: 945dd6435117c3b5a9c891954f995de9fe2f4702b4cf291a7d61f4e4480b8f570a118467d33c21d75336dacaaeacf8fd40115c7e27e99b3c9ca292577b3fc222 languageName: node linkType: hard @@ -2136,12 +2136,12 @@ __metadata: languageName: node linkType: hard -"@clerk/clerk-sdk-node@npm:4.8.7": - version: 4.8.7 - resolution: "@clerk/clerk-sdk-node@npm:4.8.7" +"@clerk/clerk-sdk-node@npm:4.9.1": + version: 4.9.1 + resolution: "@clerk/clerk-sdk-node@npm:4.9.1" dependencies: - "@clerk/backend": ^0.18.0 - "@clerk/types": ^3.36.0 + "@clerk/backend": ^0.19.1 + "@clerk/types": ^3.37.1 "@types/cookies": 0.7.7 "@types/express": 4.17.14 "@types/node-fetch": 2.6.2 @@ -2149,7 +2149,7 @@ __metadata: cookie: 0.5.0 snakecase-keys: 3.2.1 tslib: 2.4.1 - checksum: fb76c3b0285e8a66daca29fe85e0dc9c2e1d95584b34dedf82a66d97f0a59ad3928523f466e9bf674cabc77e17af5307cb81fd61650b72598c10fd18abeaa3e2 + checksum: 4ea96b2ee8360669ab4fbed41e8a296d6beea904c3368ea7ff4ab0ede3d557b3561e9c580b69eec431863a5ffc713f287b7fa64f2d9454bf6ef388de7e5d4ab5 languageName: node linkType: hard @@ -2162,7 +2162,7 @@ __metadata: languageName: node linkType: hard -"@clerk/types@npm:3.36.0, @clerk/types@npm:^3.36.0": +"@clerk/types@npm:3.36.0": version: 3.36.0 resolution: "@clerk/types@npm:3.36.0" dependencies: @@ -2171,6 +2171,15 @@ __metadata: languageName: node linkType: hard +"@clerk/types@npm:^3.36.0, @clerk/types@npm:^3.37.1": + version: 3.37.1 + resolution: "@clerk/types@npm:3.37.1" + dependencies: + csstype: 3.1.1 + checksum: 6ecf745a26c3f816ec92c03c9435d08fb3db73ecf234e91cbcd8c5ebd3935133bd8b9b8aa70dd6f7365e5808a6aba3b9acfab5a17b1e26ee97b97b35a26d4e05 + languageName: node + linkType: hard + "@cnakazawa/watch@npm:^1.0.3": version: 1.0.4 resolution: "@cnakazawa/watch@npm:1.0.4" @@ -6580,7 +6589,7 @@ __metadata: "@babel/cli": 7.21.5 "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 - "@clerk/clerk-sdk-node": 4.8.7 + "@clerk/clerk-sdk-node": 4.9.1 "@redwoodjs/api": 5.0.0 "@types/aws-lambda": 8.10.115 core-js: 3.30.2 From f4ac25293a3a01fc5a4b1dd890367ed7012c1eb4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 15:09:27 +0000 Subject: [PATCH 02/23] fix(deps): update dependency vite to v4.3.7 (#8338) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/vite/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/vite/package.json b/packages/vite/package.json index b7edd5250424..34763d1c3a42 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -31,7 +31,7 @@ "@vitejs/plugin-react": "4.0.0", "buffer": "6.0.3", "core-js": "3.30.2", - "vite": "4.3.5", + "vite": "4.3.7", "vite-plugin-commonjs": "0.6.2", "vite-plugin-environment": "1.1.3", "vite-plugin-html": "3.2.0" diff --git a/yarn.lock b/yarn.lock index 181cac8d0879..d79f723d25b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7571,7 +7571,7 @@ __metadata: glob: 10.2.4 jest: 29.5.0 typescript: 5.0.4 - vite: 4.3.5 + vite: 4.3.7 vite-plugin-commonjs: 0.6.2 vite-plugin-environment: 1.1.3 vite-plugin-html: 3.2.0 @@ -31976,9 +31976,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:4.3.5": - version: 4.3.5 - resolution: "vite@npm:4.3.5" +"vite@npm:4.3.7": + version: 4.3.7 + resolution: "vite@npm:4.3.7" dependencies: esbuild: ^0.17.5 fsevents: ~2.3.2 @@ -32009,7 +32009,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 56c5de4c6a4cb383492302173372be71c4e55a9eabc7268b6036152880800b7a85ee19be3d4c9f2cdd7af33df53c0153c58e6db402b08e8f6299a7b15fd53b88 + checksum: 7d148052419840dfc2b650309924f841d333dfcf5da10d839c9af715da45b1313a771dbb0356145db4aa827e86eb9f7673daffeca9a90d24eade2d4f70d5dad6 languageName: node linkType: hard From 39da062d10d40106a68a77dfbf0d07164f04ecb1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 10:30:47 -0700 Subject: [PATCH 03/23] fix(deps): update dependency @whatwg-node/fetch to v0.9.0 (#8344) --- packages/api/package.json | 2 +- packages/codemods/package.json | 2 +- packages/graphql-server/package.json | 2 +- packages/prerender/package.json | 2 +- packages/telemetry/package.json | 2 +- yarn.lock | 42 ++++++++++++++++++++++++---- 6 files changed, 41 insertions(+), 11 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index bf0b85fd441d..221b2d168d97 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -33,7 +33,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.21.5", "@prisma/client": "4.14.0", - "@whatwg-node/fetch": "0.8.8", + "@whatwg-node/fetch": "0.9.0", "core-js": "3.30.2", "humanize-string": "2.1.0", "jsonwebtoken": "9.0.0", diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 5ec3c8cbf200..a029890f9193 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -30,7 +30,7 @@ "@babel/traverse": "7.21.5", "@iarna/toml": "2.2.5", "@vscode/ripgrep": "1.15.3", - "@whatwg-node/fetch": "0.8.8", + "@whatwg-node/fetch": "0.9.0", "cheerio": "1.0.0-rc.12", "core-js": "3.30.2", "deepmerge": "4.3.1", diff --git a/packages/graphql-server/package.json b/packages/graphql-server/package.json index 599ae113f50f..ee3ed1a1c737 100644 --- a/packages/graphql-server/package.json +++ b/packages/graphql-server/package.json @@ -53,7 +53,7 @@ "@types/lodash.merge": "4.6.7", "@types/lodash.omitby": "4.6.7", "@types/uuid": "9.0.1", - "@whatwg-node/fetch": "0.8.8", + "@whatwg-node/fetch": "0.9.0", "aws-lambda": "1.0.7", "jest": "29.5.0", "jsonwebtoken": "9.0.0", diff --git a/packages/prerender/package.json b/packages/prerender/package.json index 4ff1f0c3c3f9..fd11d4156773 100644 --- a/packages/prerender/package.json +++ b/packages/prerender/package.json @@ -31,7 +31,7 @@ "@redwoodjs/router": "5.0.0", "@redwoodjs/structure": "5.0.0", "@redwoodjs/web": "5.0.0", - "@whatwg-node/fetch": "0.8.8", + "@whatwg-node/fetch": "0.9.0", "babel-plugin-ignore-html-and-css-imports": "0.1.0", "cheerio": "1.0.0-rc.12", "core-js": "3.30.2", diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index 227afc4a573d..03caff9a3bc1 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -29,7 +29,7 @@ "@babel/runtime-corejs3": "7.21.5", "@redwoodjs/project-config": "5.0.0", "@redwoodjs/structure": "5.0.0", - "@whatwg-node/fetch": "0.8.8", + "@whatwg-node/fetch": "0.9.0", "ci-info": "3.8.0", "core-js": "3.30.2", "envinfo": "7.8.1", diff --git a/yarn.lock b/yarn.lock index d79f723d25b2..3b4ab7494bb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6449,7 +6449,7 @@ __metadata: "@types/memjs": 1 "@types/pascalcase": 1.0.1 "@types/split2": 4.2.0 - "@whatwg-node/fetch": 0.8.8 + "@whatwg-node/fetch": 0.9.0 core-js: 3.30.2 humanize-string: 2.1.0 jest: 29.5.0 @@ -7038,7 +7038,7 @@ __metadata: "@types/prettier": 2.7.2 "@types/yargs": 17.0.24 "@vscode/ripgrep": 1.15.3 - "@whatwg-node/fetch": 0.8.8 + "@whatwg-node/fetch": 0.9.0 cheerio: 1.0.0-rc.12 core-js: 3.30.2 deepmerge: 4.3.1 @@ -7237,7 +7237,7 @@ __metadata: "@types/lodash.merge": 4.6.7 "@types/lodash.omitby": 4.6.7 "@types/uuid": 9.0.1 - "@whatwg-node/fetch": 0.8.8 + "@whatwg-node/fetch": 0.9.0 aws-lambda: 1.0.7 core-js: 3.30.2 graphql: 16.6.0 @@ -7320,7 +7320,7 @@ __metadata: "@redwoodjs/structure": 5.0.0 "@redwoodjs/web": 5.0.0 "@types/mime-types": 2.1.1 - "@whatwg-node/fetch": 0.8.8 + "@whatwg-node/fetch": 0.9.0 babel-plugin-ignore-html-and-css-imports: 0.1.0 babel-plugin-tester: 11.0.4 cheerio: 1.0.0-rc.12 @@ -7489,7 +7489,7 @@ __metadata: "@types/envinfo": 7.8.1 "@types/uuid": 9.0.1 "@types/yargs": 17.0.24 - "@whatwg-node/fetch": 0.8.8 + "@whatwg-node/fetch": 0.9.0 ci-info: 3.8.0 core-js: 3.30.2 envinfo: 7.8.1 @@ -10871,7 +10871,24 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/fetch@npm:0.8.8, @whatwg-node/fetch@npm:^0.8.0, @whatwg-node/fetch@npm:^0.8.1, @whatwg-node/fetch@npm:^0.8.2, @whatwg-node/fetch@npm:^0.8.4": +"@whatwg-node/events@npm:^0.1.0": + version: 0.1.0 + resolution: "@whatwg-node/events@npm:0.1.0" + checksum: 6fbd1ce0d08fb61193390654d77ddc728cf955f664858d87d1de6bbb8ce8ca3bd424575d6979d864831a89790087a8521f403fa8ec3a81360e3c335f663b4e32 + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:0.9.0": + version: 0.9.0 + resolution: "@whatwg-node/fetch@npm:0.9.0" + dependencies: + "@whatwg-node/node-fetch": ^0.4.0 + urlpattern-polyfill: ^8.0.0 + checksum: ca050f1f8e24e88ad37d84f7307fe116cf973ecc4691707490214b7b8d17355cd4dc0c02811255d015ce57381f0505443647dd12e800dd46f8205c84ac5487bc + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:^0.8.0, @whatwg-node/fetch@npm:^0.8.1, @whatwg-node/fetch@npm:^0.8.2, @whatwg-node/fetch@npm:^0.8.4": version: 0.8.8 resolution: "@whatwg-node/fetch@npm:0.8.8" dependencies: @@ -10897,6 +10914,19 @@ __metadata: languageName: node linkType: hard +"@whatwg-node/node-fetch@npm:^0.4.0": + version: 0.4.0 + resolution: "@whatwg-node/node-fetch@npm:0.4.0" + dependencies: + "@whatwg-node/events": ^0.1.0 + busboy: ^1.6.0 + fast-querystring: ^1.1.1 + fast-url-parser: ^1.1.3 + tslib: ^2.3.1 + checksum: d08bbd46fcaf505e22782acfca12d68ce7d3edd7bb3b268851070fff98d7e3c5377a5ec47dd00fe2136141f21a8978ceee99c8cc7e2ba992521f10199ca550f9 + languageName: node + linkType: hard + "@whatwg-node/server@npm:^0.7.3": version: 0.7.4 resolution: "@whatwg-node/server@npm:0.7.4" From 8783e5907599961a6965ad3bd6231e1117f5a53e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 10:31:24 -0700 Subject: [PATCH 04/23] chore(deps): update dependency nx to v16.2.1 (#8343) --- package.json | 2 +- yarn.lock | 94 ++++++++++++++++++++++++++-------------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index d61e869d63e2..cced9f10dcdb 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "ncp": "2.0.0", "nodemon": "2.0.22", "npm-packlist": "7.0.4", - "nx": "16.1.4", + "nx": "16.2.1", "nx-cloud": "16.0.5", "octokit": "2.0.14", "ora": "5.4.1", diff --git a/yarn.lock b/yarn.lock index 3b4ab7494bb9..a9f42003c431 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5276,76 +5276,76 @@ __metadata: languageName: node linkType: hard -"@nrwl/tao@npm:16.1.4": - version: 16.1.4 - resolution: "@nrwl/tao@npm:16.1.4" +"@nrwl/tao@npm:16.2.1": + version: 16.2.1 + resolution: "@nrwl/tao@npm:16.2.1" dependencies: - nx: 16.1.4 + nx: 16.2.1 bin: tao: index.js - checksum: 6ab1acd633b1bf1c53a9e7580f4a1bd9e91e651fe15b8e2823b338dab346a508e427f025b086b478d53120552aac4c59c59636b877dd0c0f7fd5f0d8d2e939d1 + checksum: a11a1da116a776df20c9eb784310f9d3e48b4edcd1e46482c73b64d7653a92f65833eaf3626fb500518f3bae66610aa15b1ee3bcb16def3170dcb98594cc4c3f languageName: node linkType: hard -"@nx/nx-darwin-arm64@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-darwin-arm64@npm:16.1.4" +"@nx/nx-darwin-arm64@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-darwin-arm64@npm:16.2.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@nx/nx-darwin-x64@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-darwin-x64@npm:16.1.4" +"@nx/nx-darwin-x64@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-darwin-x64@npm:16.2.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@nx/nx-linux-arm-gnueabihf@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-linux-arm-gnueabihf@npm:16.1.4" +"@nx/nx-linux-arm-gnueabihf@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:16.2.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@nx/nx-linux-arm64-gnu@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-linux-arm64-gnu@npm:16.1.4" +"@nx/nx-linux-arm64-gnu@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-linux-arm64-gnu@npm:16.2.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-arm64-musl@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-linux-arm64-musl@npm:16.1.4" +"@nx/nx-linux-arm64-musl@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-linux-arm64-musl@npm:16.2.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@nx/nx-linux-x64-gnu@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-linux-x64-gnu@npm:16.1.4" +"@nx/nx-linux-x64-gnu@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-linux-x64-gnu@npm:16.2.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-x64-musl@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-linux-x64-musl@npm:16.1.4" +"@nx/nx-linux-x64-musl@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-linux-x64-musl@npm:16.2.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@nx/nx-win32-arm64-msvc@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-win32-arm64-msvc@npm:16.1.4" +"@nx/nx-win32-arm64-msvc@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-win32-arm64-msvc@npm:16.2.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@nx/nx-win32-x64-msvc@npm:16.1.4": - version: 16.1.4 - resolution: "@nx/nx-win32-x64-msvc@npm:16.1.4" +"@nx/nx-win32-x64-msvc@npm:16.2.1": + version: 16.2.1 + resolution: "@nx/nx-win32-x64-msvc@npm:16.2.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -24876,20 +24876,20 @@ __metadata: languageName: node linkType: hard -"nx@npm:16.1.4": - version: 16.1.4 - resolution: "nx@npm:16.1.4" +"nx@npm:16.2.1": + version: 16.2.1 + resolution: "nx@npm:16.2.1" dependencies: - "@nrwl/tao": 16.1.4 - "@nx/nx-darwin-arm64": 16.1.4 - "@nx/nx-darwin-x64": 16.1.4 - "@nx/nx-linux-arm-gnueabihf": 16.1.4 - "@nx/nx-linux-arm64-gnu": 16.1.4 - "@nx/nx-linux-arm64-musl": 16.1.4 - "@nx/nx-linux-x64-gnu": 16.1.4 - "@nx/nx-linux-x64-musl": 16.1.4 - "@nx/nx-win32-arm64-msvc": 16.1.4 - "@nx/nx-win32-x64-msvc": 16.1.4 + "@nrwl/tao": 16.2.1 + "@nx/nx-darwin-arm64": 16.2.1 + "@nx/nx-darwin-x64": 16.2.1 + "@nx/nx-linux-arm-gnueabihf": 16.2.1 + "@nx/nx-linux-arm64-gnu": 16.2.1 + "@nx/nx-linux-arm64-musl": 16.2.1 + "@nx/nx-linux-x64-gnu": 16.2.1 + "@nx/nx-linux-x64-musl": 16.2.1 + "@nx/nx-win32-arm64-msvc": 16.2.1 + "@nx/nx-win32-x64-msvc": 16.2.1 "@parcel/watcher": 2.0.4 "@yarnpkg/lockfile": ^1.1.0 "@yarnpkg/parsers": ^3.0.0-rc.18 @@ -24952,7 +24952,7 @@ __metadata: optional: true bin: nx: bin/nx.js - checksum: 2c291bbf771de5a3c98bbe1707f699ca58fad109ed29a7f96a61ce415acd024f37a723a98894c6517e3bf17f9b476973fbce51fff9f3b494cbf72dd821827270 + checksum: a6d78686dea2cb72d84d06dc1feed0dc0e07080c607c78939c1083b7a05cc9d30514016aa79dc584fd54dffa0612c7051666ddb7fb1ddf4e7373f0515f7ed6f6 languageName: node linkType: hard @@ -28432,7 +28432,7 @@ __metadata: ncp: 2.0.0 nodemon: 2.0.22 npm-packlist: 7.0.4 - nx: 16.1.4 + nx: 16.2.1 nx-cloud: 16.0.5 octokit: 2.0.14 ora: 5.4.1 From 32d79176dbde4410e71b446372c7ee9c81d89cf3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 10:32:06 -0700 Subject: [PATCH 05/23] chore(deps): update dependency @clerk/types to v3.38.0 (#8325) --- .../auth-providers/clerk/web/package.json | 2 +- yarn.lock | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/packages/auth-providers/clerk/web/package.json b/packages/auth-providers/clerk/web/package.json index 6a6e33ed1462..da81bde0da53 100644 --- a/packages/auth-providers/clerk/web/package.json +++ b/packages/auth-providers/clerk/web/package.json @@ -30,7 +30,7 @@ "@babel/cli": "7.21.5", "@babel/core": "7.21.8", "@clerk/clerk-react": "4.15.4", - "@clerk/types": "3.36.0", + "@clerk/types": "3.38.0", "@types/react": "18.2.6", "jest": "29.5.0", "react": "18.2.0", diff --git a/yarn.lock b/yarn.lock index a9f42003c431..e6c1ee96a203 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2162,21 +2162,12 @@ __metadata: languageName: node linkType: hard -"@clerk/types@npm:3.36.0": - version: 3.36.0 - resolution: "@clerk/types@npm:3.36.0" +"@clerk/types@npm:3.38.0, @clerk/types@npm:^3.36.0, @clerk/types@npm:^3.37.1": + version: 3.38.0 + resolution: "@clerk/types@npm:3.38.0" dependencies: csstype: 3.1.1 - checksum: 365fe33449ef0d3f124f76b96cfa97b08d5621809f7cc829092511aa04c739e737c15bf9741edb23709dadca91348327c269186812039f68ea2d1ec159ec0d5c - languageName: node - linkType: hard - -"@clerk/types@npm:^3.36.0, @clerk/types@npm:^3.37.1": - version: 3.37.1 - resolution: "@clerk/types@npm:3.37.1" - dependencies: - csstype: 3.1.1 - checksum: 6ecf745a26c3f816ec92c03c9435d08fb3db73ecf234e91cbcd8c5ebd3935133bd8b9b8aa70dd6f7365e5808a6aba3b9acfab5a17b1e26ee97b97b35a26d4e05 + checksum: 7611703cd9dbfe2bc03fbc97ca1470c807d4cd8fff4ed3bc7af8cb9ff3f6b83ea578b24ba94fff16107c9e250399cceec5370e6969c2d19489a7b7549675bc7a languageName: node linkType: hard @@ -6621,7 +6612,7 @@ __metadata: "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 "@clerk/clerk-react": 4.15.4 - "@clerk/types": 3.36.0 + "@clerk/types": 3.38.0 "@redwoodjs/auth": 5.0.0 "@types/react": 18.2.6 core-js: 3.30.2 From 8396ea6bfa648f8b8edf7ffef275650d9e096a9a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 10:35:55 -0700 Subject: [PATCH 06/23] chore(deps): update dependency @clerk/clerk-react to v4.16.1 (#8324) --- .../auth-providers/clerk/web/package.json | 4 +- yarn.lock | 42 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/auth-providers/clerk/web/package.json b/packages/auth-providers/clerk/web/package.json index da81bde0da53..da5bbd37fe7b 100644 --- a/packages/auth-providers/clerk/web/package.json +++ b/packages/auth-providers/clerk/web/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@babel/cli": "7.21.5", "@babel/core": "7.21.8", - "@clerk/clerk-react": "4.15.4", + "@clerk/clerk-react": "4.16.1", "@clerk/types": "3.38.0", "@types/react": "18.2.6", "jest": "29.5.0", @@ -37,7 +37,7 @@ "typescript": "5.0.4" }, "peerDependencies": { - "@clerk/clerk-react": "4.15.4" + "@clerk/clerk-react": "4.16.1" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" } diff --git a/yarn.lock b/yarn.lock index e6c1ee96a203..f5d33aef5e29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2122,17 +2122,17 @@ __metadata: languageName: node linkType: hard -"@clerk/clerk-react@npm:4.15.4": - version: 4.15.4 - resolution: "@clerk/clerk-react@npm:4.15.4" +"@clerk/clerk-react@npm:4.16.1": + version: 4.16.1 + resolution: "@clerk/clerk-react@npm:4.16.1" dependencies: - "@clerk/shared": ^0.15.7 - "@clerk/types": ^3.36.0 + "@clerk/shared": ^0.16.1 + "@clerk/types": ^3.37.1 swr: 1.3.0 tslib: 2.4.1 peerDependencies: react: ">=16" - checksum: 73bf3ec599ca6470ea8a9e1a9cff6501781c3480dca3ec5c0a84bf1dea108568838a00d1b849f5ffb38eef3969316f8275dcd4a60eedab078b7f1271fc5a1926 + checksum: 1288c8fe4aa70af6685b61770e6d443affbe16084cbe13598c45e009f8481181e12e8bb1df858cc445b30c0c34e91195e5bbd6db7678e040353fbd468617e744 languageName: node linkType: hard @@ -2153,16 +2153,18 @@ __metadata: languageName: node linkType: hard -"@clerk/shared@npm:^0.15.7": - version: 0.15.7 - resolution: "@clerk/shared@npm:0.15.7" +"@clerk/shared@npm:^0.16.1": + version: 0.16.1 + resolution: "@clerk/shared@npm:0.16.1" + dependencies: + glob-to-regexp: 0.4.1 peerDependencies: react: ">=16" - checksum: 555abc739a2d6e7508de2a28a9cda07c6a7d030df358119d3cb308af067fd28c93c59b694fa9b7284b8f102e83d98d38ac37e204e77e3207e1c47fb801c9b974 + checksum: 5818970f52ec99cea3ca15379a2a103ebd64a67d29add79adbcc76a091c2b97608f5ad2352721d65b2f67519d44ffa52b13a1e12d7a5254a4f6daa7b455de213 languageName: node linkType: hard -"@clerk/types@npm:3.38.0, @clerk/types@npm:^3.36.0, @clerk/types@npm:^3.37.1": +"@clerk/types@npm:3.38.0, @clerk/types@npm:^3.37.1": version: 3.38.0 resolution: "@clerk/types@npm:3.38.0" dependencies: @@ -6611,7 +6613,7 @@ __metadata: "@babel/cli": 7.21.5 "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 - "@clerk/clerk-react": 4.15.4 + "@clerk/clerk-react": 4.16.1 "@clerk/types": 3.38.0 "@redwoodjs/auth": 5.0.0 "@types/react": 18.2.6 @@ -6620,7 +6622,7 @@ __metadata: react: 18.2.0 typescript: 5.0.4 peerDependencies: - "@clerk/clerk-react": 4.15.4 + "@clerk/clerk-react": 4.16.1 languageName: unknown linkType: soft @@ -18620,6 +18622,13 @@ __metadata: languageName: node linkType: hard +"glob-to-regexp@npm:0.4.1, glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.3.0": version: 0.3.0 resolution: "glob-to-regexp@npm:0.3.0" @@ -18627,13 +18636,6 @@ __metadata: languageName: node linkType: hard -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - "glob@npm:10.2.4, glob@npm:^10.0.0": version: 10.2.4 resolution: "glob@npm:10.2.4" From 88f68ef867db29327c0848f9bed5e89435775683 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 10:42:05 -0700 Subject: [PATCH 07/23] chore(deps): update dependency dependency-cruiser to v13 (#8322) --- packages/project-config/package.json | 2 +- yarn.lock | 134 ++++++++++++++------------- 2 files changed, 73 insertions(+), 63 deletions(-) diff --git a/packages/project-config/package.json b/packages/project-config/package.json index 0191f1ae2129..556d834daf39 100644 --- a/packages/project-config/package.json +++ b/packages/project-config/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@types/findup-sync": "4.0.2", - "dependency-cruiser": "12.12.2", + "dependency-cruiser": "13.0.1", "jest": "29.5.0", "rimraf": "5.0.0", "typescript": "5.0.4" diff --git a/yarn.lock b/yarn.lock index f5d33aef5e29..74eb3498604d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7335,7 +7335,7 @@ __metadata: "@iarna/toml": 2.2.5 "@types/findup-sync": 4.0.2 deepmerge: 4.3.1 - dependency-cruiser: 12.12.2 + dependency-cruiser: 13.0.1 fast-glob: 3.2.12 findup-sync: 5.0.0 jest: 29.5.0 @@ -13419,6 +13419,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:5.2.0, chalk@npm:^5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 8a519b35c239f96e041b7f1ed8fdd79d3ca2332a8366cb957378b8a1b8a4cdfb740d19628e8bf74654d4c0917aa10cf39c20752e177a1304eac29a1168a740e9 + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -13440,13 +13447,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.2.0": - version: 5.2.0 - resolution: "chalk@npm:5.2.0" - checksum: 8a519b35c239f96e041b7f1ed8fdd79d3ca2332a8366cb957378b8a1b8a4cdfb740d19628e8bf74654d4c0917aa10cf39c20752e177a1304eac29a1168a740e9 - languageName: node - linkType: hard - "change-case-all@npm:1.0.14": version: 1.0.14 resolution: "change-case-all@npm:1.0.14" @@ -15583,9 +15583,9 @@ __metadata: languageName: node linkType: hard -"dependency-cruiser@npm:12.12.2": - version: 12.12.2 - resolution: "dependency-cruiser@npm:12.12.2" +"dependency-cruiser@npm:13.0.1": + version: 13.0.1 + resolution: "dependency-cruiser@npm:13.0.1" dependencies: acorn: 8.8.2 acorn-jsx: 5.3.2 @@ -15593,15 +15593,15 @@ __metadata: acorn-loose: 8.3.0 acorn-walk: 8.2.0 ajv: 8.12.0 - chalk: ^4.1.2 + chalk: 5.2.0 commander: 10.0.1 enhanced-resolve: 5.14.0 - figures: ^3.2.0 + figures: 5.0.0 get-stream: ^6.0.1 - glob: 7.2.0 + glob: 10.2.4 handlebars: 4.7.7 ignore: 5.2.4 - indent-string: ^4.0.0 + indent-string: 5.0.0 interpret: ^3.1.1 is-installed-globally: 0.4.0 json5: 2.2.3 @@ -15609,20 +15609,20 @@ __metadata: prompts: 2.4.2 rechoir: ^0.8.0 safe-regex: 2.1.1 - semver: ^7.3.7 + semver: ^7.5.1 semver-try-require: 6.2.2 teamcity-service-messages: 0.1.14 tsconfig-paths-webpack-plugin: 4.0.1 - watskeburt: 0.11.1 - wrap-ansi: ^7.0.0 + watskeburt: 0.11.2 + wrap-ansi: 8.1.0 bin: - depcruise: bin/dependency-cruise.js - depcruise-baseline: bin/depcruise-baseline.js - depcruise-fmt: bin/depcruise-fmt.js - depcruise-wrap-stream-in-html: bin/wrap-stream-in-html.js - dependency-cruise: bin/dependency-cruise.js - dependency-cruiser: bin/dependency-cruise.js - checksum: 205d5ed363eb126f1a5405590a583f639ca6d60f220e56d1bdcb08f9c275ac51a2cef1eb7a88210535ff4305d18d34668a8e756af97e859aa831d32375470e78 + depcruise: bin/dependency-cruise.mjs + depcruise-baseline: bin/depcruise-baseline.mjs + depcruise-fmt: bin/depcruise-fmt.mjs + depcruise-wrap-stream-in-html: bin/wrap-stream-in-html.mjs + dependency-cruise: bin/dependency-cruise.mjs + dependency-cruiser: bin/dependency-cruise.mjs + checksum: 3b0765d0f4825ce8d5d8e30e30b5ca62bac32af4ed023002979259e6a463fc52e9d1353fd5d366fb4ba59b00ada0a5535c395b49383bc5553d469fe7751b3310 languageName: node linkType: hard @@ -16585,6 +16585,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + "escodegen@npm:^2.0.0": version: 2.0.0 resolution: "escodegen@npm:2.0.0" @@ -17590,6 +17597,16 @@ __metadata: languageName: node linkType: hard +"figures@npm:5.0.0": + version: 5.0.0 + resolution: "figures@npm:5.0.0" + dependencies: + escape-string-regexp: ^5.0.0 + is-unicode-supported: ^1.2.0 + checksum: ce0f17d4ea8b0fc429c5207c343534a2f5284ecfb22aa08607da7dc84ed9e1cf754f5b97760e8dcb98d3c9d1a1e4d3d578fe3b5b99c426f05d0f06c7ba618e16 + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -18665,20 +18682,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 478b40e38be5a3d514e64950e1e07e0ac120585add6a37c98d0ed24d72d9127d734d2a125786073c8deb687096e84ae82b641c441a869ada3a9cc91b68978632 - languageName: node - linkType: hard - "glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -19884,6 +19887,13 @@ __metadata: languageName: node linkType: hard +"indent-string@npm:5.0.0, indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 + languageName: node + linkType: hard + "indent-string@npm:^2.1.0": version: 2.1.0 resolution: "indent-string@npm:2.1.0" @@ -19893,13 +19903,6 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^5.0.0": - version: 5.0.0 - resolution: "indent-string@npm:5.0.0" - checksum: 8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 - languageName: node - linkType: hard - "infer-owner@npm:^1.0.3, infer-owner@npm:^1.0.4": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" @@ -20749,6 +20752,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^1.2.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + "is-upper-case@npm:^2.0.2": version: 2.0.2 resolution: "is-upper-case@npm:2.0.2" @@ -28753,7 +28763,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.5.1, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": +"semver@npm:7.5.1, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.1": version: 7.5.1 resolution: "semver@npm:7.5.1" dependencies: @@ -32153,14 +32163,14 @@ __metadata: languageName: node linkType: hard -"watskeburt@npm:0.11.1": - version: 0.11.1 - resolution: "watskeburt@npm:0.11.1" +"watskeburt@npm:0.11.2": + version: 0.11.2 + resolution: "watskeburt@npm:0.11.2" dependencies: commander: 10.0.1 bin: watskeburt: bin/cli.js - checksum: f5c1e454cfeb04407e4c112710f70f2b6affc5ef848365de49b2dc7d3d9743aa2c86bb07c7d8f13d59ac6107fffbd905a4d11d25347ebf43a956029dbeac95cc + checksum: 4001673995b52fd9009301f3a5b65c15328fda4e12c5e1f8a18b71595ad30ca277cc3a081817af9a9c0ffe2c06cc200641cc1caaeed1dd18b156c92916908b37 languageName: node linkType: hard @@ -32782,6 +32792,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:8.1.0, wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + "wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -32804,17 +32825,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" From 02c815eee271614cab874778efa3d7965c9ac94e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:01:49 -0700 Subject: [PATCH 08/23] fix(deps): update dependency webpack to v5.83.1 (#8348) * fix(deps): update dependency webpack to v5.83.0 * upgrade to v5.83.1 * dedupe --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Dominic Saadi --- packages/core/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 9fe92a3a1aae..0045c956f527 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -79,7 +79,7 @@ "style-loader": "3.3.2", "typescript": "5.0.4", "url-loader": "4.1.1", - "webpack": "5.82.1", + "webpack": "5.83.1", "webpack-bundle-analyzer": "4.8.0", "webpack-cli": "5.1.1", "webpack-dev-server": "4.15.0", diff --git a/yarn.lock b/yarn.lock index 74eb3498604d..effb3508220d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7102,7 +7102,7 @@ __metadata: style-loader: 3.3.2 typescript: 5.0.4 url-loader: 4.1.1 - webpack: 5.82.1 + webpack: 5.83.1 webpack-bundle-analyzer: 4.8.0 webpack-cli: 5.1.1 webpack-dev-server: 4.15.0 @@ -32535,9 +32535,9 @@ __metadata: languageName: node linkType: hard -"webpack@npm:5.82.1, webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5, webpack@npm:^5.9.0": - version: 5.82.1 - resolution: "webpack@npm:5.82.1" +"webpack@npm:5.83.1, webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5, webpack@npm:^5.9.0": + version: 5.83.1 + resolution: "webpack@npm:5.83.1" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^1.0.0 @@ -32568,7 +32568,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 8583c71f30af348d16b63b8c2112653445063351b8bebd6033451a3bcf89176c1aec45fcd0f5a048e429e78004b79bb76d1a19f6e166d5bd802306a2df19b725 + checksum: 5a3b12776dd4fbc73c757762d100781c97e2edf70b574a29653613a3b89b447d55ec534419c52bc6aeb78a77c432f5106f01af5742fbc2fe9cd8533bcffcedcd languageName: node linkType: hard From f82dfb9c1f8baa2c2599bfbae378d801e3edc905 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:28:39 -0700 Subject: [PATCH 09/23] fix(deps): update prisma monorepo to v4.14.1 (#8346) --- packages/api/package.json | 2 +- packages/cli/package.json | 4 +- packages/record/package.json | 4 +- packages/structure/package.json | 2 +- yarn.lock | 106 ++++++++++++++++---------------- 5 files changed, 59 insertions(+), 59 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 221b2d168d97..464fa15b3211 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.21.5", - "@prisma/client": "4.14.0", + "@prisma/client": "4.14.1", "@whatwg-node/fetch": "0.9.0", "core-js": "3.30.2", "humanize-string": "2.1.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 9e110719f952..3414653e236f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -30,7 +30,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.21.5", "@iarna/toml": "2.2.5", - "@prisma/internals": "4.14.0", + "@prisma/internals": "4.14.1", "@redwoodjs/api-server": "5.0.0", "@redwoodjs/cli-helpers": "5.0.0", "@redwoodjs/fastify": "5.0.0", @@ -65,7 +65,7 @@ "pluralize": "8.0.0", "portfinder": "1.0.32", "prettier": "2.8.8", - "prisma": "4.14.0", + "prisma": "4.14.1", "prompts": "2.4.2", "rimraf": "5.0.0", "secure-random-password": "0.2.3", diff --git a/packages/record/package.json b/packages/record/package.json index 4a233c7051aa..714e214b4278 100644 --- a/packages/record/package.json +++ b/packages/record/package.json @@ -28,14 +28,14 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.21.5", - "@prisma/client": "4.14.0", + "@prisma/client": "4.14.1", "@redwoodjs/project-config": "5.0.0", "core-js": "3.30.2" }, "devDependencies": { "@babel/cli": "7.21.5", "@babel/core": "7.21.8", - "@prisma/internals": "4.14.0", + "@prisma/internals": "4.14.1", "esbuild": "0.17.19", "jest": "29.5.0" }, diff --git a/packages/structure/package.json b/packages/structure/package.json index 07dc50ce723a..c5aec8fa82ca 100644 --- a/packages/structure/package.json +++ b/packages/structure/package.json @@ -32,7 +32,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.21.5", "@iarna/toml": "2.2.5", - "@prisma/internals": "4.14.0", + "@prisma/internals": "4.14.1", "@redwoodjs/project-config": "5.0.0", "@types/line-column": "1.0.0", "camelcase": "6.3.0", diff --git a/yarn.lock b/yarn.lock index effb3508220d..d39001e7bc07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6080,9 +6080,9 @@ __metadata: languageName: node linkType: hard -"@prisma/client@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/client@npm:4.14.0" +"@prisma/client@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/client@npm:4.14.1" dependencies: "@prisma/engines-version": 4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c peerDependencies: @@ -6090,18 +6090,18 @@ __metadata: peerDependenciesMeta: prisma: optional: true - checksum: b3e42f108014de18e1049bcdce8772771abe0c6856e928df489cdea3bf850471853169175e4a5b2a7441357f69d69472391aaa4a1397add81d54d93663327022 + checksum: 94ca39d2303a68255c145d4035572611fe3470d0aa8f1ee6b76a142cb7110b6d320a0f4354ebd9a338e14fe8f4fdc0ab1675cb8d3990e882a2352b039fb9fb52 languageName: node linkType: hard -"@prisma/debug@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/debug@npm:4.14.0" +"@prisma/debug@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/debug@npm:4.14.1" dependencies: "@types/debug": 4.1.7 debug: 4.3.4 strip-ansi: 6.0.1 - checksum: b702fbdf2a618e4ce667c69affb215bef370dae503c3fe149559c574b148595384489e1c9faa91d53d970fe545fe0c25a68fe97768992660cb76cb98d79b5a72 + checksum: 98bbefb702c41e1cdc4051d14dcd46c8fff4a9d203e415d56002d5198c577879492d463c0dd271980cdeca550c924f452469a2d55178b9d519b943f612ba4820 languageName: node linkType: hard @@ -6112,19 +6112,19 @@ __metadata: languageName: node linkType: hard -"@prisma/engines@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/engines@npm:4.14.0" - checksum: 60b6acd0efba0aa8d536901b3a2667ed22a42bec686e5f8e59ffa80aa08ae0ff0e5a277b4e70e6872ba69481fe68673c15773d7999a433e8a7bebed6c8a48a4c +"@prisma/engines@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/engines@npm:4.14.1" + checksum: b94da89d7d20708b62ed70c78c6260e3fceb4123daa586938e50ae9d180df032138ebd01164a48974c614b42e5a4faa542eb425fb3d77df3251e86492fcb8e3f languageName: node linkType: hard -"@prisma/fetch-engine@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/fetch-engine@npm:4.14.0" +"@prisma/fetch-engine@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/fetch-engine@npm:4.14.1" dependencies: - "@prisma/debug": 4.14.0 - "@prisma/get-platform": 4.14.0 + "@prisma/debug": 4.14.1 + "@prisma/get-platform": 4.14.1 execa: 5.1.1 find-cache-dir: 3.3.2 fs-extra: 11.1.1 @@ -6140,27 +6140,27 @@ __metadata: rimraf: 3.0.2 temp-dir: 2.0.0 tempy: 1.0.1 - checksum: e504702b15a4b10f2624b583f8834384cd12a1c03878715a81e9a01572ffc9d877a246755a56f19ac110866cec664aac422c3d20622cd8701121e217ed729c00 + checksum: 4247ed6419b234e1d5fda5c1ee85b08319e352e3544de9d91130afbc55b3d20bf36f3cdb26724fda7632a395b866413bc5dd22701d3ea1204999c0350fb86ffc languageName: node linkType: hard -"@prisma/generator-helper@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/generator-helper@npm:4.14.0" +"@prisma/generator-helper@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/generator-helper@npm:4.14.1" dependencies: - "@prisma/debug": 4.14.0 + "@prisma/debug": 4.14.1 "@types/cross-spawn": 6.0.2 cross-spawn: 7.0.3 kleur: 4.1.5 - checksum: dd94327d4c6a1aa51d9aaf931e09d36ec16fb0a07a481720796d113ffa48eb6ff9cc97a79788869ee0c916002979ff4dcbeba9f19bae07383cab799fd7d78592 + checksum: 576ace1e4ec348855d631b9f41d425f8fe85dc19157c09f335fd329185822b58385c05205d16cf54dc072f10b9bfb86f3a450c7b8649cb96c7e18208aad49a8d languageName: node linkType: hard -"@prisma/get-platform@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/get-platform@npm:4.14.0" +"@prisma/get-platform@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/get-platform@npm:4.14.1" dependencies: - "@prisma/debug": 4.14.0 + "@prisma/debug": 4.14.1 escape-string-regexp: 4.0.0 execa: 5.1.1 fs-jetpack: 5.1.0 @@ -6170,21 +6170,21 @@ __metadata: tempy: 1.0.1 terminal-link: 2.1.1 ts-pattern: 4.2.2 - checksum: 0cad531cf01dc5fd3bf9406e0d63e510ab581cd324fc5af4fe48b348e68d2426eb4ce494382f81b733d8485a1977fec56d6cc05019a5251b7855a745439367c5 + checksum: fed734e7550df794cce8d5567e905b55b69bab50b76aba8b0345361ac87e4f374d95ef9cc152165bb96f9db7ec3857767bd0fb28e9679e31f2197b4d80fea9c4 languageName: node linkType: hard -"@prisma/internals@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/internals@npm:4.14.0" +"@prisma/internals@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/internals@npm:4.14.1" dependencies: "@opentelemetry/api": 1.4.1 - "@prisma/debug": 4.14.0 - "@prisma/engines": 4.14.0 - "@prisma/fetch-engine": 4.14.0 - "@prisma/generator-helper": 4.14.0 - "@prisma/get-platform": 4.14.0 - "@prisma/ni": 4.14.0 + "@prisma/debug": 4.14.1 + "@prisma/engines": 4.14.1 + "@prisma/fetch-engine": 4.14.1 + "@prisma/generator-helper": 4.14.1 + "@prisma/get-platform": 4.14.1 + "@prisma/ni": 4.14.1 "@prisma/prisma-fmt-wasm": 4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c archiver: 5.3.1 arg: 5.0.2 @@ -6221,14 +6221,14 @@ __metadata: terminal-link: 2.1.1 tmp: 0.2.1 ts-pattern: 4.2.2 - checksum: 66dc72454c5d98552f8953bdbe5b3e05f6a8b03dc55e7e0d1c4f494c11cdeab01429786538f5992b520281b402ff33eeb5d0aa962fcf66d17f57349e62558178 + checksum: fe883fbf93cea007b4d3a3a9af6fb10531b4168c2d47f3ac0b5015f7c49da00ecf442b63d521f8b771c496124b9c3635ad5a107dc04c726ab7465d5aae7886bf languageName: node linkType: hard -"@prisma/ni@npm:4.14.0": - version: 4.14.0 - resolution: "@prisma/ni@npm:4.14.0" - checksum: 125adb521b6ee7c2516776ab79e787da6fe90196ec4163f8001a90137bf7e38f587f338595899dc60c4d0b6b6420d850da65dd5aaa4266cfb128c710fef7d8b9 +"@prisma/ni@npm:4.14.1": + version: 4.14.1 + resolution: "@prisma/ni@npm:4.14.1" + checksum: 2110299b7b7284074b22db3b52c162c8cf5bfea9bab44a87715b92eee2d51deb527915020f5c89820729cace027e2f6e299153569b8f36f0044b1e1a0febc2b5 languageName: node linkType: hard @@ -6436,7 +6436,7 @@ __metadata: "@babel/cli": 7.21.5 "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 - "@prisma/client": 4.14.0 + "@prisma/client": 4.14.1 "@types/aws-lambda": 8.10.115 "@types/jsonwebtoken": 9.0.2 "@types/memjs": 1 @@ -6957,7 +6957,7 @@ __metadata: "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 "@iarna/toml": 2.2.5 - "@prisma/internals": 4.14.0 + "@prisma/internals": 4.14.1 "@redwoodjs/api-server": 5.0.0 "@redwoodjs/cli-helpers": 5.0.0 "@redwoodjs/fastify": 5.0.0 @@ -6994,7 +6994,7 @@ __metadata: pluralize: 8.0.0 portfinder: 1.0.32 prettier: 2.8.8 - prisma: 4.14.0 + prisma: 4.14.1 prompts: 2.4.2 rimraf: 5.0.0 secure-random-password: 0.2.3 @@ -7352,8 +7352,8 @@ __metadata: "@babel/cli": 7.21.5 "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 - "@prisma/client": 4.14.0 - "@prisma/internals": 4.14.0 + "@prisma/client": 4.14.1 + "@prisma/internals": 4.14.1 "@redwoodjs/project-config": 5.0.0 core-js: 3.30.2 esbuild: 0.17.19 @@ -7391,7 +7391,7 @@ __metadata: "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 "@iarna/toml": 2.2.5 - "@prisma/internals": 4.14.0 + "@prisma/internals": 4.14.1 "@redwoodjs/project-config": 5.0.0 "@types/fs-extra": 11.0.1 "@types/line-column": 1.0.0 @@ -26728,15 +26728,15 @@ __metadata: languageName: node linkType: hard -"prisma@npm:4.14.0": - version: 4.14.0 - resolution: "prisma@npm:4.14.0" +"prisma@npm:4.14.1": + version: 4.14.1 + resolution: "prisma@npm:4.14.1" dependencies: - "@prisma/engines": 4.14.0 + "@prisma/engines": 4.14.1 bin: prisma: build/index.js prisma2: build/index.js - checksum: 17646e91f62d10fd27aea8bd846986c4704966546f89d36fc5150a15f8c1061eb200a2300b0b58e781c31fcfa0f7393b7bea0a0e2f6d3abc794ba041417b11f1 + checksum: 94b0429f1247d60fda49de20029dce8587ba5b82e2a2afc8fa73c42e625ab495dc13978a219c0e005285462947ae29c62d4d70fbb6adfd796abcd79452add3a2 languageName: node linkType: hard From 80461b1a5afe213d143a761f136c22761b18b383 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:29:01 -0700 Subject: [PATCH 10/23] fix(deps): update dependency react-router-dom to v6.11.2 (#8345) --- packages/studio/frontend/yarn.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/studio/frontend/yarn.lock b/packages/studio/frontend/yarn.lock index 4543a9bd46c7..18f512686092 100644 --- a/packages/studio/frontend/yarn.lock +++ b/packages/studio/frontend/yarn.lock @@ -1180,10 +1180,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.6.1": - version: 1.6.1 - resolution: "@remix-run/router@npm:1.6.1" - checksum: 6d6dad1b6a06171d5d8549eca7cd7ef332a40987b732829e48993d55b3c7a7ca661c7d891be938055a42a4b18f07b5f2b66295c89cb221464eda2678ac41621e +"@remix-run/router@npm:1.6.2": + version: 1.6.2 + resolution: "@remix-run/router@npm:1.6.2" + checksum: 73da6884e53873e4290abb3978373cafc3f351994273b0663eda5e12c81cb427fc6fe4df1924569d9a214f701d0106cf37122455951e0239d7e6fa35071df558 languageName: node linkType: hard @@ -3633,26 +3633,26 @@ __metadata: linkType: hard "react-router-dom@npm:^6.8.1": - version: 6.11.1 - resolution: "react-router-dom@npm:6.11.1" + version: 6.11.2 + resolution: "react-router-dom@npm:6.11.2" dependencies: - "@remix-run/router": 1.6.1 - react-router: 6.11.1 + "@remix-run/router": 1.6.2 + react-router: 6.11.2 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 17f1f9c3d71604fb9e270b672a97accbee0bedf5b8cb03518fd20068aa4d653fcbb46c2dfd5cd04a41864bed21cc23c275d7af39e4be2224435529779bf7e7e4 + checksum: be7433bc290e56c0dd3e1008d53a76cc9866bf460980658501880876420086f11810ec3355a3abcd79ac537d6a1351eda009fade841c266456d0e8df60967b76 languageName: node linkType: hard -"react-router@npm:6.11.1": - version: 6.11.1 - resolution: "react-router@npm:6.11.1" +"react-router@npm:6.11.2": + version: 6.11.2 + resolution: "react-router@npm:6.11.2" dependencies: - "@remix-run/router": 1.6.1 + "@remix-run/router": 1.6.2 peerDependencies: react: ">=16.8" - checksum: 3b49692947ef2ddae134a15462e4fa47022d82c358cc90085b471989e4bc3c4e1637aa3a81389166b69db557ac420c289f64d64309f4d0bd87a6099e49aee6e1 + checksum: a437606078d6096a6dfa322adf80d00ce153f20cd470ad888088c8da99f44477b963425c53f5461a540b909fc274154292ed80d636482dcdc58a423915ca1433 languageName: node linkType: hard From a6b70be8073d52f8ff54ab9a590eded83a57da5c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 14:29:29 -0700 Subject: [PATCH 11/23] fix(deps): update dependency listr2 to v6.6.0 (#8347) --- package.json | 2 +- packages/cli-helpers/package.json | 2 +- packages/cli/package.json | 2 +- yarn.lock | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index cced9f10dcdb..3591f672ad4d 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "jest-runner-tsd": "5.0.0", "jscodeshift": "0.15.0", "lerna": "6.6.2", - "listr2": "6.5.0", + "listr2": "6.6.0", "lodash.template": "4.5.0", "make-dir-cli": "3.0.0", "msw": "1.2.1", diff --git a/packages/cli-helpers/package.json b/packages/cli-helpers/package.json index a83899a163b1..c81a069e063c 100644 --- a/packages/cli-helpers/package.json +++ b/packages/cli-helpers/package.json @@ -29,7 +29,7 @@ "chalk": "4.1.2", "core-js": "3.30.2", "execa": "5.1.1", - "listr2": "6.5.0", + "listr2": "6.6.0", "lodash.memoize": "4.1.2", "pascalcase": "1.0.0", "prettier": "2.8.8", diff --git a/packages/cli/package.json b/packages/cli/package.json index 3414653e236f..f13613220900 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -58,7 +58,7 @@ "fs-extra": "11.1.1", "humanize-string": "2.1.0", "latest-version": "5.1.0", - "listr2": "6.5.0", + "listr2": "6.6.0", "lodash": "4.17.21", "param-case": "3.0.4", "pascalcase": "1.0.0", diff --git a/yarn.lock b/yarn.lock index d39001e7bc07..b040c7bd81ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6939,7 +6939,7 @@ __metadata: core-js: 3.30.2 execa: 5.1.1 jest: 29.5.0 - listr2: 6.5.0 + listr2: 6.6.0 lodash.memoize: 4.1.2 pascalcase: 1.0.0 prettier: 2.8.8 @@ -6987,7 +6987,7 @@ __metadata: humanize-string: 2.1.0 jest: 29.5.0 latest-version: 5.1.0 - listr2: 6.5.0 + listr2: 6.6.0 lodash: 4.17.21 param-case: 3.0.4 pascalcase: 1.0.0 @@ -22456,9 +22456,9 @@ __metadata: languageName: node linkType: hard -"listr2@npm:6.5.0": - version: 6.5.0 - resolution: "listr2@npm:6.5.0" +"listr2@npm:6.6.0": + version: 6.6.0 + resolution: "listr2@npm:6.6.0" dependencies: cli-truncate: ^3.1.0 colorette: ^2.0.20 @@ -22471,7 +22471,7 @@ __metadata: peerDependenciesMeta: enquirer: optional: true - checksum: 29f5cd57d506b1396db89d23771609ff1825353ab49c48fe7de377d63c3dbe7347b9c4fac82dee690047cd6fbfce1b6fef18c5bcf23850bdbf1458c3a8aaada4 + checksum: 78da38e08c9311a022cbe0b24e1e7a81f7e55f69a2786f9549d590331b807137dfddaafc346d8d66332f77fdfa486c60e4370493537c431b4fb594c18c4705bc languageName: node linkType: hard @@ -28428,7 +28428,7 @@ __metadata: jest-runner-tsd: 5.0.0 jscodeshift: 0.15.0 lerna: 6.6.2 - listr2: 6.5.0 + listr2: 6.6.0 lodash.template: 4.5.0 make-dir-cli: 3.0.0 msw: 1.2.1 From de8b0fa1aafce29857324c9356604b5dba731b12 Mon Sep 17 00:00:00 2001 From: Dominic Saadi Date: Wed, 17 May 2023 14:51:09 -0700 Subject: [PATCH 12/23] feat(coherence deploy): add setup deploy coherence (#8234) * feat: add setup deploy coherence * add changes to yaml template * Update packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js * warn on prerender, style * add warning to docs * properly escape quotes * configure toml * throw instead of warn * style: move notes inline * properly try-catch * add to intro * add note about data migrations --- docs/docs/deploy/coherence.md | 40 +++ docs/docs/deploy/introduction.md | 1 + docs/sidebars.js | 5 + .../setup/deploy/providers/coherence.js | 16 ++ .../deploy/providers/coherenceHandler.js | 241 ++++++++++++++++++ 5 files changed, 303 insertions(+) create mode 100644 docs/docs/deploy/coherence.md create mode 100644 packages/cli/src/commands/setup/deploy/providers/coherence.js create mode 100644 packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js diff --git a/docs/docs/deploy/coherence.md b/docs/docs/deploy/coherence.md new file mode 100644 index 000000000000..2bc8897d88ce --- /dev/null +++ b/docs/docs/deploy/coherence.md @@ -0,0 +1,40 @@ +--- +description: Serverful deploys on GCP or AWS via Coherence's full-lifecycle environment automation +--- + +# Deploy to Coherence + +[Coherence](https://www.withcoherence.com/) delivers automated environments across the full software development lifecycle, without requiring you to glue together your own mess of open source tools to get a world-class develper experience for your team. Coherence is focused on serving startups, who are doing mission-critical work. With one simple configuration, Coherence offers: + +- Cloud-hosted development environments, based on VSCode. Similar to Gitpod or GitHub CodeSpaces +- Production-ready CI/CD running in your own GCP/AWS account, including: database migration/seeding/snapshot loading, parallelized tests, container building and docker registry management +- Full-stack branch previews. Vercel/Netlify-like developer experience for arbitrary container apps, including dependencies such as CDN, redis, and database resources +- Staging and production environment management in your AWS/GCP accounts. Production runs in its own cloud account (AWS) or project (GCP). Integrated secrets management across all environment types with a developer-friendly UI + +## Coherence Prerequisites + +To deploy to Coherence, your Redwood project needs to be hosted on GitHub and you must have an [AWS](https://docs.withcoherence.com/docs/tutorials/creating-an-app-on-aws) or [GCP](https://docs.withcoherence.com/docs/tutorials/creating-an-app-on-gcp) account. + +## Coherence Deploy + +:::caution Prerender doesn't work with Coherence yet + +You can see its current status and follow updates here on GitHub: https://github.com/redwoodjs/redwood/issues/8333. + +But if you don't use prerender, carry on! + +::: + +If you want to deploy your Redwood project on Coherence, run the setup command: + +``` +yarn rw setup deploy coherence +``` + +The command will inspect your Prisma config to determine if you're using a supported database (at the moment, only `postgres` or `mysql` are supported on Coherence). + +Then follow the [Coherence Redwood deploy docs](https://docs.withcoherence.com/docs/configuration/frameworks#redwood-js) for more information, including if you want to set up: +- a redis server +- database migration/seeding/snapshot loading +- cron jobs or async workers +- object storage using Google Cloud Storage or AWS's S3 diff --git a/docs/docs/deploy/introduction.md b/docs/docs/deploy/introduction.md index ddddcdf10910..1cbb38e0fcd7 100644 --- a/docs/docs/deploy/introduction.md +++ b/docs/docs/deploy/introduction.md @@ -13,6 +13,7 @@ Redwood is designed for both serverless and traditional infrastructure deploymen Currently, these are the officially supported deploy targets: - Baremetal (physical server that you have SSH access to) +- [Coherence](https://www.withcoherence.com/) - [Flightcontrol.dev](https://www.flightcontrol.dev?ref=redwood) - [Edg.io](https://edg.io) - [Netlify.com](https://www.netlify.com/) diff --git a/docs/sidebars.js b/docs/sidebars.js index 00a75f37f515..6f0b29a2a59a 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -114,6 +114,11 @@ module.exports = { items: [ { type: 'doc', label: 'Introduction', id: 'deploy/introduction' }, { type: 'doc', label: 'Baremetal', id: 'deploy/baremetal' }, + { + type: 'doc', + label: 'GCP or AWS via Coherence', + id: 'deploy/coherence', + }, { type: 'doc', label: 'AWS via Flightcontrol', diff --git a/packages/cli/src/commands/setup/deploy/providers/coherence.js b/packages/cli/src/commands/setup/deploy/providers/coherence.js new file mode 100644 index 000000000000..21d0a59d2a59 --- /dev/null +++ b/packages/cli/src/commands/setup/deploy/providers/coherence.js @@ -0,0 +1,16 @@ +export const command = 'coherence' + +export const description = 'Setup Coherence deploy' + +export function builder(yargs) { + yargs.option('force', { + description: 'Overwrite existing configuration', + type: 'boolean', + default: false, + }) +} + +export async function handler(options) { + const { handler } = await import('./coherenceHandler') + return handler(options) +} diff --git a/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js b/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js new file mode 100644 index 000000000000..12bbc23ce183 --- /dev/null +++ b/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js @@ -0,0 +1,241 @@ +import fs from 'fs' +import path from 'path' + +import toml from '@iarna/toml' +import { getSchema, getConfig } from '@prisma/internals' +import { Listr } from 'listr2' + +import { + colors as c, + getPaths, + isTypeScriptProject, +} from '@redwoodjs/cli-helpers' +import { errorTelemetry } from '@redwoodjs/telemetry' + +import { printSetupNotes, addFilesTask } from '../helpers' + +const redwoodProjectPaths = getPaths() + +const EXTENSION = isTypeScriptProject ? 'ts' : 'js' + +export async function handler({ force }) { + try { + const addCoherenceFilesTask = await getAddCoherenceFilesTask(force) + + const tasks = new Listr( + [ + addCoherenceFilesTask, + updateRedwoodTOMLTask(), + printSetupNotes([ + "You're ready to deploy to Coherence! ✨\n", + 'Go to https://app.withcoherence.com to create your account and setup your cloud or GitHub connections.', + 'Check out the deployment docs at https://docs.withcoherence.com for detailed instructions and more information.\n', + "Reach out to redwood@withcoherence.com with any questions! We're here to support you.", + ]), + ], + { rendererOptions: { collapse: false } } + ) + + await tasks.run() + } catch (e) { + errorTelemetry(process.argv, e.message) + console.error(c.error(e.message)) + process.exit(e?.exitCode || 1) + } +} + +// ------------------------ +// Tasks and helpers +// ------------------------ + +/** + * Adds a health check file and a coherence.yml file by introspecting the prisma schema. + */ +async function getAddCoherenceFilesTask(force) { + const files = [ + { + path: path.join(redwoodProjectPaths.api.functions, `health.${EXTENSION}`), + content: coherenceFiles.healthCheck, + }, + ] + + const coherenceConfigFile = { + path: path.join(redwoodProjectPaths.base, 'coherence.yml'), + } + + coherenceConfigFile.content = await getCoherenceConfigFileContent() + + files.push(coherenceConfigFile) + + return addFilesTask({ + title: `Adding coherence.yml and health.${EXTENSION}`, + files, + force, + }) +} + +/** + * Check the value of `provider` in the datasource block in `schema.prisma`: + * + * ```prisma title="schema.prisma" + * datasource db { + * provider = "sqlite" + * url = env("DATABASE_URL") + * } + * ``` + */ +async function getCoherenceConfigFileContent() { + const prismaSchema = await getSchema(redwoodProjectPaths.api.dbSchema) + const prismaConfig = await getConfig({ datamodel: prismaSchema }) + + let db = prismaConfig.datasources[0].activeProvider + + if (!SUPPORTED_DATABASES.includes(db)) { + throw new Error( + `Coherence doesn't support the "${db}" provider. To proceed, switch to one of the following: ` + + SUPPORTED_DATABASES.join(', ') + ) + } + + if (db === 'postgresql') { + db = 'postgres' + } + + return coherenceFiles.yamlTemplate(db) +} + +const SUPPORTED_DATABASES = ['mysql', 'postgresql'] + +/** + * should probably parse toml at this point... + * if host, set host + * Updates the ports in redwood.toml to use an environment variable. + */ +function updateRedwoodTOMLTask() { + return { + title: 'Updating redwood.toml...', + task: () => { + const redwoodTOMLPath = path.join( + redwoodProjectPaths.base, + 'redwood.toml' + ) + let redwoodTOMLContent = fs.readFileSync(redwoodTOMLPath, 'utf-8') + const redwoodTOMLObject = toml.parse(redwoodTOMLContent) + + // Replace or add the host + // How to handle matching one vs the other... + if (!redwoodTOMLObject.web.host) { + const [beforeWeb, afterWeb] = redwoodTOMLContent.split(/\[web\]\s/) + redwoodTOMLContent = [ + beforeWeb, + '[web]\n host = "0.0.0.0"\n', + afterWeb, + ].join('') + } + + if (!redwoodTOMLObject.api.host) { + const [beforeApi, afterApi] = redwoodTOMLContent.split(/\[api\]\s/) + redwoodTOMLContent = [ + beforeApi, + '[api]\n host = "0.0.0.0"\n', + afterApi, + ].join('') + } + + redwoodTOMLContent = redwoodTOMLContent.replaceAll( + HOST_REGEXP, + (match, spaceBeforeAssign, spaceAfterAssign) => + ['host', spaceBeforeAssign, '=', spaceAfterAssign, '"0.0.0.0"'].join( + '' + ) + ) + + // Replace the apiUrl + redwoodTOMLContent = redwoodTOMLContent.replace( + API_URL_REGEXP, + (match, spaceBeforeAssign, spaceAfterAssign) => + ['apiUrl', spaceBeforeAssign, '=', spaceAfterAssign, '"/api"'].join( + '' + ) + ) + + // Replace the web and api ports. + redwoodTOMLContent = redwoodTOMLContent.replaceAll( + PORT_REGEXP, + (_match, spaceBeforeAssign, spaceAfterAssign, port) => + [ + 'port', + spaceBeforeAssign, + '=', + spaceAfterAssign, + `"\${PORT:${port}}"`, + ].join('') + ) + + fs.writeFileSync(redwoodTOMLPath, redwoodTOMLContent) + }, + } +} + +const HOST_REGEXP = /host(\s*)=(\s*)\".+\"/g +const API_URL_REGEXP = /apiUrl(\s*)=(\s*)\".+\"/ +const PORT_REGEXP = /port(\s*)=(\s*)(?\d{4})/g + +// ------------------------ +// Files +// ------------------------ + +const coherenceFiles = { + yamlTemplate(db) { + return `\ +api: + type: backend + url_path: "/api" + prod: + command: ["yarn", "rw", "build", "api", "&&", "yarn", "rw", "serve", "api", "--apiRootPath=/api"] + dev: + command: ["yarn", "rw", "build", "api", "&&", "yarn", "rw", "dev", "api", "--apiRootPath=/api"] + local_packages: ["node_modules"] + + system: + cpu: 2 + memory: 2G + health_check: "/health" + + resources: + - name: ${path.basename(redwoodProjectPaths.base)}-db + engine: ${db} + version: 13 + type: database + ${db === 'postgres' ? 'adapter: postgresql' : ''} + + # If you use data migrations, add "&&", "yarn", "rw" "data-migrate" "up". + migration: ["yarn", "rw", "prisma", "migrate", "deploy"] + +web: + type: frontend + assets_path: "web/dist" + prod: + command: ["yarn", "rw", "serve", "web"] + dev: + command: ["yarn", "rw", "dev", "web", "--fwd=\\"--allowed-hosts all\\""] + + # Heads up: Redwood's prerender doesn't work with Coherence yet. + # For current status and updates, see https://github.com/redwoodjs/redwood/issues/8333. + build: ["yarn", "rw", "build", "web", "--no-prerender"] + local_packages: ["node_modules"] + + system: + cpu: 2 + memory: 2G +` + }, + healthCheck: `\ +// Coherence health check +export const handler = async () => { + return { + statusCode: 200, + } +} +`, +} From 1d5cb0cf0f7466bf68cb571160d19e2cbb243b6f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 18:09:01 -0700 Subject: [PATCH 13/23] chore(deps): update dependency glob to v10.2.5 (#8349) --- packages/vite/package.json | 2 +- yarn.lock | 27 +++++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/vite/package.json b/packages/vite/package.json index 34763d1c3a42..02dbf93a1770 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -38,7 +38,7 @@ }, "devDependencies": { "@babel/cli": "7.21.5", - "glob": "10.2.4", + "glob": "10.2.5", "jest": "29.5.0", "typescript": "5.0.4" }, diff --git a/yarn.lock b/yarn.lock index b040c7bd81ac..4060dd5138c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7561,7 +7561,7 @@ __metadata: "@vitejs/plugin-react": 4.0.0 buffer: 6.0.3 core-js: 3.30.2 - glob: 10.2.4 + glob: 10.2.5 jest: 29.5.0 typescript: 5.0.4 vite: 4.3.7 @@ -18653,7 +18653,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:10.2.4, glob@npm:^10.0.0": +"glob@npm:10.2.4": version: 10.2.4 resolution: "glob@npm:10.2.4" dependencies: @@ -18668,6 +18668,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:10.2.5, glob@npm:^10.0.0": + version: 10.2.5 + resolution: "glob@npm:10.2.5" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.0.3 + minimatch: ^9.0.0 + minipass: ^5.0.0 || ^6.0.2 + path-scurry: ^1.7.0 + bin: + glob: dist/cjs/src/bin.js + checksum: 7c3cdf44fd4a1f85c91ce948a0a94b0bac248bc3ee0bcce7ea95646e8f290acf5da7305a37cbfefb5286cd3365eaa3c94f2c5f43c2d2cdb5c818cdd978514c1b + languageName: node + linkType: hard + "glob@npm:7.1.4": version: 7.1.4 resolution: "glob@npm:7.1.4" @@ -23811,10 +23826,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.0": - version: 6.0.1 - resolution: "minipass@npm:6.0.1" - checksum: 4a82bdcef5bdf4b798cf62adb755dd668612f48c60aeef8fab0eab3fccf885b52e37a9f7793e3abfe4a6b461f06a551a06690add368b2fa29648768611e60fff +"minipass@npm:^5.0.0 || ^6.0.0, minipass@npm:^5.0.0 || ^6.0.2": + version: 6.0.2 + resolution: "minipass@npm:6.0.2" + checksum: 3878076578f44ef4078ceed10af2cfebbec1b6217bf9f7a3d8b940da8153769db29bf88498b2de0d1e0c12dfb7b634c5729b7ca03457f46435e801578add210a languageName: node linkType: hard From f65063205f3712be9e75f4363fbcf44cb5d2dfd5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 18:09:15 -0700 Subject: [PATCH 14/23] chore(deps): update dependency rimraf to v5.0.1 (#8350) --- package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/internal/package.json | 2 +- packages/project-config/package.json | 2 +- yarn.lock | 35 ++++++++++++++++++++-------- 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 3591f672ad4d..b5a4c9b2318f 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "octokit": "2.0.14", "ora": "5.4.1", "prompts": "2.4.2", - "rimraf": "5.0.0", + "rimraf": "5.0.1", "typescript": "5.0.4", "yargs": "17.7.2", "zx": "7.2.2" diff --git a/packages/cli/package.json b/packages/cli/package.json index f13613220900..e549f9626774 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -67,7 +67,7 @@ "prettier": "2.8.8", "prisma": "4.14.1", "prompts": "2.4.2", - "rimraf": "5.0.0", + "rimraf": "5.0.1", "secure-random-password": "0.2.3", "semver": "7.5.1", "string-env-interpolation": "1.0.1", diff --git a/packages/core/package.json b/packages/core/package.json index 0045c956f527..f57b42dbdcf9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -75,7 +75,7 @@ "nodemon": "2.0.22", "null-loader": "4.0.1", "react-refresh": "0.14.0", - "rimraf": "5.0.0", + "rimraf": "5.0.1", "style-loader": "3.3.2", "typescript": "5.0.4", "url-loader": "4.1.1", diff --git a/packages/internal/package.json b/packages/internal/package.json index 2f76bb8e8fd4..235eb33b84ee 100644 --- a/packages/internal/package.json +++ b/packages/internal/package.json @@ -55,7 +55,7 @@ "graphql": "16.6.0", "kill-port": "1.6.1", "prettier": "2.8.8", - "rimraf": "5.0.0", + "rimraf": "5.0.1", "string-env-interpolation": "1.0.1", "systeminformation": "5.17.12", "terminal-link": "2.1.1", diff --git a/packages/project-config/package.json b/packages/project-config/package.json index 556d834daf39..44abb60833cc 100644 --- a/packages/project-config/package.json +++ b/packages/project-config/package.json @@ -36,7 +36,7 @@ "@types/findup-sync": "4.0.2", "dependency-cruiser": "13.0.1", "jest": "29.5.0", - "rimraf": "5.0.0", + "rimraf": "5.0.1", "typescript": "5.0.4" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/yarn.lock b/yarn.lock index 4060dd5138c3..d34b2acd7e6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6996,7 +6996,7 @@ __metadata: prettier: 2.8.8 prisma: 4.14.1 prompts: 2.4.2 - rimraf: 5.0.0 + rimraf: 5.0.1 secure-random-password: 0.2.3 semver: 7.5.1 string-env-interpolation: 1.0.1 @@ -7098,7 +7098,7 @@ __metadata: nodemon: 2.0.22 null-loader: 4.0.1 react-refresh: 0.14.0 - rimraf: 5.0.0 + rimraf: 5.0.1 style-loader: 3.3.2 typescript: 5.0.4 url-loader: 4.1.1 @@ -7286,7 +7286,7 @@ __metadata: jest: 29.5.0 kill-port: 1.6.1 prettier: 2.8.8 - rimraf: 5.0.0 + rimraf: 5.0.1 string-env-interpolation: 1.0.1 systeminformation: 5.17.12 terminal-link: 2.1.1 @@ -7339,7 +7339,7 @@ __metadata: fast-glob: 3.2.12 findup-sync: 5.0.0 jest: 29.5.0 - rimraf: 5.0.0 + rimraf: 5.0.1 string-env-interpolation: 1.0.1 typescript: 5.0.4 languageName: unknown @@ -18697,6 +18697,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.5": + version: 10.2.5 + resolution: "glob@npm:10.2.5" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.0.3 + minimatch: ^9.0.0 + minipass: ^5.0.0 || ^6.0.2 + path-scurry: ^1.7.0 + bin: + glob: dist/cjs/src/bin.js + checksum: 7c3cdf44fd4a1f85c91ce948a0a94b0bac248bc3ee0bcce7ea95646e8f290acf5da7305a37cbfefb5286cd3365eaa3c94f2c5f43c2d2cdb5c818cdd978514c1b + languageName: node + linkType: hard + "glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -28324,14 +28339,14 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:5.0.0": - version: 5.0.0 - resolution: "rimraf@npm:5.0.0" +"rimraf@npm:5.0.1": + version: 5.0.1 + resolution: "rimraf@npm:5.0.1" dependencies: - glob: ^10.0.0 + glob: ^10.2.5 bin: rimraf: dist/cjs/src/bin.js - checksum: 965dcd7928334a86eeb02dc59874c6d1bf1a1361da4f55561083e5d216bfc52b933c14dae69450bea6943e52d0f704445e8f80c428c3390bd905f15daefdb0f7 + checksum: 9e6062c0aea96f384dd937e6bb06b624c881de2eee79a83d3068193183d44eb9b1f3f68a27a54b9ca8cce56bf34c2951ff4239b093b970e0501a091907031f52 languageName: node linkType: hard @@ -28455,7 +28470,7 @@ __metadata: octokit: 2.0.14 ora: 5.4.1 prompts: 2.4.2 - rimraf: 5.0.0 + rimraf: 5.0.1 typescript: 5.0.4 yargs: 17.7.2 zx: 7.2.2 From 82be88d3084f25e6582bbaf196719a0436a5938a Mon Sep 17 00:00:00 2001 From: Dominic Saadi Date: Wed, 17 May 2023 17:39:28 -0700 Subject: [PATCH 15/23] chore(release): update release command for minors --- tasks/release/releaseCommand.mjs | 67 ++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/tasks/release/releaseCommand.mjs b/tasks/release/releaseCommand.mjs index 5b679fe221ba..108a3bfc504f 100644 --- a/tasks/release/releaseCommand.mjs +++ b/tasks/release/releaseCommand.mjs @@ -363,9 +363,6 @@ async function releaseMajorOrMinor() { console.log() } - await updateCreateRedwoodAppTemplates() - await versionDocs() - exitIfNo( await question( `Ok to continue to publish? (Say no here if you want to push this branch to GitHub to create an RC) [Y/n] > ` @@ -374,8 +371,12 @@ async function releaseMajorOrMinor() { ) console.log() + await versionDocs() + console.log() await cleanInstallUpdate() + console.log() await runQA(nextVersion) + console.log() exitIfNo( await question( @@ -384,9 +385,59 @@ async function releaseMajorOrMinor() { ) console.log() - await $`git push -u origin ${releaseBranch}` - await $`git push --tags` + // Temporarily remove `"packages/create-redwood-app"` from the workspaces field + // so that we can publish it separately later. + // ------------------------ + const frameworkPackageConfigPath = fileURLToPath( + new URL('../../package.json', import.meta.url) + ) + + const frameworkPackageConfig = fs.readJSONSync(frameworkPackageConfigPath) + + const packagePaths = (await $`yarn workspaces list --json`).stdout + .trim() + .split('\n') + .map(JSON.parse) + .filter(({ name }) => name) + .map(({ location }) => location) + + frameworkPackageConfig.workspaces = packagePaths.filter( + (packagePath) => packagePath !== 'packages/create-redwood-app' + ) + + fs.writeJSONSync(frameworkPackageConfigPath, frameworkPackageConfig, { + spaces: 2, + }) + + await $`git commit -am "chore: temporary update to workspaces"` + console.log() + + // ------------------------ + try { + await $`yarn lerna publish from-package` + } catch (_error) { + exitIfNo( + await question( + 'Publishing failed. You can usually recover from this by running `yarn lerna publish from-package` again. Continue? [Y/n] > ' + ) + ) + } + console.log() + + await $`git reset --hard HEAD~1` + console.log() + + // ------------------------ + await updateCreateRedwoodAppTemplates() + console.log() + await $`yarn lerna publish from-package` + console.log() + + await $`git reset --soft HEAD~2` + await $`git commit -m "${nextVersion}"` + await $`git tag -am ${nextVersion} "${nextVersion}"` + await $`git push --tags` console.log(rocketBoxen(`Released ${chalk.green(nextVersion)}`)) @@ -680,7 +731,8 @@ async function updateCreateRedwoodAppTemplates() { cd('../..') await $`yarn ts-to-js` - await $`git commit -am "chore: update create-redwood-app templates"` + await $`git add .` + await $`git commit -m "chore: update create-redwood-app templates"` cd('../..') } @@ -731,6 +783,7 @@ async function versionDocs() { await $`yarn` await $`yarn clear` await $`yarn docusaurus docs:version ${nextDocsVersion}` - await $`git commit -am "Version docs to ${nextDocsVersion}"` + await $`git add .` + await $`git commit -m "Version docs to ${nextDocsVersion}"` await cd('../') } From d66984a4c4e034cb83f325659da71e54f3423dfd Mon Sep 17 00:00:00 2001 From: Dominic Saadi Date: Wed, 17 May 2023 18:13:24 -0700 Subject: [PATCH 16/23] chore: update yarn.lock --- yarn.lock | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index d34b2acd7e6d..906f84035a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18668,7 +18668,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:10.2.5, glob@npm:^10.0.0": +"glob@npm:10.2.5, glob@npm:^10.2.5": version: 10.2.5 resolution: "glob@npm:10.2.5" dependencies: @@ -18697,21 +18697,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.5": - version: 10.2.5 - resolution: "glob@npm:10.2.5" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.0.3 - minimatch: ^9.0.0 - minipass: ^5.0.0 || ^6.0.2 - path-scurry: ^1.7.0 - bin: - glob: dist/cjs/src/bin.js - checksum: 7c3cdf44fd4a1f85c91ce948a0a94b0bac248bc3ee0bcce7ea95646e8f290acf5da7305a37cbfefb5286cd3365eaa3c94f2c5f43c2d2cdb5c818cdd978514c1b - languageName: node - linkType: hard - "glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" From a44a41bc03bb703d1471201c4e88abcb520fdc53 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Wed, 17 May 2023 21:49:13 -0700 Subject: [PATCH 17/23] Update forms.md (#8352) A small grammar fix. --- docs/docs/forms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/forms.md b/docs/docs/forms.md index 75dc6d5023a3..db7b39ce2657 100644 --- a/docs/docs/forms.md +++ b/docs/docs/forms.md @@ -165,7 +165,7 @@ All of Redwood's form helpers need the `register` function to do what they do. B ### Using `formMethods` -There's some functions that `useForm` returns that it'd be nice to have access to. +There are some functions that `useForm` returns that it'd be nice to have access to. For example, `useForm` returns a function `reset`, which resets the form's fields. To access it, you have to call `useForm` yourself. But you still need to pass `useForm`'s return to the `` so that Redwood's helpers can register themselves: From cce553fec162441ab117763c8a85bab669082fdd Mon Sep 17 00:00:00 2001 From: Josh GM Walker <56300765+Josh-Walker-GM@users.noreply.github.com> Date: Thu, 18 May 2023 18:48:08 +0100 Subject: [PATCH 18/23] Parse as int, fix jsdoc (#8357) --- packages/cli/src/commands/devHandler.js | 3 +-- packages/cli/src/lib/ports.js | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/commands/devHandler.js b/packages/cli/src/commands/devHandler.js index 918f3a2afa95..31ff262545a9 100644 --- a/packages/cli/src/commands/devHandler.js +++ b/packages/cli/src/commands/devHandler.js @@ -50,9 +50,8 @@ export const handler = async ({ ...forward.matchAll(/\-\-port(\=|\s)(?[^\s]*)/g), ] if (forwardedPortMatches.length) { - webPreferredPort = forwardedPortMatches.pop().groups.port + webPreferredPort = parseInt(forwardedPortMatches.pop().groups.port) } - webAvailablePort = await getFreePort(webPreferredPort, [ apiPreferredPort, apiAvailablePort, diff --git a/packages/cli/src/lib/ports.js b/packages/cli/src/lib/ports.js index d0bb391e633f..d0dcbfaeb4b1 100644 --- a/packages/cli/src/lib/ports.js +++ b/packages/cli/src/lib/ports.js @@ -2,9 +2,9 @@ import portfinder from 'portfinder' /** * Finds a free port - * @param {[number]} requestedPort Port to start searching from - * @param {[number[]]} excludePorts Array of port numbers to exclude - * @return {[number]} A free port equal or higher than requestedPort but not within excludePorts. If no port can be found then returns -1 + * @param {number} requestedPort Port to start searching from + * @param {number[]} excludePorts Array of port numbers to exclude + * @return {Promise} A free port equal or higher than requestedPort but not within excludePorts. If no port can be found then returns -1 */ export async function getFreePort(requestedPort, excludePorts = []) { try { From 3490b88803829231a70c64a7daa41758010a8ff7 Mon Sep 17 00:00:00 2001 From: Dominic Saadi Date: Thu, 18 May 2023 11:26:49 -0700 Subject: [PATCH 19/23] fix(coherence): correct doc links, add commas to template (#8351) * fix(coherence): correct doc links, add commas to template * replace placeholders with correct links * swap order of comments * better error message --- docs/docs/deploy/coherence.md | 2 +- .../setup/deploy/providers/coherenceHandler.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/docs/deploy/coherence.md b/docs/docs/deploy/coherence.md index 2bc8897d88ce..970eaa98fa31 100644 --- a/docs/docs/deploy/coherence.md +++ b/docs/docs/deploy/coherence.md @@ -13,7 +13,7 @@ description: Serverful deploys on GCP or AWS via Coherence's full-lifecycle envi ## Coherence Prerequisites -To deploy to Coherence, your Redwood project needs to be hosted on GitHub and you must have an [AWS](https://docs.withcoherence.com/docs/tutorials/creating-an-app-on-aws) or [GCP](https://docs.withcoherence.com/docs/tutorials/creating-an-app-on-gcp) account. +To deploy to Coherence, your Redwood project needs to be hosted on GitHub and you must have an [AWS](https://docs.withcoherence.com/docs/overview/aws-deep-dive) or [GCP](https://docs.withcoherence.com/docs/overview/gcp-deep-dive) account. ## Coherence Deploy diff --git a/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js b/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js index 12bbc23ce183..25cde15afffe 100644 --- a/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js +++ b/packages/cli/src/commands/setup/deploy/providers/coherenceHandler.js @@ -92,8 +92,12 @@ async function getCoherenceConfigFileContent() { if (!SUPPORTED_DATABASES.includes(db)) { throw new Error( - `Coherence doesn't support the "${db}" provider. To proceed, switch to one of the following: ` + - SUPPORTED_DATABASES.join(', ') + [ + `Coherence doesn't support the "${db}" provider in your Prisma schema.`, + `To proceed, switch to one of the following: ${SUPPORTED_DATABASES.join( + ', ' + )}.`, + ].join('\n') ) } @@ -209,7 +213,8 @@ api: type: database ${db === 'postgres' ? 'adapter: postgresql' : ''} - # If you use data migrations, add "&&", "yarn", "rw" "data-migrate" "up". + # If you use data migrations, use the following instead: + # migration: ["yarn", "rw", "prisma", "migrate", "deploy", "&&", "yarn", "rw", "data-migrate", "up"] migration: ["yarn", "rw", "prisma", "migrate", "deploy"] web: From cb73537ebf1e2286f6f91daa378814a69da96167 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 May 2023 11:48:45 -0700 Subject: [PATCH 20/23] chore(deps): update dependency octokit to v2.0.15 (#8360) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b5a4c9b2318f..e7b293834cda 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "npm-packlist": "7.0.4", "nx": "16.2.1", "nx-cloud": "16.0.5", - "octokit": "2.0.14", + "octokit": "2.0.15", "ora": "5.4.1", "prompts": "2.4.2", "rimraf": "5.0.1", diff --git a/yarn.lock b/yarn.lock index 906f84035a3e..57568ecc49de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25129,9 +25129,9 @@ __metadata: languageName: node linkType: hard -"octokit@npm:2.0.14": - version: 2.0.14 - resolution: "octokit@npm:2.0.14" +"octokit@npm:2.0.15": + version: 2.0.15 + resolution: "octokit@npm:2.0.15" dependencies: "@octokit/app": ^13.1.1 "@octokit/core": ^4.0.4 @@ -25141,7 +25141,7 @@ __metadata: "@octokit/plugin-retry": ^4.0.3 "@octokit/plugin-throttling": ^5.0.0 "@octokit/types": ^9.0.0 - checksum: 97cafa7c50821b0b52ec64218538678a19254182bd9d64f24e1b0ee8f9d196e748f9aa857fa8eedc74ccf5666793a5df41e9e8a3801993a75aa8dfc96543d88e + checksum: b82a92159d1fef53c25298cd33fa3d56874a32a9eddb1c55348dadce1303137a30c341e4ff6b48273c7d0619714588a935bf03ede25a9d95bc2fd759e40a1377 languageName: node linkType: hard @@ -28452,7 +28452,7 @@ __metadata: npm-packlist: 7.0.4 nx: 16.2.1 nx-cloud: 16.0.5 - octokit: 2.0.14 + octokit: 2.0.15 ora: 5.4.1 prompts: 2.4.2 rimraf: 5.0.1 From b28669ecee7602bc3939d649d5ec33c9e35a1961 Mon Sep 17 00:00:00 2001 From: David Thyresson Date: Thu, 18 May 2023 16:41:17 -0400 Subject: [PATCH 21/23] Refactor GraphQL Server and CreateYoga to Support "api serve" with Fastify Server (#8339) * Move makeMergedSchema * refactor createGraphQLYoga * Make a Fastify plugin for graphql yoga * Set yoga options * Adds graphql fastify plugin to template * Whitespace * Adds allowGraphiQL config setting and docs * fastify gql plugin awaits * Merge in subscriptions into schema from project * Get to green on tests * Fix subscriptions module api import * Tests makeSubscriptions * Fastify graphql plugin needed graphqlserver package * remove unneeded comments * Update docs/docs/graphql.md * Adds HookHandlerDoneFunction * Update packages/cli/src/commands/experimental/templates/server.ts.template Co-authored-by: Dominic Saadi --------- Co-authored-by: Dominic Saadi --- docs/docs/graphql.md | 10 +- .../experimental/templates/server.ts.template | 41 +++- packages/fastify/build.mjs | 1 + packages/fastify/package.json | 1 + packages/fastify/src/graphql.ts | 46 ++++ packages/fastify/src/index.ts | 1 + .../graphql-server/src/__tests__/cors.test.ts | 2 +- .../src/__tests__/makeDirectives.test.ts | 2 +- .../__tests__/makeMergedSchema.test.ts | 7 +- .../src/__tests__/makeSubscriptions.test.ts | 70 ++++++ .../graphql-server/src/createGraphQLYoga.ts | 223 ++++++++++++++++++ .../functions/__tests__/authDecoders.test.ts | 2 +- .../functions/__tests__/healthCheck.test.ts | 2 +- .../__tests__/readinessCheck.test.ts | 2 +- .../graphql-server/src/functions/graphql.ts | 195 ++------------- .../graphql-server/src/functions/types.ts | 168 ------------- .../src/functions/useRequireAuth.ts | 3 +- packages/graphql-server/src/index.ts | 5 +- .../makeMergedSchema.ts | 52 +++- .../src/plugins/__tests__/useArmor.test.ts | 2 +- .../plugins/__tests__/useRedwoodError.test.ts | 2 +- .../graphql-server/src/plugins/useArmor.ts | 2 +- .../src/plugins/useRedwoodAuthContext.ts | 6 +- .../src/plugins/useRedwoodError.ts | 2 +- .../plugins/useRedwoodGlobalContextSetter.ts | 2 +- .../src/plugins/useRedwoodLogger.ts | 2 +- .../src/plugins/useRedwoodPopulateContext.ts | 5 +- .../src/subscriptions/makeSubscriptions.ts | 39 +++ packages/graphql-server/src/types.ts | 187 +++++++++++++++ .../templates/api-globImports.d.ts.template | 1 + yarn.lock | 1 + 31 files changed, 705 insertions(+), 379 deletions(-) create mode 100644 packages/fastify/src/graphql.ts rename packages/graphql-server/src/{makeMergedSchema => }/__tests__/makeMergedSchema.test.ts (99%) create mode 100644 packages/graphql-server/src/__tests__/makeSubscriptions.test.ts create mode 100644 packages/graphql-server/src/createGraphQLYoga.ts delete mode 100644 packages/graphql-server/src/functions/types.ts rename packages/graphql-server/src/{makeMergedSchema => }/makeMergedSchema.ts (87%) create mode 100644 packages/graphql-server/src/subscriptions/makeSubscriptions.ts diff --git a/docs/docs/graphql.md b/docs/docs/graphql.md index f1b83de0e34e..7d1b0629d742 100644 --- a/docs/docs/graphql.md +++ b/docs/docs/graphql.md @@ -1452,9 +1452,9 @@ The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **, by default, only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. -However, there may be cases where you want to enable introspection. You can enable introspection by setting the `allowIntrospection` option to `true`. +However, there may be cases where you want to enable introspection as well as the GraphQL PLaygrouns. You can enable introspection by setting the `allowIntrospection` option to `true` and enable GraphiQL by setting `allowGraphiQL` to `true`. -Here is an example of `createGraphQLHandler` function with the `allowIntrospection` option set to `true`: +Here is an example of `createGraphQLHandler` function with the `allowIntrospection` and `allowGraphiQL` options set to `true`: ```ts {8} export const handler = createGraphQLHandler({ authDecoder, @@ -1464,6 +1464,7 @@ export const handler = createGraphQLHandler({ sdls, services, allowIntrospection: true, // 👈 enable introspection in all environments + allowGraphiQL: true, // 👈 enable GraphiQL Playground in all environments onException: () => { // Disconnect from your database with an unhandled exception. db.$disconnect() @@ -1475,8 +1476,13 @@ export const handler = createGraphQLHandler({ Enabling introspection in production may pose a security risk, as it allows users to access information about your schema, queries, and mutations. Use this option with caution and make sure to secure your GraphQL API properly. +The may be cases where one wants to allow introspection, but not GraphiQL. + +Or, you may want to enable GraphiQL, but not allow introspection; for example, to try out known queries, but not to share the entire set of possible operations and types. + ::: + ### GraphQL Armor Configuration [GraphQL Armor](https://escape.tech/graphql-armor/) is a middleware that adds a security layer the RedwoodJS GraphQL endpoint configured with sensible defaults. diff --git a/packages/cli/src/commands/experimental/templates/server.ts.template b/packages/cli/src/commands/experimental/templates/server.ts.template index 4a9680a49c98..f359867cc49b 100644 --- a/packages/cli/src/commands/experimental/templates/server.ts.template +++ b/packages/cli/src/commands/experimental/templates/server.ts.template @@ -1,20 +1,35 @@ import path from 'path' +// import { useLiveQuery } from '@envelop/live-query' import chalk from 'chalk' import { config } from 'dotenv-defaults' import Fastify from 'fastify' +import { OperationTypeNode } from 'graphql' import { coerceRootPath, redwoodFastifyWeb, redwoodFastifyAPI, + redwoodFastifyGraphQLServer, DEFAULT_REDWOOD_FASTIFY_CONFIG, } from '@redwoodjs/fastify' import { getPaths, getConfig } from '@redwoodjs/project-config' +import directives from 'src/directives/**/*.{js,ts}' +import sdls from 'src/graphql/**/*.sdl.{js,ts}' +import services from 'src/services/**/*.{js,ts}' + +import { logger } from './lib/logger' + async function serve() { // Load .env files const redwoodProjectPaths = getPaths() + const redwoodConfig = getConfig() + + const apiRootPath = coerceRootPath(redwoodConfig.web.apiUrl) + const port = redwoodConfig.web.port + + const tsServer = Date.now() config({ path: path.join(redwoodProjectPaths.base, '.env'), @@ -22,7 +37,6 @@ async function serve() { multiline: true, }) - const tsServer = Date.now() console.log(chalk.italic.dim('Starting API and Web Servers...')) // Configure Fastify @@ -30,11 +44,6 @@ async function serve() { ...DEFAULT_REDWOOD_FASTIFY_CONFIG, }) - const redwoodConfig = getConfig() - - const apiRootPath = coerceRootPath(redwoodConfig.web.apiUrl) - const port = redwoodConfig.web.port - await fastify.register(redwoodFastifyWeb) await fastify.register(redwoodFastifyAPI, { @@ -43,6 +52,24 @@ async function serve() { }, }) + await fastify.register(redwoodFastifyGraphQLServer, { + loggerConfig: { + logger: logger, + options: { query: true, data: true, level: 'trace' }, + }, + graphiQLEndpoint: '/yoga', + sdls, + services, + directives, + allowIntrospection: true, + allowGraphiQL: true, + allowedOperations: [ + OperationTypeNode.SUBSCRIPTION, + OperationTypeNode.QUERY, + OperationTypeNode.MUTATION, + ], + }) + // Start fastify.listen({ port }) @@ -55,7 +82,7 @@ async function serve() { console.log(`API serving from ${apiServer}`) console.log(`API listening on ${on}`) const graphqlEnd = chalk.magenta(`${apiRootPath}graphql`) - console.log(`GraphQL endpoint at ${graphqlEnd}`) + console.log(`GraphQL function endpoint at ${graphqlEnd}`) }) process.on('exit', () => { diff --git a/packages/fastify/build.mjs b/packages/fastify/build.mjs index 4d3bfd40de1a..bc79ea07c2f9 100644 --- a/packages/fastify/build.mjs +++ b/packages/fastify/build.mjs @@ -4,6 +4,7 @@ await esbuild.build({ entryPoints: [ 'src/api.ts', 'src/config.ts', + 'src/graphql.ts', 'src/index.ts', 'src/types.ts', 'src/web.ts', diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 9c18879e8f72..68cbf7c83720 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -21,6 +21,7 @@ "@fastify/http-proxy": "9.1.0", "@fastify/static": "6.10.1", "@fastify/url-data": "5.3.1", + "@redwoodjs/graphql-server": "5.0.0", "@redwoodjs/project-config": "5.0.0", "ansi-colors": "4.1.3", "fast-glob": "3.2.12", diff --git a/packages/fastify/src/graphql.ts b/packages/fastify/src/graphql.ts new file mode 100644 index 000000000000..86e9ce8a6488 --- /dev/null +++ b/packages/fastify/src/graphql.ts @@ -0,0 +1,46 @@ +import type { FastifyInstance, HookHandlerDoneFunction } from 'fastify' + +import type { GraphQLYogaOptions } from '@redwoodjs/graphql-server' +import { createGraphQLYoga } from '@redwoodjs/graphql-server' +/** + * Encapsulates the routes + * @param {FastifyInstance} fastify Encapsulated Fastify Instance + * @param {Object} options plugin options, refer to https://www.fastify.io/docs/latest/Reference/Plugins/#plugin-options + */ +export async function redwoodFastifyGraphQLServer( + fastify: FastifyInstance, + options: GraphQLYogaOptions, + done: HookHandlerDoneFunction +) { + try { + const { yoga } = createGraphQLYoga(options) + + fastify.route({ + url: yoga.graphqlEndpoint, + method: ['GET', 'POST', 'OPTIONS'], + handler: async (req, reply) => { + const response = await yoga.handleNodeRequest(req, { + req, + reply, + }) + + for (const [name, value] of response.headers) { + reply.header(name, value) + } + + reply.status(response.status) + reply.send(response.body) + + return reply + }, + }) + + fastify.ready(() => { + console.log(`GraphQL Yoga Server endpoint at ${yoga.graphqlEndpoint}`) + }) + + done() + } catch (e) { + console.log(e) + } +} diff --git a/packages/fastify/src/index.ts b/packages/fastify/src/index.ts index 5a7b7350ed94..fe92be932b3e 100644 --- a/packages/fastify/src/index.ts +++ b/packages/fastify/src/index.ts @@ -10,6 +10,7 @@ export function createFastifyInstance(options?: FastifyServerOptions) { export { redwoodFastifyAPI } from './api.js' export { redwoodFastifyWeb } from './web.js' +export { redwoodFastifyGraphQLServer } from './graphql.js' export type * from './types.js' diff --git a/packages/graphql-server/src/__tests__/cors.test.ts b/packages/graphql-server/src/__tests__/cors.test.ts index 1426f68fdc6f..407698b172fa 100644 --- a/packages/graphql-server/src/__tests__/cors.test.ts +++ b/packages/graphql-server/src/__tests__/cors.test.ts @@ -4,7 +4,7 @@ import { createLogger } from '@redwoodjs/api/logger' import { createGraphQLHandler } from '../functions/graphql' -jest.mock('../makeMergedSchema/makeMergedSchema', () => { +jest.mock('../makeMergedSchema', () => { const { makeExecutableSchema } = require('@graphql-tools/schema') // Return executable schema return { diff --git a/packages/graphql-server/src/__tests__/makeDirectives.test.ts b/packages/graphql-server/src/__tests__/makeDirectives.test.ts index 36ed7c0f5035..e4a0af0a14eb 100644 --- a/packages/graphql-server/src/__tests__/makeDirectives.test.ts +++ b/packages/graphql-server/src/__tests__/makeDirectives.test.ts @@ -18,7 +18,7 @@ const bazingaSchema = gql` const barSchema = gql` directive @bar on FIELD_DEFINITION ` -test('Should map globs to defined structure correctly', async () => { +test('Should map directives globs to defined structure correctly', async () => { // Mocking what our import-dir plugin would do const directiveFiles = { foo_directive: { diff --git a/packages/graphql-server/src/makeMergedSchema/__tests__/makeMergedSchema.test.ts b/packages/graphql-server/src/__tests__/makeMergedSchema.test.ts similarity index 99% rename from packages/graphql-server/src/makeMergedSchema/__tests__/makeMergedSchema.test.ts rename to packages/graphql-server/src/__tests__/makeMergedSchema.test.ts index 2cedb697830c..0e0be5f9b3de 100644 --- a/packages/graphql-server/src/makeMergedSchema/__tests__/makeMergedSchema.test.ts +++ b/packages/graphql-server/src/__tests__/makeMergedSchema.test.ts @@ -5,13 +5,13 @@ import { makeDirectivesForPlugin, createTransformerDirective, createValidatorDirective, -} from '../../directives/makeDirectives' +} from '../directives/makeDirectives' +import { makeMergedSchema } from '../makeMergedSchema' import { GraphQLTypeWithFields, ServicesGlobImports, SdlGlobImports, -} from '../../types' -import { makeMergedSchema } from '../makeMergedSchema' +} from '../types' jest.mock('@redwoodjs/project-config', () => { return { @@ -138,6 +138,7 @@ describe('makeMergedSchema', () => { const schema = makeMergedSchema({ sdls, services, + subscriptions: [], directives: makeDirectivesForPlugin(directiveFiles), }) diff --git a/packages/graphql-server/src/__tests__/makeSubscriptions.test.ts b/packages/graphql-server/src/__tests__/makeSubscriptions.test.ts new file mode 100644 index 000000000000..d7ea6825de2c --- /dev/null +++ b/packages/graphql-server/src/__tests__/makeSubscriptions.test.ts @@ -0,0 +1,70 @@ +import gql from 'graphql-tag' + +import { makeSubscriptions } from '../subscriptions/makeSubscriptions' +const countdownSchema = gql` + type Subscription { + countdown(from: Int!, interval: Int!): Int! + } +` + +const newMessageSchema = gql` + type Message { + from: String + body: String + } + + type Subscription { + newMessage(roomId: ID!): Message! + } +` +describe('Should map subscription globs to defined structure correctly', () => { + it('Should map a subscribe correctly', async () => { + // Mocking what our import-dir plugin would do + const subscriptionFiles = { + countdown_subscription: { + schema: countdownSchema, + countdown: { + async *subscribe(_, { from, interval }) { + for (let i = from; i >= 0; i--) { + await new Promise((resolve) => + setTimeout(resolve, interval ?? 1000) + ) + yield { countdown: i } + } + }, + }, + }, + } + + const [countdownSubscription] = makeSubscriptions(subscriptionFiles) + + expect(countdownSubscription.schema.kind).toBe('Document') + expect(countdownSubscription.name).toBe('countdown') + expect(countdownSubscription.resolvers.subscribe).toBeDefined() + expect(countdownSubscription.resolvers.resolve).not.toBeDefined() + }) + + it('Should map a subscribe and resolve correctly', async () => { + // Mocking what our import-dir plugin would do + const subscriptionFiles = { + newMessage_subscription: { + schema: newMessageSchema, + newMessage: { + subscribe: (_, { roomId }) => { + return roomId + }, + resolve: (payload) => { + return payload + }, + }, + }, + } + + const [newMessageSubscription] = makeSubscriptions(subscriptionFiles) + + expect(newMessageSubscription.schema.kind).toBe('Document') + expect(newMessageSubscription.name).toBe('newMessage') + expect(newMessageSubscription.resolvers.subscribe).toBeDefined() + expect(newMessageSubscription.resolvers.resolve).toBeDefined() + }) +}) diff --git a/packages/graphql-server/src/createGraphQLYoga.ts b/packages/graphql-server/src/createGraphQLYoga.ts new file mode 100644 index 000000000000..a81847666905 --- /dev/null +++ b/packages/graphql-server/src/createGraphQLYoga.ts @@ -0,0 +1,223 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +import { useDisableIntrospection } from '@envelop/disable-introspection' +import { useFilterAllowedOperations } from '@envelop/filter-operation-type' +import { GraphQLSchema, OperationTypeNode } from 'graphql' +import { Plugin, useReadinessCheck, createYoga } from 'graphql-yoga' + +import { mapRwCorsOptionsToYoga } from './cors' +import { makeDirectivesForPlugin } from './directives/makeDirectives' +import { makeMergedSchema } from './makeMergedSchema' +import { + useArmor, + useRedwoodAuthContext, + useRedwoodDirective, + useRedwoodError, + useRedwoodGlobalContextSetter, + useRedwoodOpenTelemetry, + useRedwoodLogger, + useRedwoodPopulateContext, +} from './plugins' +import type { + useRedwoodDirectiveReturn, + DirectivePluginOptions, +} from './plugins/useRedwoodDirective' +import { makeSubscriptions } from './subscriptions/makeSubscriptions' +import type { GraphQLYogaOptions } from './types' + +export const createGraphQLYoga = ({ + healthCheckId, + loggerConfig, + context, + getCurrentUser, + onException, + generateGraphiQLHeader, + extraPlugins, + authDecoder, + cors, + services, + sdls, + directives = [], + subscriptions = [], + armorConfig, + allowedOperations, + allowIntrospection, + allowGraphiQL, + defaultError = 'Something went wrong.', + graphiQLEndpoint = '/graphql', + schemaOptions, +}: GraphQLYogaOptions) => { + let schema: GraphQLSchema + let redwoodDirectivePlugins = [] as Plugin[] + const logger = loggerConfig.logger + + try { + // @NOTE: Directives are optional + const projectDirectives = makeDirectivesForPlugin(directives) + + if (projectDirectives.length > 0) { + ;(redwoodDirectivePlugins as useRedwoodDirectiveReturn[]) = + projectDirectives.map((directive) => + useRedwoodDirective(directive as DirectivePluginOptions) + ) + } + + // @NOTE: Subscriptions are optional and only work in the context of a server + const projectSubscriptions = makeSubscriptions(subscriptions) + + schema = makeMergedSchema({ + sdls, + services, + directives: projectDirectives, + subscriptions: projectSubscriptions, + schemaOptions, + }) + } catch (e) { + logger.fatal(e as Error, '\n ⚠️ GraphQL server crashed \n') + + onException && onException() + + // Forcefully crash the graphql server + // so users know that a misconfiguration has happened + process.exit(1) + } + + try { + // Important: Plugins are executed in order of their usage, and inject functionality serially, + // so the order here matters + const plugins: Array> = [] + + const isDevEnv = process.env.NODE_ENV === 'development' + const disableIntrospection = + (allowIntrospection === null && !isDevEnv) || allowIntrospection === false + const disableGraphQL = + (allowGraphiQL === null && !isDevEnv) || allowGraphiQL === false + + const defaultQuery = `query Redwood { + redwood { + version + } + }` + + // TODO: Once Studio is not experimental, can remove these generateGraphiQLHeaders + const authHeader = `{"x-auth-comment": "See documentation: https://redwoodjs.com/docs/cli-commands#setup-graphiQL-headers on how to auto generate auth headers"}` + + const graphiql = !disableGraphQL + ? { + title: 'Redwood GraphQL Playground', + headers: generateGraphiQLHeader + ? generateGraphiQLHeader() + : authHeader, + defaultQuery, + headerEditorEnabled: true, + } + : false + + logger.debug( + { + healthCheckId, + allowedOperations, + allowIntrospection, + defaultError, + disableIntrospection, + disableGraphQL, + allowGraphiQL, + graphiql, + graphiQLEndpoint, + }, + 'GraphiQL and Introspection Config' + ) + + if (disableIntrospection) { + plugins.push(useDisableIntrospection()) + } + + // Custom Redwood plugins + plugins.push(useRedwoodAuthContext(getCurrentUser, authDecoder)) + plugins.push(useRedwoodGlobalContextSetter()) + + if (context) { + plugins.push(useRedwoodPopulateContext(context)) + } + + // Custom Redwood plugins + plugins.push(...redwoodDirectivePlugins) + + // Custom Redwood OpenTelemetry plugin + plugins.push(useRedwoodOpenTelemetry()) + + // Secure the GraphQL server + plugins.push(useArmor(logger, armorConfig)) + + // Only allow execution of specific operation types + plugins.push( + useFilterAllowedOperations( + allowedOperations || [ + OperationTypeNode.QUERY, + OperationTypeNode.MUTATION, + ] + ) + ) + + // App-defined plugins + if (extraPlugins && extraPlugins.length > 0) { + plugins.push(...extraPlugins) + } + + plugins.push(useRedwoodError(logger)) + + plugins.push( + useReadinessCheck({ + endpoint: graphiQLEndpoint + '/readiness', + check: async ({ request }) => { + try { + // if we can reach the health check endpoint ... + const response = await yoga.fetch( + new URL(graphiQLEndpoint + '/health', request.url) + ) + + const expectedHealthCheckId = healthCheckId || 'yoga' + + // ... and the health check id's match the request and response's + const status = + response.headers.get('x-yoga-id') === expectedHealthCheckId && + request.headers.get('x-yoga-id') === expectedHealthCheckId + + // then we're good to go (or not) + return status + } catch (err) { + logger.error(err) + return false + } + }, + }) + ) + + // Must be "last" in plugin chain, but before error masking + // so can process any data added to results and extensions + plugins.push(useRedwoodLogger(loggerConfig)) + + const yoga = createYoga({ + id: healthCheckId, + landingPage: isDevEnv, + schema, + plugins, + maskedErrors: { + errorMessage: defaultError, + isDev: isDevEnv, + }, + logging: logger, + healthCheckEndpoint: graphiQLEndpoint + '/health', + graphqlEndpoint: graphiQLEndpoint, + graphiql, + cors: (request: Request) => { + const requestOrigin = request.headers.get('origin') + return mapRwCorsOptionsToYoga(cors, requestOrigin) + }, + }) + + return { yoga, logger } + } catch (e) { + onException && onException() + throw e + } +} diff --git a/packages/graphql-server/src/functions/__tests__/authDecoders.test.ts b/packages/graphql-server/src/functions/__tests__/authDecoders.test.ts index 5823f1faa67e..8fc19030fbf8 100644 --- a/packages/graphql-server/src/functions/__tests__/authDecoders.test.ts +++ b/packages/graphql-server/src/functions/__tests__/authDecoders.test.ts @@ -4,7 +4,7 @@ import { createLogger } from '@redwoodjs/api/logger' import { createGraphQLHandler } from '../../functions/graphql' -jest.mock('../../makeMergedSchema/makeMergedSchema', () => { +jest.mock('../../makeMergedSchema', () => { const { makeExecutableSchema } = require('@graphql-tools/schema') // Return executable schema diff --git a/packages/graphql-server/src/functions/__tests__/healthCheck.test.ts b/packages/graphql-server/src/functions/__tests__/healthCheck.test.ts index 7cc73ca2f5b3..6e252baacc0a 100644 --- a/packages/graphql-server/src/functions/__tests__/healthCheck.test.ts +++ b/packages/graphql-server/src/functions/__tests__/healthCheck.test.ts @@ -4,7 +4,7 @@ import { createLogger } from '@redwoodjs/api/logger' import { createGraphQLHandler } from '../../functions/graphql' -jest.mock('../../makeMergedSchema/makeMergedSchema', () => { +jest.mock('../../makeMergedSchema', () => { const { makeExecutableSchema } = require('@graphql-tools/schema') // Return executable schema diff --git a/packages/graphql-server/src/functions/__tests__/readinessCheck.test.ts b/packages/graphql-server/src/functions/__tests__/readinessCheck.test.ts index 8fad81e76845..df1916a692f0 100644 --- a/packages/graphql-server/src/functions/__tests__/readinessCheck.test.ts +++ b/packages/graphql-server/src/functions/__tests__/readinessCheck.test.ts @@ -4,7 +4,7 @@ import { createLogger } from '@redwoodjs/api/logger' import { createGraphQLHandler } from '../../functions/graphql' -jest.mock('../../makeMergedSchema/makeMergedSchema', () => { +jest.mock('../../makeMergedSchema', () => { const { makeExecutableSchema } = require('@graphql-tools/schema') // Return executable schema diff --git a/packages/graphql-server/src/functions/graphql.ts b/packages/graphql-server/src/functions/graphql.ts index 4d76ad2188ff..54e60fe1a781 100644 --- a/packages/graphql-server/src/functions/graphql.ts +++ b/packages/graphql-server/src/functions/graphql.ts @@ -1,36 +1,13 @@ -/* eslint-disable react-hooks/rules-of-hooks */ -import { useDisableIntrospection } from '@envelop/disable-introspection' -import { useFilterAllowedOperations } from '@envelop/filter-operation-type' import type { APIGatewayProxyEvent, APIGatewayProxyResult, Context as LambdaContext, } from 'aws-lambda' -import { GraphQLSchema, OperationTypeNode } from 'graphql' -import { Plugin, useReadinessCheck, createYoga } from 'graphql-yoga' -import { getConfig } from '@redwoodjs/project-config' - -import { mapRwCorsOptionsToYoga } from '../cors' -import { makeDirectivesForPlugin } from '../directives/makeDirectives' +import { createGraphQLYoga } from '../createGraphQLYoga' import { getAsyncStoreInstance } from '../globalContext' -import { makeMergedSchema } from '../makeMergedSchema/makeMergedSchema' -import { - useArmor, - useRedwoodAuthContext, - useRedwoodDirective, - useRedwoodError, - useRedwoodGlobalContextSetter, - useRedwoodOpenTelemetry, - useRedwoodLogger, - useRedwoodPopulateContext, -} from '../plugins' -import type { - useRedwoodDirectiveReturn, - DirectivePluginOptions, -} from '../plugins/useRedwoodDirective' +import type { GraphQLHandlerOptions } from '../types' -import type { GraphQLHandlerOptions } from './types' /** * Creates an Enveloped GraphQL Server, configured with default Redwood plugins * @@ -58,155 +35,11 @@ export const createGraphQLHandler = ({ armorConfig, allowedOperations, allowIntrospection, + allowGraphiQL, defaultError = 'Something went wrong.', graphiQLEndpoint = '/graphql', schemaOptions, }: GraphQLHandlerOptions) => { - let schema: GraphQLSchema - let redwoodDirectivePlugins = [] as Plugin[] - const logger = loggerConfig.logger - - try { - // @NOTE: Directives are optional - const projectDirectives = makeDirectivesForPlugin(directives) - - if (projectDirectives.length > 0) { - ;(redwoodDirectivePlugins as useRedwoodDirectiveReturn[]) = - projectDirectives.map((directive) => - useRedwoodDirective(directive as DirectivePluginOptions) - ) - } - - schema = makeMergedSchema({ - sdls, - services, - directives: projectDirectives, - schemaOptions, - }) - } catch (e) { - logger.fatal(e as Error, '\n ⚠️ GraphQL server crashed \n') - - // Forcefully crash the graphql server - // so users know that a misconfiguration has happened - process.exit(1) - } - - // Important: Plugins are executed in order of their usage, and inject functionality serially, - // so the order here matters - const isDevEnv = process.env.NODE_ENV === 'development' - - const plugins: Array> = [] - - if ( - (allowIntrospection == null && !isDevEnv) || - allowIntrospection === false - ) { - plugins.push(useDisableIntrospection()) - } - - // Custom Redwood plugins - plugins.push(useRedwoodAuthContext(getCurrentUser, authDecoder)) - plugins.push(useRedwoodGlobalContextSetter()) - - if (context) { - plugins.push(useRedwoodPopulateContext(context)) - } - - // Custom Redwood plugins - plugins.push(...redwoodDirectivePlugins) - - // Custom Redwood OpenTelemetry plugin - let openTelemetryPluginEnabled = false - try { - openTelemetryPluginEnabled = getConfig().experimental.opentelemetry.enabled - } catch (_error) { - // Swallow this error for the time being as we don't always have access to the - // config toml depending on the deploy environment - } - if (openTelemetryPluginEnabled) { - plugins.push(useRedwoodOpenTelemetry()) - } - - // Secure the GraphQL server - plugins.push(useArmor(logger, armorConfig)) - - // Only allow execution of specific operation types - plugins.push( - useFilterAllowedOperations( - allowedOperations || [OperationTypeNode.QUERY, OperationTypeNode.MUTATION] - ) - ) - - // App-defined plugins - if (extraPlugins && extraPlugins.length > 0) { - plugins.push(...extraPlugins) - } - - plugins.push(useRedwoodError(logger)) - - plugins.push( - useReadinessCheck({ - endpoint: graphiQLEndpoint + '/readiness', - check: async ({ request }) => { - try { - // if we can reach the health check endpoint ... - const response = await yoga.fetch( - new URL(graphiQLEndpoint + '/health', request.url) - ) - - const expectedHealthCheckId = healthCheckId || 'yoga' - - // ... and the health check id's match the request and response's - const status = - response.headers.get('x-yoga-id') === expectedHealthCheckId && - request.headers.get('x-yoga-id') === expectedHealthCheckId - - // then we're good to go (or not) - return status - } catch (err) { - logger.error(err) - return false - } - }, - }) - ) - - // Must be "last" in plugin chain, but before error masking - // so can process any data added to results and extensions - plugins.push(useRedwoodLogger(loggerConfig)) - - const yoga = createYoga({ - id: healthCheckId, - landingPage: isDevEnv, - schema, - plugins, - maskedErrors: { - errorMessage: defaultError, - isDev: isDevEnv, - }, - logging: logger, - healthCheckEndpoint: graphiQLEndpoint + '/health', - graphqlEndpoint: graphiQLEndpoint, - graphiql: isDevEnv - ? { - title: 'Redwood GraphQL Playground', - headers: generateGraphiQLHeader - ? generateGraphiQLHeader() - : `{"x-auth-comment": "See documentation: https://redwoodjs.com/docs/cli-commands#setup-graphiQL-headers on how to auto generate auth headers"}`, - defaultQuery: `query Redwood { - redwood { - version - } -}`, - headerEditorEnabled: true, - } - : false, - cors: (request: Request) => { - const requestOrigin = request.headers.get('origin') - return mapRwCorsOptionsToYoga(cors, requestOrigin) - }, - }) - const handlerFn = async ( event: APIGatewayProxyEvent, requestContext: LambdaContext @@ -216,6 +49,28 @@ export const createGraphQLHandler = ({ let lambdaResponse: APIGatewayProxyResult + const { yoga, logger } = createGraphQLYoga({ + healthCheckId, + loggerConfig, + context, + getCurrentUser, + onException, + generateGraphiQLHeader, + extraPlugins, + authDecoder, + cors, + services, + sdls, + directives, + armorConfig, + allowedOperations, + allowIntrospection, + allowGraphiQL, + defaultError, + graphiQLEndpoint, + schemaOptions, + }) + try { // url needs to be normalized const [, rest = ''] = event.path.split(graphiQLEndpoint) diff --git a/packages/graphql-server/src/functions/types.ts b/packages/graphql-server/src/functions/types.ts deleted file mode 100644 index 083af724c976..000000000000 --- a/packages/graphql-server/src/functions/types.ts +++ /dev/null @@ -1,168 +0,0 @@ -import type { AllowedOperations } from '@envelop/filter-operation-type' -import type { GraphQLArmorConfig } from '@escape.tech/graphql-armor-types' -import { IExecutableSchemaDefinition } from '@graphql-tools/schema' -import type { APIGatewayProxyEvent, Context as LambdaContext } from 'aws-lambda' -import type { Plugin } from 'graphql-yoga' - -import type { AuthContextPayload, Decoder } from '@redwoodjs/api' -import { CorsConfig } from '@redwoodjs/api' - -import { DirectiveGlobImports } from 'src/directives/makeDirectives' - -import { LoggerConfig } from '../plugins/useRedwoodLogger' -import { SdlGlobImports, ServicesGlobImports } from '../types' - -type ThenArg = T extends PromiseLike ? U : T - -export type GetCurrentUser = ( - decoded: AuthContextPayload[0], - raw: AuthContextPayload[1], - req?: AuthContextPayload[2] -) => Promise | string> - -export type GenerateGraphiQLHeader = () => string - -export type Context = Record -export type ContextFunction = (...args: any[]) => Context | Promise - -export type ArmorConfig = { - logContext?: boolean - logErrors?: boolean -} & GraphQLArmorConfig - -/** This is an interface so you can extend it inside your application when needed */ -export interface RedwoodGraphQLContext { - event: APIGatewayProxyEvent - requestContext: LambdaContext - currentUser?: ThenArg> | AuthContextPayload | null - - [index: string]: unknown -} - -/** - * GraphQLHandlerOptions - */ -export interface GraphQLHandlerOptions { - /** - * @description The identifier used in the GraphQL health check response. - * It verifies readiness when sent as a header in the readiness check request. - * - * By default, the identifier is `yoga` as seen in the HTTP response header `x-yoga-id: yoga` - */ - healthCheckId?: string - - /** - * @description Customize GraphQL Logger - * - * Collect resolver timings, and exposes trace data for - * an individual request under extensions as part of the GraphQL response. - */ - loggerConfig: LoggerConfig - - /** - * @description Modify the resolver and global context. - */ - context?: Context | ContextFunction - - /** - * @description An async function that maps the auth token retrieved from the - * request headers to an object. - * Is it executed when the `auth-provider` contains one of the supported - * providers. - */ - getCurrentUser?: GetCurrentUser - - /** - * @description A callback when an unhandled exception occurs. Use this to disconnect your prisma instance. - */ - onException?: () => void - - /** - * @description Services passed from the glob import: - * import services from 'src/services\/**\/*.{js,ts}' - */ - services: ServicesGlobImports - - /** - * @description SDLs (schema definitions) passed from the glob import: - * import sdls from 'src/graphql\/**\/*.{js,ts}' - */ - sdls: SdlGlobImports - - /** - * @description Directives passed from the glob import: - * import directives from 'src/directives/**\/*.{js,ts}' - */ - directives?: DirectiveGlobImports - - /** - * @description A list of options passed to [makeExecutableSchema] - * (https://www.graphql-tools.com/docs/generate-schema/#makeexecutableschemaoptions). - */ - schemaOptions?: Partial - - /** - * @description CORS configuration - */ - cors?: CorsConfig - - /** - * @description Customize GraphQL Armor plugin configuration - * - * @see https://escape-technologies.github.io/graphql-armor/docs/configuration/examples - */ - armorConfig?: ArmorConfig - - /** - * @description Customize the default error message used to mask errors. - * - * By default, the masked error message is "Something went wrong" - * - * @see https://github.com/dotansimha/envelop/blob/main/packages/core/docs/use-masked-errors.md - */ - defaultError?: string - - /** - * @description Only allows the specified operation types (e.g. subscription, query or mutation). - * - * By default, only allow query and mutation (ie, do not allow subscriptions). - * - * An array of GraphQL's OperationTypeNode enums: - * - OperationTypeNode.SUBSCRIPTION - * - OperationTypeNode.QUERY - * - OperationTypeNode.MUTATION - * - * @see https://github.com/dotansimha/envelop/tree/main/packages/plugins/filter-operation-type - */ - allowedOperations?: AllowedOperations - - /** - * @description Custom Envelop plugins - */ - extraPlugins?: Plugin[] - - /** - * @description Auth-provider specific token decoder - */ - authDecoder?: Decoder | Decoder[] - - /** - * @description Customize the GraphiQL Endpoint that appears in the location bar of the GraphQL Playground - * - * Defaults to '/graphql' as this value must match the name of the `graphql` function on the api-side. - */ - graphiQLEndpoint?: string - - /** - * @description Allow schema introspection. - * By default, schema introspection is disabled in production. Explicitly set this to true or false to override in all environments. - */ - allowIntrospection?: boolean - - /** - * @description Function that returns custom headers (as string) for GraphiQL. - * - * Headers must set auth-provider, Authorization and (if using dbAuth) the encrypted cookie. - */ - generateGraphiQLHeader?: GenerateGraphiQLHeader -} diff --git a/packages/graphql-server/src/functions/useRequireAuth.ts b/packages/graphql-server/src/functions/useRequireAuth.ts index fa6ff8bd7636..0a44d627013a 100644 --- a/packages/graphql-server/src/functions/useRequireAuth.ts +++ b/packages/graphql-server/src/functions/useRequireAuth.ts @@ -6,8 +6,7 @@ import { getAsyncStoreInstance, context as globalContext, } from '../globalContext' - -import type { GetCurrentUser } from './types' +import type { GetCurrentUser } from '../types' interface Args { authDecoder?: Decoder | Decoder[] diff --git a/packages/graphql-server/src/index.ts b/packages/graphql-server/src/index.ts index af8475503b87..d4de56574803 100644 --- a/packages/graphql-server/src/index.ts +++ b/packages/graphql-server/src/index.ts @@ -6,13 +6,15 @@ export * from './globalContext' export * from './errors' export * from './functions/graphql' export * from './functions/useRequireAuth' -export * from './makeMergedSchema/makeMergedSchema' +export * from './makeMergedSchema' +export * from './createGraphQLYoga' export * from './types' export { createValidatorDirective, createTransformerDirective, getDirectiveName, + makeDirectivesForPlugin, } from './directives/makeDirectives' export { @@ -26,6 +28,7 @@ export { TransformerDirectiveFunc, ValidateArgs, TransformArgs, + useRedwoodDirective, } from './plugins/useRedwoodDirective' export * as rootSchema from './rootSchema' diff --git a/packages/graphql-server/src/makeMergedSchema/makeMergedSchema.ts b/packages/graphql-server/src/makeMergedSchema.ts similarity index 87% rename from packages/graphql-server/src/makeMergedSchema/makeMergedSchema.ts rename to packages/graphql-server/src/makeMergedSchema.ts index b4909740d344..5779e680d934 100644 --- a/packages/graphql-server/src/makeMergedSchema/makeMergedSchema.ts +++ b/packages/graphql-server/src/makeMergedSchema.ts @@ -4,7 +4,7 @@ import { makeExecutableSchema, IExecutableSchemaDefinition, } from '@graphql-tools/schema' -import { IResolvers } from '@graphql-tools/utils' +import { IResolvers, IResolverValidationOptions } from '@graphql-tools/utils' import * as opentelemetry from '@opentelemetry/api' import type { GraphQLSchema, @@ -18,14 +18,15 @@ import omitBy from 'lodash.omitby' import { getConfig } from '@redwoodjs/project-config' -import type { RedwoodDirective } from '../plugins/useRedwoodDirective' -import * as rootGqlSchema from '../rootSchema' +import type { RedwoodDirective } from './plugins/useRedwoodDirective' +import * as rootGqlSchema from './rootSchema' +import type { RedwoodSubscription } from './subscriptions/makeSubscriptions' import { Services, ServicesGlobImports, GraphQLTypeWithFields, SdlGlobImports, -} from '../types' +} from './types' const wrapWithOpenTelemetry = async ( func: any, @@ -239,7 +240,7 @@ const mergeResolversWithServices = ({ // after the type. // Example: export const MyType = { field: () => {} } let servicesForType = mergedServices - if (!['Query', 'Mutation'].includes(type.name)) { + if (!['Query', 'Mutation', 'Subscription'].includes(type.name)) { servicesForType = mergedServices?.[type.name] } @@ -330,15 +331,48 @@ const mergeTypes = ( }) } +const mergeResolversWithSubscriptions = ({ + schema, + subscriptions, + resolverValidationOptions, + inheritResolversFromInterfaces, +}: { + schema: GraphQLSchema + subscriptions: RedwoodSubscription[] + resolverValidationOptions?: IResolverValidationOptions | undefined + inheritResolversFromInterfaces?: boolean | undefined +}) => { + if (subscriptions && subscriptions.length > 0) { + const subscriptionResolvers = { Subscription: {} } as IResolvers + + subscriptions?.forEach((subscription) => { + subscriptionResolvers['Subscription'] = { + ...subscriptionResolvers['Subscription'], + ...subscription.resolvers, + } + }) + + return addResolversToSchema({ + schema, + resolvers: subscriptionResolvers, + resolverValidationOptions, + inheritResolversFromInterfaces, + }) + } + return schema +} + export const makeMergedSchema = ({ sdls, services, schemaOptions = {}, directives, + subscriptions = [], }: { sdls: SdlGlobImports services: ServicesGlobImports directives: RedwoodDirective[] + subscriptions: RedwoodSubscription[] /** * A list of options passed to [makeExecutableSchema](https://www.graphql-tools.com/docs/generate-schema/#makeexecutableschemaoptions). @@ -351,6 +385,7 @@ export const makeMergedSchema = ({ [ rootGqlSchema.schema, ...directives.map((directive) => directive.schema), // pick out schemas from directives + ...subscriptions.map((subscription) => subscription.schema), // pick out schemas from subscriptions ...sdlSchemas, // pick out the schemas from sdls ], { all: true } @@ -369,11 +404,16 @@ export const makeMergedSchema = ({ services, }) + const schemaWithSubscriptions = mergeResolversWithSubscriptions({ + schema, + subscriptions, + }) + const { resolverValidationOptions, inheritResolversFromInterfaces } = schemaOptions || {} return addResolversToSchema({ - schema, + schema: schemaWithSubscriptions, resolvers, resolverValidationOptions, inheritResolversFromInterfaces, diff --git a/packages/graphql-server/src/plugins/__tests__/useArmor.test.ts b/packages/graphql-server/src/plugins/__tests__/useArmor.test.ts index e8d7e9916d5a..2436892fc519 100644 --- a/packages/graphql-server/src/plugins/__tests__/useArmor.test.ts +++ b/packages/graphql-server/src/plugins/__tests__/useArmor.test.ts @@ -4,7 +4,7 @@ import { createLogger } from '@redwoodjs/api/logger' import { createGraphQLHandler } from '../../functions/graphql' -jest.mock('../../makeMergedSchema/makeMergedSchema', () => { +jest.mock('../../makeMergedSchema', () => { const { makeExecutableSchema } = require('@graphql-tools/schema') // Return executable schema diff --git a/packages/graphql-server/src/plugins/__tests__/useRedwoodError.test.ts b/packages/graphql-server/src/plugins/__tests__/useRedwoodError.test.ts index 191e8fa003fc..a841db63c41a 100644 --- a/packages/graphql-server/src/plugins/__tests__/useRedwoodError.test.ts +++ b/packages/graphql-server/src/plugins/__tests__/useRedwoodError.test.ts @@ -5,7 +5,7 @@ import { createLogger } from '@redwoodjs/api/logger' import { createGraphQLHandler } from '../../functions/graphql' -jest.mock('../../makeMergedSchema/makeMergedSchema', () => { +jest.mock('../../makeMergedSchema', () => { const { makeExecutableSchema } = require('@graphql-tools/schema') const { ForbiddenError } = require('@redwoodjs/graphql-server/dist/errors') const { EmailValidationError, RedwoodError } = require('@redwoodjs/api') diff --git a/packages/graphql-server/src/plugins/useArmor.ts b/packages/graphql-server/src/plugins/useArmor.ts index 7b80e1f8e54e..8ae799c97c48 100644 --- a/packages/graphql-server/src/plugins/useArmor.ts +++ b/packages/graphql-server/src/plugins/useArmor.ts @@ -3,7 +3,7 @@ import type { GraphQLError, ValidationContext } from 'graphql' import type { Logger } from '@redwoodjs/api/logger' -import { ArmorConfig } from '../functions/types' +import { ArmorConfig } from '../types' const armorConfigDefaultOptions: ArmorConfig = { logContext: false, diff --git a/packages/graphql-server/src/plugins/useRedwoodAuthContext.ts b/packages/graphql-server/src/plugins/useRedwoodAuthContext.ts index 531d55e1669a..c957eb8f5885 100644 --- a/packages/graphql-server/src/plugins/useRedwoodAuthContext.ts +++ b/packages/graphql-server/src/plugins/useRedwoodAuthContext.ts @@ -6,11 +6,7 @@ import { Decoder, } from '@redwoodjs/api' -// import { AuthenticationError } from '../errors' -import { - RedwoodGraphQLContext, - GraphQLHandlerOptions, -} from '../functions/types' +import { RedwoodGraphQLContext, GraphQLHandlerOptions } from '../types' /** * Envelop plugin for injecting the current user into the GraphQL Context, diff --git a/packages/graphql-server/src/plugins/useRedwoodError.ts b/packages/graphql-server/src/plugins/useRedwoodError.ts index 630a001f7acf..797293f4c52c 100644 --- a/packages/graphql-server/src/plugins/useRedwoodError.ts +++ b/packages/graphql-server/src/plugins/useRedwoodError.ts @@ -7,7 +7,7 @@ import { import { RedwoodError } from '@redwoodjs/api' import type { Logger } from '@redwoodjs/api/logger' -import { RedwoodGraphQLContext } from '../functions/types' +import { RedwoodGraphQLContext } from '../types' /** * Converts RedwoodErrors to GraphQLErrors diff --git a/packages/graphql-server/src/plugins/useRedwoodGlobalContextSetter.ts b/packages/graphql-server/src/plugins/useRedwoodGlobalContextSetter.ts index 50c2c5c09315..432a45423206 100644 --- a/packages/graphql-server/src/plugins/useRedwoodGlobalContextSetter.ts +++ b/packages/graphql-server/src/plugins/useRedwoodGlobalContextSetter.ts @@ -1,7 +1,7 @@ import { Plugin } from 'graphql-yoga' -import { RedwoodGraphQLContext } from '../functions/types' import { setContext } from '../index' +import { RedwoodGraphQLContext } from '../types' /** * This Envelop plugin waits until the GraphQL context is done building and sets the diff --git a/packages/graphql-server/src/plugins/useRedwoodLogger.ts b/packages/graphql-server/src/plugins/useRedwoodLogger.ts index 75a1bf59bc89..73e6f7887ce4 100644 --- a/packages/graphql-server/src/plugins/useRedwoodLogger.ts +++ b/packages/graphql-server/src/plugins/useRedwoodLogger.ts @@ -10,7 +10,7 @@ import { v4 as uuidv4 } from 'uuid' import type { Logger, LevelWithSilent } from '@redwoodjs/api/logger' import { AuthenticationError, ForbiddenError } from '../errors' -import { RedwoodGraphQLContext } from '../functions/types' +import { RedwoodGraphQLContext } from '../types' /** * Options for request and response information to include in the log statements diff --git a/packages/graphql-server/src/plugins/useRedwoodPopulateContext.ts b/packages/graphql-server/src/plugins/useRedwoodPopulateContext.ts index 1e0b10d91b3e..7625252fe1ce 100644 --- a/packages/graphql-server/src/plugins/useRedwoodPopulateContext.ts +++ b/packages/graphql-server/src/plugins/useRedwoodPopulateContext.ts @@ -1,9 +1,6 @@ import { Plugin } from 'graphql-yoga' -import { - RedwoodGraphQLContext, - GraphQLHandlerOptions, -} from '../functions/types' +import { RedwoodGraphQLContext, GraphQLHandlerOptions } from '../types' /** * This Envelop plugin enriches the context on a per-request basis diff --git a/packages/graphql-server/src/subscriptions/makeSubscriptions.ts b/packages/graphql-server/src/subscriptions/makeSubscriptions.ts new file mode 100644 index 000000000000..69f831ea8576 --- /dev/null +++ b/packages/graphql-server/src/subscriptions/makeSubscriptions.ts @@ -0,0 +1,39 @@ +import { DocumentNode } from 'graphql' +/* +We want SubscriptionsGlobs type to be an object with this shape: +But not fully supported in TS +{ + schema: DocumentNode // <-- required + [string]: RedwoodSubscription +} +*/ +export type SubscriptionGlobImports = Record + +export type RedwoodSubscription = { + schema: DocumentNode + resolvers: any + name: string +} + +export const makeSubscriptions = ( + SubscriptionGlobs: SubscriptionGlobImports +): RedwoodSubscription[] => { + return Object.entries(SubscriptionGlobs).flatMap( + ([importedGlobName, exports]) => { + // In case the Subscriptions get nested, their name comes as nested_directory_filename_Subscription + + // SubscriptionName is the filename without the Subscription extension + // slice gives us ['fileName', 'Subscription'], so we take the first one + const [SubscriptionNameFromFile] = importedGlobName.split('_').slice(-2) + + // We support exporting both Subscription name and default + const subscription = { + schema: exports.schema, + resolvers: exports[SubscriptionNameFromFile] || exports.default, + name: SubscriptionNameFromFile, + } as RedwoodSubscription + + return [subscription] + } + ) +} diff --git a/packages/graphql-server/src/types.ts b/packages/graphql-server/src/types.ts index c410d78091c0..4629f97094d0 100644 --- a/packages/graphql-server/src/types.ts +++ b/packages/graphql-server/src/types.ts @@ -1,4 +1,21 @@ +import type { AllowedOperations } from '@envelop/filter-operation-type' +import type { GraphQLArmorConfig } from '@escape.tech/graphql-armor-types' +import { IExecutableSchemaDefinition } from '@graphql-tools/schema' +import type { APIGatewayProxyEvent, Context as LambdaContext } from 'aws-lambda' import { GraphQLObjectType, GraphQLInterfaceType, DocumentNode } from 'graphql' +import type { Plugin } from 'graphql-yoga' + +import type { AuthContextPayload, Decoder } from '@redwoodjs/api' +import { CorsConfig } from '@redwoodjs/api' + +import { DirectiveGlobImports } from 'src/directives/makeDirectives' +import type { SubscriptionGlobImports } from 'src/subscriptions/makeSubscriptions' + +import type { + useRedwoodDirectiveReturn, + DirectivePluginOptions, +} from './plugins/useRedwoodDirective' +import { LoggerConfig } from './plugins/useRedwoodLogger' export type Resolver = (...args: unknown[]) => unknown export type Services = { @@ -6,6 +23,7 @@ export type Services = { } type ThenArg = T extends PromiseLike ? U : T + export type ResolverArgs = { root: ThenArg } export type SdlGlobImports = { @@ -29,3 +47,172 @@ export interface MakeServicesInterface { export type MakeServices = (args: MakeServicesInterface) => ServicesGlobImports export type GraphQLTypeWithFields = GraphQLObjectType | GraphQLInterfaceType + +export type { useRedwoodDirectiveReturn, DirectivePluginOptions } + +export type GetCurrentUser = ( + decoded: AuthContextPayload[0], + raw: AuthContextPayload[1], + req?: AuthContextPayload[2] +) => Promise | string> + +export type GenerateGraphiQLHeader = () => string + +export type Context = Record +export type ContextFunction = (...args: any[]) => Context | Promise + +export type ArmorConfig = { + logContext?: boolean + logErrors?: boolean +} & GraphQLArmorConfig + +/** This is an interface so you can extend it inside your application when needed */ +export interface RedwoodGraphQLContext { + event: APIGatewayProxyEvent + requestContext: LambdaContext + currentUser?: ThenArg> | AuthContextPayload | null + + [index: string]: unknown +} + +/** + * GraphQLYogaOptions + */ +export interface GraphQLYogaOptions { + /** + * @description The identifier used in the GraphQL health check response. + * It verifies readiness when sent as a header in the readiness check request. + * + * By default, the identifier is `yoga` as seen in the HTTP response header `x-yoga-id: yoga` + */ + healthCheckId?: string + + /** + * @description Customize GraphQL Logger + * + * Collect resolver timings, and exposes trace data for + * an individual request under extensions as part of the GraphQL response. + */ + loggerConfig: LoggerConfig + + /** + * @description Modify the resolver and global context. + */ + context?: Context | ContextFunction + + /** + * @description An async function that maps the auth token retrieved from the + * request headers to an object. + * Is it executed when the `auth-provider` contains one of the supported + * providers. + */ + getCurrentUser?: GetCurrentUser + + /** + * @description A callback when an unhandled exception occurs. Use this to disconnect your prisma instance. + */ + onException?: () => void + + /** + * @description Services passed from the glob import: + * import services from 'src/services\/**\/*.{js,ts}' + */ + services: ServicesGlobImports + + /** + * @description SDLs (schema definitions) passed from the glob import: + * import sdls from 'src/graphql\/**\/*.{js,ts}' + */ + sdls: SdlGlobImports + + /** + * @description Directives passed from the glob import: + * import directives from 'src/directives/**\/*.{js,ts}' + */ + directives?: DirectiveGlobImports + + /** + * @description Subscriptions passed from the glob import: + * import subscriptions from 'src/subscriptions/**\/*.{js,ts}' + */ + subscriptions?: SubscriptionGlobImports + + /** + * @description A list of options passed to [makeExecutableSchema] + * (https://www.graphql-tools.com/docs/generate-schema/#makeexecutableschemaoptions). + */ + schemaOptions?: Partial + + /** + * @description CORS configuration + */ + cors?: CorsConfig + + /** + * @description Customize GraphQL Armor plugin configuration + * + * @see https://escape-technologies.github.io/graphql-armor/docs/configuration/examples + */ + armorConfig?: ArmorConfig + + /** + * @description Customize the default error message used to mask errors. + * + * By default, the masked error message is "Something went wrong" + * + * @see https://github.com/dotansimha/envelop/blob/main/packages/core/docs/use-masked-errors.md + */ + defaultError?: string + + /** + * @description Only allows the specified operation types (e.g. subscription, query or mutation). + * + * By default, only allow query and mutation (ie, do not allow subscriptions). + * + * An array of GraphQL's OperationTypeNode enums: + * - OperationTypeNode.SUBSCRIPTION + * - OperationTypeNode.QUERY + * - OperationTypeNode.MUTATION + * + * @see https://github.com/dotansimha/envelop/tree/main/packages/plugins/filter-operation-type + */ + allowedOperations?: AllowedOperations + + /** + * @description Custom Envelop plugins + */ + extraPlugins?: Plugin[] + + /** + * @description Auth-provider specific token decoder + */ + authDecoder?: Decoder | Decoder[] + + /** + * @description Customize the GraphiQL Endpoint that appears in the location bar of the GraphQL Playground + * + * Defaults to '/graphql' as this value must match the name of the `graphql` function on the api-side. + */ + graphiQLEndpoint?: string + + /** + * @description Allow GraphiQL playground. + * By default, GraphiQL playground is disabled in production. Explicitly set this to true or false to override in all environments. + */ + allowGraphiQL?: boolean + + /** + * @description Allow schema introspection. + * By default, schema introspection is disabled in production. Explicitly set this to true or false to override in all environments. + */ + allowIntrospection?: boolean + + /** + * @description Function that returns custom headers (as string) for GraphiQL. + * + * Headers must set auth-provider, Authorization and (if using dbAuth) the encrypted cookie. + */ + generateGraphiQLHeader?: GenerateGraphiQLHeader +} + +export interface GraphQLHandlerOptions extends GraphQLYogaOptions {} diff --git a/packages/internal/src/generate/templates/api-globImports.d.ts.template b/packages/internal/src/generate/templates/api-globImports.d.ts.template index d7ecec563318..51e248fd5f82 100644 --- a/packages/internal/src/generate/templates/api-globImports.d.ts.template +++ b/packages/internal/src/generate/templates/api-globImports.d.ts.template @@ -1,3 +1,4 @@ declare module 'src/services/**/*.{js,ts}' declare module 'src/directives/**/*.{js,ts}' declare module 'src/graphql/**/*.sdl.{js,ts}' +declare module 'src/subscriptions/**/*.{js,ts}' diff --git a/yarn.lock b/yarn.lock index 57568ecc49de..b4495033ada8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7160,6 +7160,7 @@ __metadata: "@fastify/http-proxy": 9.1.0 "@fastify/static": 6.10.1 "@fastify/url-data": 5.3.1 + "@redwoodjs/graphql-server": 5.0.0 "@redwoodjs/project-config": 5.0.0 "@types/aws-lambda": 8.10.115 "@types/lodash.escape": 4.0.7 From 93838d3e3742499c01e33530ab01f1730fa6c6d3 Mon Sep 17 00:00:00 2001 From: Dominic Saadi Date: Thu, 18 May 2023 16:37:21 -0700 Subject: [PATCH 22/23] chore(package size): implement `findup-sync` in `@redwoodjs/project-config` (#8315) * chore: swap out findup-sync for lighter alt * cli * rest * update readme * update dep graphs * fix lint * swap external package for our own * follow-up fixes * fix eslint fn * update dep cruiser to 13 * lint fix --- .eslintrc.js | 6 +- packages/cli/package.json | 1 - packages/cli/src/index.js | 5 +- packages/cli/src/lib/index.js | 3 + packages/codemods/package.json | 3 +- .../v0.37.x/addDirectives/addDirectives.ts | 4 +- .../updateApiImports.yargs.ts | 5 +- .../v0.37.x/updateForms/updateForms.yargs.ts | 5 +- .../updateScenarios/updateScenarios.yargs.ts | 5 +- .../renameApiProxyPath/renameApiProxyPath.ts | 4 +- .../updateScaffoldStyles.ts | 4 +- .../updateSeedScript/updateSeedScript.ts | 5 +- .../updateBabelConfig/updateBabelConfig.ts | 9 +- .../updateCellMocks/updateCellMocks.yargs.ts | 5 +- .../updateRouterParamTypes.yargs.ts | 5 +- .../updateJestConfig/updateJestConfig.ts | 5 +- .../renameVerifierTimestamp.yargs.ts | 5 +- .../v0.48.x/upgradeYarn/upgradeYarn.ts | 4 +- .../updateDevFatalErrorPage.ts | 4 +- .../tsconfigForRouteHooks.ts | 5 +- .../configureFastify.yargs.ts | 7 +- .../updateResolverTypes.yargs.ts | 5 +- .../updateClerkGetCurrentUser.yargs.ts | 5 +- .../v4.x.x/useArmor/useArmor.yargs.ts | 10 +- .../renameValidateWith.yargs.ts | 5 +- .../updateAuth0ToV2/updateAuth0ToV2.yargs.ts | 7 +- .../updateNodeEngineTo18.ts | 4 +- .../upgradeToReact18/upgradeToReact18.ts | 8 +- packages/codemods/src/lib/cells.ts | 8 +- packages/codemods/src/lib/getRWPaths.ts | 286 ------------- .../codemods/src/lib/getRootPackageJSON.ts | 4 +- packages/codemods/src/lib/isTSProject.ts | 4 +- packages/codemods/src/lib/prettify.ts | 4 +- packages/codemods/src/lib/runTransform.ts | 2 - packages/codemods/src/lib/ts2js.ts | 5 +- .../src/testUtils/matchFolderTransform.ts | 2 +- .../templates/code/codemod.yargs.ts.template | 4 +- .../templates/structure/codemod.ts.template | 4 +- packages/internal/package.json | 2 - ...ncy-cruiser.js => .dependency-cruiser.mjs} | 2 +- packages/project-config/README.md | 12 +- .../project-config/dependency-graph-dist.svg | 391 +++++++----------- .../project-config/dependency-graph-src.svg | 224 +++++----- packages/project-config/package.json | 8 +- packages/project-config/src/configPath.ts | 4 +- packages/project-config/src/findUp.ts | 25 ++ packages/project-config/src/index.ts | 1 + packages/structure/package.json | 1 - yarn.lock | 99 +---- 49 files changed, 396 insertions(+), 839 deletions(-) delete mode 100644 packages/codemods/src/lib/getRWPaths.ts rename packages/project-config/{.dependency-cruiser.js => .dependency-cruiser.mjs} (99%) create mode 100644 packages/project-config/src/findUp.ts diff --git a/.eslintrc.js b/.eslintrc.js index 5f5970715501..9463f78e7f98 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,11 +1,11 @@ const path = require('path') -const findUp = require('findup-sync') +const { findUp } = require('@redwoodjs/project-config') // Framework Babel config is monorepo root ./babel.config.js -// `yarn lint` runs for each workspace, which needs findup for path to root +// `yarn lint` runs for each workspace, which needs findUp for path to root const findBabelConfig = (cwd = process.cwd()) => { - const configPath = findUp('babel.config.js', { cwd }) + const configPath = findUp('babel.config.js', cwd) if (!configPath) { throw new Error(`Eslint-parser could not find a "babel.config.js" file`) } diff --git a/packages/cli/package.json b/packages/cli/package.json index e549f9626774..6a5c27952d80 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -54,7 +54,6 @@ "envinfo": "7.8.1", "execa": "5.1.1", "fast-glob": "3.2.12", - "findup-sync": "5.0.0", "fs-extra": "11.1.1", "humanize-string": "2.1.0", "latest-version": "5.1.0", diff --git a/packages/cli/src/index.js b/packages/cli/src/index.js index 0c73c3e23543..1b8961a6b2b4 100644 --- a/packages/cli/src/index.js +++ b/packages/cli/src/index.js @@ -4,7 +4,6 @@ import fs from 'fs' import path from 'path' import { config } from 'dotenv-defaults' -import findup from 'findup-sync' import { hideBin, Parser } from 'yargs/helpers' import yargs from 'yargs/yargs' @@ -32,7 +31,7 @@ import * as testCommand from './commands/test' import * as tstojsCommand from './commands/ts-to-js' import * as typeCheckCommand from './commands/type-check' import * as upgradeCommand from './commands/upgrade' -import { getPaths } from './lib' +import { getPaths, findUp } from './lib' import * as updateCheck from './lib/updateCheck' // # Setting the CWD @@ -71,7 +70,7 @@ try { // `cwd` wasn't set. Odds are they're in a Redwood project, // but they could be in ./api or ./web, so we have to find up to be sure. - const redwoodTOMLPath = findup('redwood.toml', { cwd: process.cwd() }) + const redwoodTOMLPath = findUp('redwood.toml') if (!redwoodTOMLPath) { throw new Error( diff --git a/packages/cli/src/lib/index.js b/packages/cli/src/lib/index.js index 2095ccc5180e..b35236b86a1c 100644 --- a/packages/cli/src/lib/index.js +++ b/packages/cli/src/lib/index.js @@ -18,12 +18,15 @@ import { getConfig as getRedwoodConfig, getPaths as getRedwoodPaths, resolveFile as internalResolveFile, + findUp, } from '@redwoodjs/project-config' import c from './colors' import { addFileToRollback } from './rollback' import { pluralize, singularize } from './rwPluralize' +export { findUp } + export const asyncForEach = async (array, callback) => { for (let index = 0; index < array.length; index++) { await callback(array[index], index, array) diff --git a/packages/codemods/package.json b/packages/codemods/package.json index a029890f9193..90a47bda0fcc 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -29,6 +29,7 @@ "@babel/runtime-corejs3": "7.21.5", "@babel/traverse": "7.21.5", "@iarna/toml": "2.2.5", + "@redwoodjs/project-config": "5.0.0", "@vscode/ripgrep": "1.15.3", "@whatwg-node/fetch": "0.9.0", "cheerio": "1.0.0-rc.12", @@ -36,7 +37,6 @@ "deepmerge": "4.3.1", "execa": "5.1.1", "fast-glob": "3.2.12", - "findup-sync": "5.0.0", "graphql": "16.6.0", "jest": "29.5.0", "jscodeshift": "0.15.0", @@ -47,7 +47,6 @@ }, "devDependencies": { "@types/babel__core": "7.20.0", - "@types/findup-sync": "4.0.2", "@types/fs-extra": "11.0.1", "@types/jest": "29.5.1", "@types/jscodeshift": "0.11.6", diff --git a/packages/codemods/src/codemods/v0.37.x/addDirectives/addDirectives.ts b/packages/codemods/src/codemods/v0.37.x/addDirectives/addDirectives.ts index 07e5e89f200b..11554ac0d715 100644 --- a/packages/codemods/src/codemods/v0.37.x/addDirectives/addDirectives.ts +++ b/packages/codemods/src/codemods/v0.37.x/addDirectives/addDirectives.ts @@ -4,10 +4,10 @@ import path from 'path' import { fetch } from '@whatwg-node/fetch' import fg from 'fast-glob' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' export const addDirectives = async () => { - const rwPaths = getRWPaths() + const rwPaths = getPaths() /** * An object where the keys are resolved filenames and the values are (for the most part) URLs to fetch. diff --git a/packages/codemods/src/codemods/v0.37.x/updateApiImports/updateApiImports.yargs.ts b/packages/codemods/src/codemods/v0.37.x/updateApiImports/updateApiImports.yargs.ts index c006a7dfb462..d3851816e321 100644 --- a/packages/codemods/src/codemods/v0.37.x/updateApiImports/updateApiImports.yargs.ts +++ b/packages/codemods/src/codemods/v0.37.x/updateApiImports/updateApiImports.yargs.ts @@ -2,8 +2,9 @@ import path from 'path' import task from 'tasuku' +import { getPaths } from '@redwoodjs/project-config' + import getFilesWithPattern from '../../../lib/getFilesWithPattern' -import getRWPaths from '../../../lib/getRWPaths' import runTransform from '../../../lib/runTransform' export const command = 'update-api-imports' @@ -14,7 +15,7 @@ export const handler = () => { task( 'Updating @redwoodjs/api imports', async ({ setWarning }: { setWarning: any }) => { - const rwPaths = getRWPaths() + const rwPaths = getPaths() const files = getFilesWithPattern({ pattern: `from '@redwoodjs/api'`, diff --git a/packages/codemods/src/codemods/v0.37.x/updateForms/updateForms.yargs.ts b/packages/codemods/src/codemods/v0.37.x/updateForms/updateForms.yargs.ts index 61a0e69dd045..3d5095f8bd49 100644 --- a/packages/codemods/src/codemods/v0.37.x/updateForms/updateForms.yargs.ts +++ b/packages/codemods/src/codemods/v0.37.x/updateForms/updateForms.yargs.ts @@ -2,8 +2,9 @@ import path from 'path' import task from 'tasuku' +import { getPaths } from '@redwoodjs/project-config' + import getFilesWithPattern from '../../../lib/getFilesWithPattern' -import getRWPaths from '../../../lib/getRWPaths' import runTransform from '../../../lib/runTransform' export const command = 'update-forms' @@ -11,7 +12,7 @@ export const description = '(v0.36->v0.37) Updates @redwoodjs/forms props' export const handler = () => { task('Updating forms', async ({ setWarning }: { setWarning: any }) => { - const rwPaths = getRWPaths() + const rwPaths = getPaths() const files = getFilesWithPattern({ pattern: 'Form', diff --git a/packages/codemods/src/codemods/v0.37.x/updateScenarios/updateScenarios.yargs.ts b/packages/codemods/src/codemods/v0.37.x/updateScenarios/updateScenarios.yargs.ts index e9e26f2b767d..09e316487e7a 100644 --- a/packages/codemods/src/codemods/v0.37.x/updateScenarios/updateScenarios.yargs.ts +++ b/packages/codemods/src/codemods/v0.37.x/updateScenarios/updateScenarios.yargs.ts @@ -3,7 +3,8 @@ import path from 'path' import fg from 'fast-glob' import task from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import runTransform from '../../../lib/runTransform' export const command = 'update-scenarios' @@ -28,7 +29,7 @@ export const handler = () => { await runTransform({ transformPath: path.join(__dirname, 'updateScenarios.js'), targetPaths: fg.sync('api/src/services/**/*.scenarios.{js,ts}', { - cwd: getRWPaths().base, + cwd: getPaths().base, absolute: true, }), }) diff --git a/packages/codemods/src/codemods/v0.38.x/renameApiProxyPath/renameApiProxyPath.ts b/packages/codemods/src/codemods/v0.38.x/renameApiProxyPath/renameApiProxyPath.ts index 6fd3c6067a97..027b75926de3 100644 --- a/packages/codemods/src/codemods/v0.38.x/renameApiProxyPath/renameApiProxyPath.ts +++ b/packages/codemods/src/codemods/v0.38.x/renameApiProxyPath/renameApiProxyPath.ts @@ -1,10 +1,10 @@ import fs from 'fs' import path from 'path' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' export const renameApiProxyPath = () => { - const redwoodTOMLPath = path.join(getRWPaths().base, 'redwood.toml') + const redwoodTOMLPath = path.join(getPaths().base, 'redwood.toml') let redwoodTOML = fs.readFileSync(redwoodTOMLPath, 'utf8') redwoodTOML = redwoodTOML.replace('apiProxyPath', 'apiUrl') diff --git a/packages/codemods/src/codemods/v0.38.x/updateScaffoldStyles/updateScaffoldStyles.ts b/packages/codemods/src/codemods/v0.38.x/updateScaffoldStyles/updateScaffoldStyles.ts index a804f14d221e..6d0ee7c7b4d8 100644 --- a/packages/codemods/src/codemods/v0.38.x/updateScaffoldStyles/updateScaffoldStyles.ts +++ b/packages/codemods/src/codemods/v0.38.x/updateScaffoldStyles/updateScaffoldStyles.ts @@ -1,10 +1,10 @@ import fs from 'fs' import path from 'path' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' export const updateScaffoldStyles = () => { - const scaffoldCSSPath = path.join(getRWPaths().web.src, 'scaffold.css') + const scaffoldCSSPath = path.join(getPaths().web.src, 'scaffold.css') if (fs.existsSync(scaffoldCSSPath)) { let scaffoldCSS = fs.readFileSync(scaffoldCSSPath, 'utf8') diff --git a/packages/codemods/src/codemods/v0.38.x/updateSeedScript/updateSeedScript.ts b/packages/codemods/src/codemods/v0.38.x/updateSeedScript/updateSeedScript.ts index cb900b5075d1..261c91335718 100644 --- a/packages/codemods/src/codemods/v0.38.x/updateSeedScript/updateSeedScript.ts +++ b/packages/codemods/src/codemods/v0.38.x/updateSeedScript/updateSeedScript.ts @@ -3,8 +3,9 @@ import path from 'path' import { fetch } from '@whatwg-node/fetch' +import { getPaths } from '@redwoodjs/project-config' + import getRootPackageJson from '../../../lib/getRootPackageJSON' -import getRWPaths from '../../../lib/getRWPaths' import isTSProject from '../../../lib/isTSProject' import ts2js from '../../../lib/ts2js' @@ -32,7 +33,7 @@ export const updateSeedScript = async () => { /** * Add `scripts/seed.{js,ts}` template. */ - const rwPaths = getRWPaths() + const rwPaths = getPaths() const hasScripts = fs.existsSync(rwPaths.scripts) diff --git a/packages/codemods/src/codemods/v0.39.x/updateBabelConfig/updateBabelConfig.ts b/packages/codemods/src/codemods/v0.39.x/updateBabelConfig/updateBabelConfig.ts index 1beb1948c7f7..863bfb8aad61 100644 --- a/packages/codemods/src/codemods/v0.39.x/updateBabelConfig/updateBabelConfig.ts +++ b/packages/codemods/src/codemods/v0.39.x/updateBabelConfig/updateBabelConfig.ts @@ -1,14 +1,15 @@ import fs from 'fs' import path from 'path' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import prettify from '../../../lib/prettify' export const removeBabelConfig = async () => { - const rootBabelConfigPath = path.join(getRWPaths().base, 'babel.config.js') - const webBabelRcPath = path.join(getRWPaths().web.base, '.babelrc.js') + const rootBabelConfigPath = path.join(getPaths().base, 'babel.config.js') + const webBabelRcPath = path.join(getPaths().web.base, '.babelrc.js') - const webBabelConfigPath = path.join(getRWPaths().web.base, 'babel.config.js') + const webBabelConfigPath = path.join(getPaths().web.base, 'babel.config.js') // Remove root babel config if (fs.existsSync(rootBabelConfigPath)) { diff --git a/packages/codemods/src/codemods/v0.39.x/updateCellMocks/updateCellMocks.yargs.ts b/packages/codemods/src/codemods/v0.39.x/updateCellMocks/updateCellMocks.yargs.ts index 77b347a27576..ffb50251d116 100644 --- a/packages/codemods/src/codemods/v0.39.x/updateCellMocks/updateCellMocks.yargs.ts +++ b/packages/codemods/src/codemods/v0.39.x/updateCellMocks/updateCellMocks.yargs.ts @@ -4,7 +4,8 @@ import fg from 'fast-glob' import task from 'tasuku' import type { TaskInnerAPI } from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import runTransform from '../../../lib/runTransform' export const command = 'update-cell-mocks' @@ -12,7 +13,7 @@ export const description = '(v0.38->v0.39) Updates standard cell mocks to export functions, instead of objects' export const handler = () => { - const rwPaths = getRWPaths() + const rwPaths = getPaths() const cellMocks = fg.sync('**/*.mock.{js,ts}', { cwd: rwPaths.web.src, diff --git a/packages/codemods/src/codemods/v0.39.x/updateRouterParamTypes/updateRouterParamTypes.yargs.ts b/packages/codemods/src/codemods/v0.39.x/updateRouterParamTypes/updateRouterParamTypes.yargs.ts index ce78117b44b3..4b7cdce0602c 100644 --- a/packages/codemods/src/codemods/v0.39.x/updateRouterParamTypes/updateRouterParamTypes.yargs.ts +++ b/packages/codemods/src/codemods/v0.39.x/updateRouterParamTypes/updateRouterParamTypes.yargs.ts @@ -3,7 +3,8 @@ import path from 'path' import task from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import isTSProject from '../../../lib/isTSProject' import runTransform from '../../../lib/runTransform' @@ -14,7 +15,7 @@ export const handler = () => { task( 'Updating Routes.{tsx|js}', async ({ setWarning }: { setWarning: any }) => { - const rwPaths = getRWPaths() + const rwPaths = getPaths() const extns = isTSProject ? 'tsx' : 'js' const routesFilePath = path.join(rwPaths.web.src, `Routes.${extns}`) diff --git a/packages/codemods/src/codemods/v0.44.x/updateJestConfig/updateJestConfig.ts b/packages/codemods/src/codemods/v0.44.x/updateJestConfig/updateJestConfig.ts index 9c38cad3e349..420f07369e19 100644 --- a/packages/codemods/src/codemods/v0.44.x/updateJestConfig/updateJestConfig.ts +++ b/packages/codemods/src/codemods/v0.44.x/updateJestConfig/updateJestConfig.ts @@ -4,12 +4,13 @@ import fs from 'fs' import path from 'path' +import { getPaths } from '@redwoodjs/project-config' + import fetchFileFromTemplate from '../../../lib/fetchFileFromTemplate' -import getRWPaths from '../../../lib/getRWPaths' import runTransform from '../../../lib/runTransform' export default async function updateJestConfig() { - const rwPaths = getRWPaths() + const rwPaths = getPaths() /** * @type JestConfigPaths diff --git a/packages/codemods/src/codemods/v0.48.x/renameVerifierTimestamp/renameVerifierTimestamp.yargs.ts b/packages/codemods/src/codemods/v0.48.x/renameVerifierTimestamp/renameVerifierTimestamp.yargs.ts index 84ffa8f95de8..823850f62853 100644 --- a/packages/codemods/src/codemods/v0.48.x/renameVerifierTimestamp/renameVerifierTimestamp.yargs.ts +++ b/packages/codemods/src/codemods/v0.48.x/renameVerifierTimestamp/renameVerifierTimestamp.yargs.ts @@ -4,7 +4,8 @@ import fg from 'fast-glob' import task from 'tasuku' import { TaskInnerAPI } from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import runTransform from '../../../lib/runTransform' export const command = 'rename-verifier-timestamp' @@ -37,7 +38,7 @@ export const handler = () => { await runTransform({ transformPath: path.join(__dirname, 'renameVerifierTimestamp.js'), targetPaths: fg.sync('/**/*.{js,ts}', { - cwd: getRWPaths().api.functions, + cwd: getPaths().api.functions, absolute: true, }), }) diff --git a/packages/codemods/src/codemods/v0.48.x/upgradeYarn/upgradeYarn.ts b/packages/codemods/src/codemods/v0.48.x/upgradeYarn/upgradeYarn.ts index 314461db8b16..8c1dac199ccc 100644 --- a/packages/codemods/src/codemods/v0.48.x/upgradeYarn/upgradeYarn.ts +++ b/packages/codemods/src/codemods/v0.48.x/upgradeYarn/upgradeYarn.ts @@ -2,10 +2,10 @@ import { spawnSync } from 'child_process' import fs from 'fs' import path from 'path' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' async function upgradeYarn() { - const rwPaths = getRWPaths() + const rwPaths = getPaths() console.log('Preparing and enabling corepack...') diff --git a/packages/codemods/src/codemods/v0.50.x/updateDevFatalErrorPage/updateDevFatalErrorPage.ts b/packages/codemods/src/codemods/v0.50.x/updateDevFatalErrorPage/updateDevFatalErrorPage.ts index 77efedcddda9..18e47c89794d 100644 --- a/packages/codemods/src/codemods/v0.50.x/updateDevFatalErrorPage/updateDevFatalErrorPage.ts +++ b/packages/codemods/src/codemods/v0.50.x/updateDevFatalErrorPage/updateDevFatalErrorPage.ts @@ -3,10 +3,10 @@ import path from 'path' import { fetch } from '@whatwg-node/fetch' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' export const updateDevFatalErrorPage = async () => { - const rwPaths = getRWPaths() + const rwPaths = getPaths() /** * An object where the keys are resolved filenames and the values are (for the most part) URLs to fetch. diff --git a/packages/codemods/src/codemods/v2.3.x/tsconfigForRouteHooks/tsconfigForRouteHooks.ts b/packages/codemods/src/codemods/v2.3.x/tsconfigForRouteHooks/tsconfigForRouteHooks.ts index 16ff8699594a..bd30a857a289 100644 --- a/packages/codemods/src/codemods/v2.3.x/tsconfigForRouteHooks/tsconfigForRouteHooks.ts +++ b/packages/codemods/src/codemods/v2.3.x/tsconfigForRouteHooks/tsconfigForRouteHooks.ts @@ -1,4 +1,5 @@ -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import prettify from '../../../lib/prettify' export default async function addApiAliasToTsConfig() { @@ -6,7 +7,7 @@ export default async function addApiAliasToTsConfig() { const ts = await import('typescript') const webConfigPath = ts.findConfigFile( - getRWPaths().web.base, + getPaths().web.base, ts.sys.fileExists ) diff --git a/packages/codemods/src/codemods/v2.x.x/configureFastify/configureFastify.yargs.ts b/packages/codemods/src/codemods/v2.x.x/configureFastify/configureFastify.yargs.ts index cb44ade29267..8180f0901c6e 100644 --- a/packages/codemods/src/codemods/v2.x.x/configureFastify/configureFastify.yargs.ts +++ b/packages/codemods/src/codemods/v2.x.x/configureFastify/configureFastify.yargs.ts @@ -5,7 +5,8 @@ import { fetch } from '@whatwg-node/fetch' import fg from 'fast-glob' import task from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import prettify from '../../../lib/prettify' import runTransform from '../../../lib/runTransform' @@ -16,7 +17,7 @@ export const description = export const handler = () => { task('Configure Fastify', async ({ setOutput }) => { const [API_SERVER_CONFIG_PATH] = fg.sync('server.config.{js,ts}', { - cwd: getRWPaths().api.base, + cwd: getPaths().api.base, absolute: true, }) @@ -46,7 +47,7 @@ export const handler = () => { const text = await res.text() const NEW_API_SERVER_CONFIG_PATH = path.join( - getRWPaths().api.base, + getPaths().api.base, 'server.config.js' ) diff --git a/packages/codemods/src/codemods/v2.x.x/updateResolverTypes/updateResolverTypes.yargs.ts b/packages/codemods/src/codemods/v2.x.x/updateResolverTypes/updateResolverTypes.yargs.ts index 00ffd3ca77c1..901f2bd1132c 100644 --- a/packages/codemods/src/codemods/v2.x.x/updateResolverTypes/updateResolverTypes.yargs.ts +++ b/packages/codemods/src/codemods/v2.x.x/updateResolverTypes/updateResolverTypes.yargs.ts @@ -3,7 +3,8 @@ import path from 'path' import fg from 'fast-glob' import task, { TaskInnerAPI } from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import runTransform from '../../../lib/runTransform' export const command = 'update-resolver-types' @@ -16,7 +17,7 @@ export const handler = () => { transformPath: path.join(__dirname, 'updateResolverTypes.js'), // Target services written in TS only targetPaths: fg.sync('**/*.ts', { - cwd: getRWPaths().api.services, + cwd: getPaths().api.services, ignore: ['**/node_modules/**', '**/*.test.ts', '**/*.scenarios.ts'], absolute: true, }), diff --git a/packages/codemods/src/codemods/v4.2.x/updateClerkGetCurrentUser/updateClerkGetCurrentUser.yargs.ts b/packages/codemods/src/codemods/v4.2.x/updateClerkGetCurrentUser/updateClerkGetCurrentUser.yargs.ts index a4ca472a298f..4643dd49c1c1 100644 --- a/packages/codemods/src/codemods/v4.2.x/updateClerkGetCurrentUser/updateClerkGetCurrentUser.yargs.ts +++ b/packages/codemods/src/codemods/v4.2.x/updateClerkGetCurrentUser/updateClerkGetCurrentUser.yargs.ts @@ -2,7 +2,8 @@ import path from 'path' import task, { TaskInnerAPI } from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import isTSProject from '../../../lib/isTSProject' import runTransform from '../../../lib/runTransform' @@ -16,7 +17,7 @@ export const handler = () => { await runTransform({ transformPath: path.join(__dirname, 'updateClerkGetCurrentUser.js'), - targetPaths: [path.join(getRWPaths().api.base, 'src', 'lib', authFile)], + targetPaths: [path.join(getPaths().api.base, 'src', 'lib', authFile)], }) setOutput('All done! Run `yarn rw lint --fix` to prettify your code') diff --git a/packages/codemods/src/codemods/v4.x.x/useArmor/useArmor.yargs.ts b/packages/codemods/src/codemods/v4.x.x/useArmor/useArmor.yargs.ts index 639a6d2be02e..68a6d6d9ae64 100644 --- a/packages/codemods/src/codemods/v4.x.x/useArmor/useArmor.yargs.ts +++ b/packages/codemods/src/codemods/v4.x.x/useArmor/useArmor.yargs.ts @@ -2,7 +2,8 @@ import path from 'path' import task from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import isTSProject from '../../../lib/isTSProject' import runTransform from '../../../lib/runTransform' @@ -16,12 +17,7 @@ export const handler = () => { await runTransform({ transformPath: path.join(__dirname, 'useArmor.js'), targetPaths: [ - path.join( - getRWPaths().api.base, - 'src', - 'functions', - graphqlHandlerFile - ), + path.join(getPaths().api.base, 'src', 'functions', graphqlHandlerFile), ], }) diff --git a/packages/codemods/src/codemods/v5.x.x/renameValidateWith/renameValidateWith.yargs.ts b/packages/codemods/src/codemods/v5.x.x/renameValidateWith/renameValidateWith.yargs.ts index 3ddb3fe90df0..b36f01ad02d7 100644 --- a/packages/codemods/src/codemods/v5.x.x/renameValidateWith/renameValidateWith.yargs.ts +++ b/packages/codemods/src/codemods/v5.x.x/renameValidateWith/renameValidateWith.yargs.ts @@ -2,8 +2,9 @@ import path from 'path' import task from 'tasuku' +import { getPaths } from '@redwoodjs/project-config' + import getFilesWithPattern from '../../../lib/getFilesWithPattern' -import getRWPaths from '../../../lib/getRWPaths' import runTransform from '../../../lib/runTransform' export const command = 'rename-validate-with' @@ -15,7 +16,7 @@ export const handler = () => { task( 'Renaming `validateWith` to `validateWithSync`', async ({ setOutput }) => { - const redwoodProjectPaths = getRWPaths() + const redwoodProjectPaths = getPaths() const files = getFilesWithPattern({ pattern: 'validateWith', diff --git a/packages/codemods/src/codemods/v5.x.x/updateAuth0ToV2/updateAuth0ToV2.yargs.ts b/packages/codemods/src/codemods/v5.x.x/updateAuth0ToV2/updateAuth0ToV2.yargs.ts index 0fc710584a65..6e0cf1a30f58 100644 --- a/packages/codemods/src/codemods/v5.x.x/updateAuth0ToV2/updateAuth0ToV2.yargs.ts +++ b/packages/codemods/src/codemods/v5.x.x/updateAuth0ToV2/updateAuth0ToV2.yargs.ts @@ -3,7 +3,8 @@ import path from 'path' import execa from 'execa' import task from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import isTSProject from '../../../lib/isTSProject' import runTransform from '../../../lib/runTransform' @@ -18,7 +19,7 @@ export const handler = () => { try { await execa.command('yarn up @auth0/auth0-spa-js@^2', { - cwd: getRWPaths().web.base, + cwd: getPaths().web.base, }) } catch { console.error( @@ -28,7 +29,7 @@ export const handler = () => { await runTransform({ transformPath: path.join(__dirname, 'updateAuth0ToV2.js'), - targetPaths: [path.join(getRWPaths().web.src, authFile)], + targetPaths: [path.join(getPaths().web.src, authFile)], }) setOutput('All done! Run `yarn rw lint --fix` to prettify your code') diff --git a/packages/codemods/src/codemods/v5.x.x/updateNodeEngineTo18/updateNodeEngineTo18.ts b/packages/codemods/src/codemods/v5.x.x/updateNodeEngineTo18/updateNodeEngineTo18.ts index 51eadc279789..b728547d449d 100644 --- a/packages/codemods/src/codemods/v5.x.x/updateNodeEngineTo18/updateNodeEngineTo18.ts +++ b/packages/codemods/src/codemods/v5.x.x/updateNodeEngineTo18/updateNodeEngineTo18.ts @@ -1,10 +1,10 @@ import fs from 'fs' import path from 'path' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' async function updateNodeEngineTo18() { - const packageJSONPath = path.join(getRWPaths().base, 'package.json') + const packageJSONPath = path.join(getPaths().base, 'package.json') const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf-8')) packageJSON.engines.node = '=18.x' diff --git a/packages/codemods/src/codemods/v5.x.x/upgradeToReact18/upgradeToReact18.ts b/packages/codemods/src/codemods/v5.x.x/upgradeToReact18/upgradeToReact18.ts index da73c25fdf36..5fb15c617966 100644 --- a/packages/codemods/src/codemods/v5.x.x/upgradeToReact18/upgradeToReact18.ts +++ b/packages/codemods/src/codemods/v5.x.x/upgradeToReact18/upgradeToReact18.ts @@ -5,10 +5,10 @@ import { load } from 'cheerio' import execa from 'execa' import type { TaskInnerAPI } from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' function checkAndTransformReactRoot(taskContext: TaskInnerAPI) { - const indexHTMLFilepath = path.join(getRWPaths().web.src, 'index.html') + const indexHTMLFilepath = path.join(getPaths().web.src, 'index.html') const indexHTML = load(fs.readFileSync(indexHTMLFilepath, 'utf-8')) @@ -50,7 +50,7 @@ function checkAndTransformReactRoot(taskContext: TaskInnerAPI) { } async function upgradeReactDepsTo18() { - const redwoodProjectPaths = getRWPaths() + const redwoodProjectPaths = getPaths() const webPackageJSONPath = path.join( redwoodProjectPaths.web.base, @@ -82,7 +82,7 @@ async function upgradeReactDepsTo18() { async function checkAndUpdateCustomWebIndex(taskContext: TaskInnerAPI) { // First check if the custom web index exists. If it doesn't, this is a no-op. - const redwoodProjectPaths = getRWPaths() + const redwoodProjectPaths = getPaths() const bundlerToCustomWebIndex = { vite: path.join(redwoodProjectPaths.web.src, 'entry-client.jsx'), diff --git a/packages/codemods/src/lib/cells.ts b/packages/codemods/src/lib/cells.ts index a1da8652bbc7..54e69bf0357c 100644 --- a/packages/codemods/src/lib/cells.ts +++ b/packages/codemods/src/lib/cells.ts @@ -15,9 +15,9 @@ import { visit, } from 'graphql' -import getRWPaths from './getRWPaths' +import { getPaths } from '@redwoodjs/project-config' -export const findCells = (cwd: string = getRWPaths().web.src) => { +export const findCells = (cwd: string = getPaths().web.src) => { const modules = fg.sync('**/*Cell.{js,jsx,ts,tsx}', { cwd, absolute: true, @@ -30,7 +30,7 @@ export const isCellFile = (p: string) => { const { dir, name } = path.parse(p) // If the path isn't on the web side it cannot be a cell - if (!isFileInsideFolder(p, getRWPaths().web.src)) { + if (!isFileInsideFolder(p, getPaths().web.src)) { return false } @@ -139,7 +139,7 @@ export const fileToAst = (filePath: string): types.Node => { // use jsx plugin for web files, because in JS, the .jsx extension is not used const isJsxFile = path.extname(filePath).match(/[jt]sx$/) || - isFileInsideFolder(filePath, getRWPaths().web.base) + isFileInsideFolder(filePath, getPaths().web.base) const plugins = [ 'typescript', diff --git a/packages/codemods/src/lib/getRWPaths.ts b/packages/codemods/src/lib/getRWPaths.ts deleted file mode 100644 index 595acfee2da1..000000000000 --- a/packages/codemods/src/lib/getRWPaths.ts +++ /dev/null @@ -1,286 +0,0 @@ -import fs from 'fs' -import path from 'path' - -import toml from '@iarna/toml' -import merge from 'deepmerge' -import findUp from 'findup-sync' - -enum TargetEnum { - NODE = 'node', - BROWSER = 'browser', - REACT_NATIVE = 'react-native', - ELECTRON = 'electron', -} - -interface NodeTargetConfig { - title: string - name?: string - host: string - port: number - path: string - target: TargetEnum.NODE - schemaPath: string -} - -interface BrowserTargetConfig { - title: string - name?: string - host: string - port: number - path: string - target: TargetEnum.BROWSER - // TODO: apiProxyHost: string - apiProxyPort: number - apiProxyPath: string - fastRefresh: boolean - a11y: boolean -} - -interface Config { - web: BrowserTargetConfig - api: NodeTargetConfig - browser: { - open: boolean | string - } - generate: { - tests: boolean - stories: boolean - nestScaffoldByModel: boolean - } -} - -// Note that web's includeEnvironmentVariables is handled in `webpack.common.js` -// https://github.com/redwoodjs/redwood/blob/d51ade08118c17459cebcdb496197ea52485364a/packages/core/config/webpack.common.js#L19 -const DEFAULT_CONFIG: Config = { - web: { - title: 'Redwood App', - host: 'localhost', - port: 8910, - path: './web', - target: TargetEnum.BROWSER, - apiProxyPath: '/.netlify/functions', - apiProxyPort: 8911, - fastRefresh: true, - a11y: true, - }, - api: { - title: 'Redwood App', - host: 'localhost', - port: 8911, - path: './api', - target: TargetEnum.NODE, - schemaPath: './api/db/schema.prisma', - }, - browser: { - open: false, - }, - generate: { - tests: true, - stories: true, - nestScaffoldByModel: true, - }, -} - -/** - * These configuration options are modified by the user via the Redwood - * config file. - */ -const getConfig = (configPath = getConfigPath()): Config => { - try { - const rawConfig = fs.readFileSync(configPath, 'utf8') - return merge(DEFAULT_CONFIG, toml.parse(rawConfig)) - } catch (e) { - throw new Error(`Could not parse "${configPath}": ${e}`) - } -} - -interface NodeTargetPaths { - base: string - dataMigrations: string - directives: string - db: string - dbSchema: string - src: string - functions: string - graphql: string - lib: string - generators: string - services: string - config: string - dist: string - types: string -} - -interface BrowserTargetPaths { - base: string - src: string - app: string - generators: string - index: string | null - routes: string - pages: string - components: string - layouts: string - config: string - webpack: string - postcss: string - storybookConfig: string - storybookPreviewConfig: string - dist: string - types: string -} - -interface Paths { - base: string - generated: { - base: string - schema: string - types: { - includes: string - mirror: string - } - prebuild: string - } - web: BrowserTargetPaths - api: NodeTargetPaths - scripts: string -} - -const CONFIG_FILE_NAME = 'redwood.toml' - -// TODO: Remove these. -const PATH_API_DIR_FUNCTIONS = 'api/src/functions' -const PATH_RW_SCRIPTS = 'scripts' -const PATH_API_DIR_GRAPHQL = 'api/src/graphql' -const PATH_API_DIR_CONFIG = 'api/src/config' -const PATH_API_DIR_LIB = 'api/src/lib' -const PATH_API_DIR_GENERATORS = 'api/generators' -const PATH_API_DIR_SERVICES = 'api/src/services' -const PATH_API_DIR_DIRECTIVES = 'api/src/directives' -const PATH_API_DIR_SRC = 'api/src' -const PATH_WEB_ROUTES = 'web/src/Routes' // .js|.tsx -const PATH_WEB_DIR_LAYOUTS = 'web/src/layouts/' -const PATH_WEB_DIR_PAGES = 'web/src/pages/' -const PATH_WEB_DIR_COMPONENTS = 'web/src/components' -const PATH_WEB_DIR_SRC = 'web/src' -const PATH_WEB_DIR_SRC_APP = 'web/src/App' -const PATH_WEB_DIR_SRC_INDEX = 'web/src/index' // .js|.tsx -const PATH_WEB_DIR_GENERATORS = 'web/generators' -const PATH_WEB_DIR_CONFIG = 'web/config' -const PATH_WEB_DIR_CONFIG_WEBPACK = 'web/config/webpack.config.js' -const PATH_WEB_DIR_CONFIG_POSTCSS = 'web/config/postcss.config.js' -const PATH_WEB_DIR_CONFIG_STORYBOOK_CONFIG = 'web/config/storybook.config.js' -const PATH_WEB_DIR_CONFIG_STORYBOOK_PREVIEW = 'web/config/storybook.preview.js' - -const PATH_WEB_DIR_DIST = 'web/dist' - -/** - * Search the parent directories for the Redwood configuration file. - */ -const getConfigPath = ( - cwd: string = process.env.RWJS_CWD ?? process.cwd() -): string => { - const configPath = findUp(CONFIG_FILE_NAME, { cwd }) - if (!configPath) { - throw new Error( - `Could not find a "${CONFIG_FILE_NAME}" file, are you sure you're in a Redwood project?` - ) - } - return configPath -} - -/** - * The Redwood config file is used as an anchor for the base directory of a project. - */ -const getBaseDir = (configPath: string = getConfigPath()): string => { - return path.dirname(configPath) -} - -/** - * Use this to resolve files when the path to the file is known, - * but the extension is not. - */ -const resolveFile = ( - filePath: string, - extensions: string[] = ['.js', '.tsx', '.ts', '.jsx'] -): string | null => { - for (const extension of extensions) { - const p = `${filePath}${extension}` - if (fs.existsSync(p)) { - return p - } - } - return null -} - -/** - * Path constants that are relevant to a Redwood project. - */ -// TODO: Make this a proxy and make it lazy. -const getRWPaths = (BASE_DIR: string = getBaseDir()): Paths => { - const routes = resolveFile(path.join(BASE_DIR, PATH_WEB_ROUTES)) as string - const { schemaPath } = getConfig(getConfigPath(BASE_DIR)).api - const schemaDir = path.dirname(schemaPath) - - const paths = { - base: BASE_DIR, - - generated: { - base: path.join(BASE_DIR, '.redwood'), - schema: path.join(BASE_DIR, '.redwood/schema.graphql'), - types: { - includes: path.join(BASE_DIR, '.redwood/types/includes'), - mirror: path.join(BASE_DIR, '.redwood/types/mirror'), - }, - prebuild: path.join(BASE_DIR, '.redwood/prebuild'), - }, - - scripts: path.join(BASE_DIR, PATH_RW_SCRIPTS), - - api: { - base: path.join(BASE_DIR, 'api'), - dataMigrations: path.join(BASE_DIR, schemaDir, 'dataMigrations'), - db: path.join(BASE_DIR, schemaDir), - dbSchema: path.join(BASE_DIR, schemaPath), - functions: path.join(BASE_DIR, PATH_API_DIR_FUNCTIONS), - graphql: path.join(BASE_DIR, PATH_API_DIR_GRAPHQL), - lib: path.join(BASE_DIR, PATH_API_DIR_LIB), - generators: path.join(BASE_DIR, PATH_API_DIR_GENERATORS), - config: path.join(BASE_DIR, PATH_API_DIR_CONFIG), - services: path.join(BASE_DIR, PATH_API_DIR_SERVICES), - directives: path.join(BASE_DIR, PATH_API_DIR_DIRECTIVES), - src: path.join(BASE_DIR, PATH_API_DIR_SRC), - dist: path.join(BASE_DIR, 'api/dist'), - types: path.join(BASE_DIR, 'api/types'), - }, - - web: { - routes, - base: path.join(BASE_DIR, 'web'), - pages: path.join(BASE_DIR, PATH_WEB_DIR_PAGES), - components: path.join(BASE_DIR, PATH_WEB_DIR_COMPONENTS), - layouts: path.join(BASE_DIR, PATH_WEB_DIR_LAYOUTS), - src: path.join(BASE_DIR, PATH_WEB_DIR_SRC), - generators: path.join(BASE_DIR, PATH_WEB_DIR_GENERATORS), - app: resolveFile(path.join(BASE_DIR, PATH_WEB_DIR_SRC_APP)) as string, - index: resolveFile(path.join(BASE_DIR, PATH_WEB_DIR_SRC_INDEX)), - config: path.join(BASE_DIR, PATH_WEB_DIR_CONFIG), - webpack: path.join(BASE_DIR, PATH_WEB_DIR_CONFIG_WEBPACK), - postcss: path.join(BASE_DIR, PATH_WEB_DIR_CONFIG_POSTCSS), - storybookConfig: path.join( - BASE_DIR, - PATH_WEB_DIR_CONFIG_STORYBOOK_CONFIG - ), - storybookPreviewConfig: path.join( - BASE_DIR, - PATH_WEB_DIR_CONFIG_STORYBOOK_PREVIEW - ), - dist: path.join(BASE_DIR, PATH_WEB_DIR_DIST), - types: path.join(BASE_DIR, 'web/types'), - }, - } - - return paths -} - -export default getRWPaths diff --git a/packages/codemods/src/lib/getRootPackageJSON.ts b/packages/codemods/src/lib/getRootPackageJSON.ts index ddaea760bfd4..f68c3a52a605 100644 --- a/packages/codemods/src/lib/getRootPackageJSON.ts +++ b/packages/codemods/src/lib/getRootPackageJSON.ts @@ -1,10 +1,10 @@ import fs from 'fs' import path from 'path' -import getRWPaths from './getRWPaths' +import { getPaths } from '@redwoodjs/project-config' const getRootPackageJSON = () => { - const rootPackageJSONPath = path.join(getRWPaths().base, 'package.json') + const rootPackageJSONPath = path.join(getPaths().base, 'package.json') const rootPackageJSON = JSON.parse( fs.readFileSync(rootPackageJSONPath, 'utf8') diff --git a/packages/codemods/src/lib/isTSProject.ts b/packages/codemods/src/lib/isTSProject.ts index 8c41913386fc..51fb3a1fa5a6 100644 --- a/packages/codemods/src/lib/isTSProject.ts +++ b/packages/codemods/src/lib/isTSProject.ts @@ -1,9 +1,9 @@ import fg from 'fast-glob' -import getRWPaths from './getRWPaths' +import { getPaths } from '@redwoodjs/project-config' const isTSProject = - fg.sync(`${getRWPaths().base}/**/tsconfig.json`, { + fg.sync(`${getPaths().base}/**/tsconfig.json`, { ignore: ['**/node_modules/**'], }).length > 0 diff --git a/packages/codemods/src/lib/prettify.ts b/packages/codemods/src/lib/prettify.ts index 6468bb6a6fed..7a2927f24e85 100644 --- a/packages/codemods/src/lib/prettify.ts +++ b/packages/codemods/src/lib/prettify.ts @@ -2,11 +2,11 @@ import path from 'path' import { format } from 'prettier' -import getRWPaths from './getRWPaths' +import { getPaths } from '@redwoodjs/project-config' const getPrettierConfig = () => { try { - return require(path.join(getRWPaths().base, 'prettier.config.js')) + return require(path.join(getPaths().base, 'prettier.config.js')) } catch (e) { return undefined } diff --git a/packages/codemods/src/lib/runTransform.ts b/packages/codemods/src/lib/runTransform.ts index 84aff65f8a41..ce4c069d5a11 100644 --- a/packages/codemods/src/lib/runTransform.ts +++ b/packages/codemods/src/lib/runTransform.ts @@ -5,8 +5,6 @@ * @see prisma/codemods {@link https://github.com/prisma/codemods/blob/main/utils/runner.ts} * @see react-codemod {@link https://github.com/reactjs/react-codemod/blob/master/bin/cli.js} */ - -// @ts-expect-error We don't have this in types but need for workaround https://github.com/facebook/jscodeshift/issues/398 import * as jscodeshift from 'jscodeshift/src/Runner' const defaultJscodeshiftOpts = { diff --git a/packages/codemods/src/lib/ts2js.ts b/packages/codemods/src/lib/ts2js.ts index a5c63c0e973e..926f47fd1b19 100644 --- a/packages/codemods/src/lib/ts2js.ts +++ b/packages/codemods/src/lib/ts2js.ts @@ -1,11 +1,12 @@ import { transform } from '@babel/core' -import getRWPaths from './getRWPaths' +import { getPaths } from '@redwoodjs/project-config' + import prettify from './prettify' const ts2js = (file: string) => { const result = transform(file, { - cwd: getRWPaths().base, + cwd: getPaths().base, configFile: false, plugins: [ [ diff --git a/packages/codemods/src/testUtils/matchFolderTransform.ts b/packages/codemods/src/testUtils/matchFolderTransform.ts index c4ccf71330aa..ba0bdeca2d2d 100644 --- a/packages/codemods/src/testUtils/matchFolderTransform.ts +++ b/packages/codemods/src/testUtils/matchFolderTransform.ts @@ -42,7 +42,7 @@ export const matchFolderTransform = async ( const GLOB_CONFIG = { absolute: false, dot: true, - ignore: ['redwood.toml', '**/*.DS_Store'], // ignore the fake redwood.toml added for getRWPaths + ignore: ['redwood.toml', '**/*.DS_Store'], // ignore the fake redwood.toml added for getPaths } const transformedPaths = fg.sync('**/*', { ...GLOB_CONFIG, cwd: tempDir }) diff --git a/packages/codemods/tasks/generateCodemod/templates/code/codemod.yargs.ts.template b/packages/codemods/tasks/generateCodemod/templates/code/codemod.yargs.ts.template index 2b5f2e06d7ff..3a21464546f7 100644 --- a/packages/codemods/tasks/generateCodemod/templates/code/codemod.yargs.ts.template +++ b/packages/codemods/tasks/generateCodemod/templates/code/codemod.yargs.ts.template @@ -2,7 +2,7 @@ import path from 'path' import task, { TaskInnerAPI } from 'tasuku' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' import runTransform from '../../../lib/runTransform' export const command = '${kebabName}' @@ -17,7 +17,7 @@ export const handler = () => { // Here we know exactly which file we need to transform, but often times you won't. // If you need to transform files based on their name, location, etc, use `fast-glob`. // If you need to transform files based on their contents, use `getFilesWithPattern`. - targetPaths: [path.join(getRWPaths().base, 'redwood.toml')], + targetPaths: [path.join(getPaths().base, 'redwood.toml')], }) setOutput('All done! Run `yarn rw lint --fix` to prettify your code') diff --git a/packages/codemods/tasks/generateCodemod/templates/structure/codemod.ts.template b/packages/codemods/tasks/generateCodemod/templates/structure/codemod.ts.template index bc3b0af26d51..f1985f27bbb3 100644 --- a/packages/codemods/tasks/generateCodemod/templates/structure/codemod.ts.template +++ b/packages/codemods/tasks/generateCodemod/templates/structure/codemod.ts.template @@ -1,11 +1,11 @@ import fs from 'fs' import path from 'path' -import getRWPaths from '../../../lib/getRWPaths' +import { getPaths } from '@redwoodjs/project-config' async function ${name}() { const fileThatShouldntBeThereAnymore = path.join( - getRWPaths().base, + getPaths().base, 'babel.config.js' ) fs.rmSync(fileThatShouldntBeThereAnymore) diff --git a/packages/internal/package.json b/packages/internal/package.json index 235eb33b84ee..91bb5c268be1 100644 --- a/packages/internal/package.json +++ b/packages/internal/package.json @@ -50,7 +50,6 @@ "deepmerge": "4.3.1", "esbuild": "0.17.19", "fast-glob": "3.2.12", - "findup-sync": "5.0.0", "fs-extra": "11.1.1", "graphql": "16.6.0", "kill-port": "1.6.1", @@ -67,7 +66,6 @@ "@babel/core": "7.21.8", "@types/babel-plugin-tester": "9.0.5", "@types/babel__core": "7.20.0", - "@types/findup-sync": "4.0.2", "@types/fs-extra": "11.0.1", "babel-plugin-tester": "11.0.4", "graphql-tag": "2.12.6", diff --git a/packages/project-config/.dependency-cruiser.js b/packages/project-config/.dependency-cruiser.mjs similarity index 99% rename from packages/project-config/.dependency-cruiser.js rename to packages/project-config/.dependency-cruiser.mjs index 54f2573d7670..f96801d037f4 100644 --- a/packages/project-config/.dependency-cruiser.js +++ b/packages/project-config/.dependency-cruiser.mjs @@ -1,5 +1,5 @@ /** @type {import('dependency-cruiser').IConfiguration} */ -module.exports = { +export default { forbidden: [ /* rules from the 'recommended' preset: */ { diff --git a/packages/project-config/README.md b/packages/project-config/README.md index 4b962ccce8c4..90d24f87c1a0 100644 --- a/packages/project-config/README.md +++ b/packages/project-config/README.md @@ -5,15 +5,13 @@ > This is a new internal package. There are still changes we want to make, so we're marking it as experimental for now. > **Don't depend on this directly in a Redwood project**. -This offers functionality to parse the Redwood configurations and a way to get a project's paths. +This package offers functionality to parse Redwood's configuration file, redwood.toml, and a convenient way of getting a Redwood project's paths. -## The base directory +## Package size -Redwood is anchored to a single `redwood.toml` file. We use this to determine the base directory of a project. - -## Sides - -Redwood separates your project into sides, by default we have a "web side" and an "api side." Each side has a target ("browser" for "web" and "node" for "api"). We use the concept of sides and targets to determine how to build, test, lint and manage your project. +| Version | Publish | Install | +| :--------------------------------------------------------------------------------- | :------ | :------ | +| [v5.2.1](https://packagephobia.com/result?p=%40redwoodjs%2Fproject-config%405.2.1) | 96.6 kB | 809 kB | ## Dependency graphs diff --git a/packages/project-config/dependency-graph-dist.svg b/packages/project-config/dependency-graph-dist.svg index dda994eb756c..b1f6080238d3 100644 --- a/packages/project-config/dependency-graph-dist.svg +++ b/packages/project-config/dependency-graph-dist.svg @@ -4,326 +4,217 @@ - - + + dependency-cruiser output - + cluster_dist - -dist + +dist cluster_node_modules - -node_modules + +node_modules -cluster_node_modules/@babel - -@babel - - cluster_node_modules/@iarna - -@iarna + +@iarna dist/config.d.ts - -config.d.ts -0% + +config.d.ts +50% - + -dist/config.js - - -config.js -70% +node_modules/@iarna/toml + + + + + +toml - + + +dist/config.d.ts->node_modules/@iarna/toml + + + + -dist/configPath.js - - -configPath.js -43% +dist/configPath.d.ts + + +configPath.d.ts +0% - - -dist/config.js->dist/configPath.js - - - - + -node_modules/@babel/runtime-corejs3 - - - - - -runtime-corejs3 +dist/findUp.d.ts + + +findUp.d.ts +0% - - -dist/config.js->node_modules/@babel/runtime-corejs3 - - - - + -node_modules/@iarna/toml - - - - - -toml +dist/index.d.ts + + +index.d.ts +100% - + + +dist/index.d.ts->dist/config.d.ts + + + + -dist/config.js->node_modules/@iarna/toml - - +dist/index.d.ts->dist/configPath.d.ts + + - + + +dist/index.d.ts->dist/findUp.d.ts + + + + -node_modules/deepmerge - - - - - -deepmerge +dist/paths.d.ts + + +paths.d.ts +0% - - -dist/config.js->node_modules/deepmerge - - + + +dist/index.d.ts->dist/paths.d.ts + + - + -fs - - -fs +dist/index.js + + +index.js +100% - - -dist/config.js->fs - - + + +dist/index.js->node_modules/@iarna/toml + + - + -node_modules/string-env-interpolation - - - - - -string-env-interpolation +node_modules/deepmerge + + + + + +deepmerge - - -dist/config.js->node_modules/string-env-interpolation - - - - + -dist/configPath.js->node_modules/@babel/runtime-corejs3 - - +dist/index.js->node_modules/deepmerge + + - - -node_modules/findup-sync - - - - - -findup-sync + + +node_modules/fast-glob + + + + + +fast-glob - + -dist/configPath.js->node_modules/findup-sync - - +dist/index.js->node_modules/fast-glob + + - - -dist/configPath.d.ts - - -configPath.d.ts -0% - - - - - -dist/index.d.ts - - -index.d.ts -100% + + +fs + + +fs - + -dist/index.d.ts->dist/config.js - - - - - -dist/index.d.ts->dist/configPath.js - - - - - -dist/paths.js - - -paths.js -83% - - - - - -dist/index.d.ts->dist/paths.js - - - - - -dist/paths.js->dist/config.js - - - - - -dist/paths.js->dist/configPath.js - - - - - -dist/paths.js->node_modules/@babel/runtime-corejs3 - - - - - -dist/paths.js->fs - - - - - -node_modules/fast-glob - - - - - -fast-glob - - - - - -dist/paths.js->node_modules/fast-glob - - +dist/index.js->fs + + - + path - - -path + + +path - - -dist/paths.js->path - - + + +dist/index.js->path + + - - -dist/index.js - - -index.js -100% + + +node_modules/string-env-interpolation + + + + + +string-env-interpolation - - -dist/index.js->dist/config.js - - - - - -dist/index.js->dist/configPath.js - - - - - -dist/index.js->node_modules/@babel/runtime-corejs3 - - - - - -dist/index.js->dist/paths.js - - - - - -dist/paths.d.ts - - -paths.d.ts -0% - - + + +dist/index.js->node_modules/string-env-interpolation + + diff --git a/packages/project-config/dependency-graph-src.svg b/packages/project-config/dependency-graph-src.svg index acbedc501f55..15ed4378425d 100644 --- a/packages/project-config/dependency-graph-src.svg +++ b/packages/project-config/dependency-graph-src.svg @@ -4,32 +4,32 @@ - - + + dependency-cruiser output - + cluster_node_modules - -node_modules + +node_modules cluster_node_modules/@iarna - -@iarna + +@iarna cluster_src - -src + +src fs - -fs + +fs @@ -37,11 +37,11 @@ node_modules/@iarna/toml - - - - -toml + + + + +toml @@ -49,11 +49,11 @@ node_modules/deepmerge - - - - -deepmerge + + + + +deepmerge @@ -61,170 +61,186 @@ node_modules/fast-glob - - - - -fast-glob - - - - - -node_modules/findup-sync - - - - - -findup-sync + + + + +fast-glob - + node_modules/string-env-interpolation - - - - - -string-env-interpolation + + + + + +string-env-interpolation - + path - - -path + + +path - + src/config.ts - - -config.ts -71% + + +config.ts +71% src/config.ts->fs - - + + src/config.ts->node_modules/@iarna/toml - - + + src/config.ts->node_modules/deepmerge - - + + src/config.ts->node_modules/string-env-interpolation - - + + - + src/configPath.ts - - -configPath.ts -25% + + +configPath.ts +25% src/config.ts->src/configPath.ts - - + + - + + +src/findUp.ts + + +findUp.ts +50% + + + + -src/configPath.ts->node_modules/findup-sync - - +src/configPath.ts->src/findUp.ts + + + + + +src/findUp.ts->fs + + + + + +src/findUp.ts->path + + src/index.ts - -index.ts -100% + +index.ts +100% - + src/index.ts->src/config.ts - - + + - + src/index.ts->src/configPath.ts - - + + + + + +src/index.ts->src/findUp.ts + + src/paths.ts - -paths.ts -83% + +paths.ts +83% - + src/index.ts->src/paths.ts - - + + - + src/paths.ts->fs - - + + - + src/paths.ts->node_modules/fast-glob - - + + - + src/paths.ts->path - - + + - + src/paths.ts->src/config.ts - - + + - + src/paths.ts->src/configPath.ts - - + + diff --git a/packages/project-config/package.json b/packages/project-config/package.json index 44abb60833cc..8c9bf917af90 100644 --- a/packages/project-config/package.json +++ b/packages/project-config/package.json @@ -16,11 +16,10 @@ ], "scripts": { "build": "yarn node ./build.mjs && run build:types", - "build:clean-dist": "rimraf 'dist/**/__tests__' --glob", "build:types": "tsc --build --verbose", "build:watch": "nodemon --watch src --ext \"js,ts,tsx\" --ignore dist --exec \"yarn build\"", - "deps:dist": "depcruise dist --config --output-type dot | dot -T svg > dependency-graph-dist.svg", - "deps:src": "depcruise src --config --exclude \"^src/__tests__\" --output-type dot | dot -T svg > dependency-graph-src.svg", + "deps:dist": "depcruise dist --output-type dot | dot -T svg > dependency-graph-dist.svg", + "deps:src": "depcruise src --exclude \"^src/__tests__\" --output-type dot | dot -T svg > dependency-graph-src.svg", "prepublishOnly": "NODE_ENV=production yarn build", "test": "jest src", "test:watch": "run test --watch" @@ -29,12 +28,11 @@ "@iarna/toml": "2.2.5", "deepmerge": "4.3.1", "fast-glob": "3.2.12", - "findup-sync": "5.0.0", "string-env-interpolation": "1.0.1" }, "devDependencies": { - "@types/findup-sync": "4.0.2", "dependency-cruiser": "13.0.1", + "esbuild": "0.17.19", "jest": "29.5.0", "rimraf": "5.0.1", "typescript": "5.0.4" diff --git a/packages/project-config/src/configPath.ts b/packages/project-config/src/configPath.ts index 293abb08ab2d..521167d2b2e3 100644 --- a/packages/project-config/src/configPath.ts +++ b/packages/project-config/src/configPath.ts @@ -1,4 +1,4 @@ -import findUp from 'findup-sync' +import { findUp } from './findUp' const CONFIG_FILE_NAME = 'redwood.toml' @@ -8,7 +8,7 @@ const CONFIG_FILE_NAME = 'redwood.toml' export const getConfigPath = ( cwd: string = process.env.RWJS_CWD ?? process.cwd() ): string => { - const configPath = findUp(CONFIG_FILE_NAME, { cwd }) + const configPath = findUp(CONFIG_FILE_NAME, cwd) if (!configPath) { throw new Error( `Could not find a "${CONFIG_FILE_NAME}" file, are you sure you're in a Redwood project?` diff --git a/packages/project-config/src/findUp.ts b/packages/project-config/src/findUp.ts new file mode 100644 index 000000000000..606a7ff62876 --- /dev/null +++ b/packages/project-config/src/findUp.ts @@ -0,0 +1,25 @@ +import fs from 'fs' +import path from 'path' + +/** + * Find a file by walking up parent directories. + */ +export function findUp( + file: string, + startingDirectory: string = process.cwd() +): string | null { + const possibleFilepath = path.join(startingDirectory, file) + + if (fs.existsSync(possibleFilepath)) { + return possibleFilepath + } + + const parentDirectory = path.dirname(startingDirectory) + + // If we've reached the root directory, there's no file to be found. + if (parentDirectory === startingDirectory) { + return null + } + + return findUp(file, parentDirectory) +} diff --git a/packages/project-config/src/index.ts b/packages/project-config/src/index.ts index 179c04ecaa93..ae6da932ae6e 100644 --- a/packages/project-config/src/index.ts +++ b/packages/project-config/src/index.ts @@ -1,3 +1,4 @@ export * from './config' export * from './configPath' export * from './paths' +export * from './findUp' diff --git a/packages/structure/package.json b/packages/structure/package.json index c5aec8fa82ca..87187e120846 100644 --- a/packages/structure/package.json +++ b/packages/structure/package.json @@ -41,7 +41,6 @@ "dotenv-defaults": "5.0.2", "enquirer": "2.3.6", "fast-glob": "3.2.12", - "findup-sync": "5.0.0", "graphql": "16.6.0", "lazy-get-decorator": "2.2.1", "line-column": "1.0.2", diff --git a/yarn.lock b/yarn.lock index b4495033ada8..559b395eb151 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6982,7 +6982,6 @@ __metadata: envinfo: 7.8.1 execa: 5.1.1 fast-glob: 3.2.12 - findup-sync: 5.0.0 fs-extra: 11.1.1 humanize-string: 2.1.0 jest: 29.5.0 @@ -7023,8 +7022,8 @@ __metadata: "@babel/runtime-corejs3": 7.21.5 "@babel/traverse": 7.21.5 "@iarna/toml": 2.2.5 + "@redwoodjs/project-config": 5.0.0 "@types/babel__core": 7.20.0 - "@types/findup-sync": 4.0.2 "@types/fs-extra": 11.0.1 "@types/jest": 29.5.1 "@types/jscodeshift": 0.11.6 @@ -7037,7 +7036,6 @@ __metadata: deepmerge: 4.3.1 execa: 5.1.1 fast-glob: 3.2.12 - findup-sync: 5.0.0 fs-extra: 11.1.1 graphql: 16.6.0 jest: 29.5.0 @@ -7270,7 +7268,6 @@ __metadata: "@redwoodjs/project-config": 5.0.0 "@types/babel-plugin-tester": 9.0.5 "@types/babel__core": 7.20.0 - "@types/findup-sync": 4.0.2 "@types/fs-extra": 11.0.1 babel-plugin-graphql-tag: 3.3.0 babel-plugin-polyfill-corejs3: 0.8.1 @@ -7280,7 +7277,6 @@ __metadata: deepmerge: 4.3.1 esbuild: 0.17.19 fast-glob: 3.2.12 - findup-sync: 5.0.0 fs-extra: 11.1.1 graphql: 16.6.0 graphql-tag: 2.12.6 @@ -7334,11 +7330,10 @@ __metadata: resolution: "@redwoodjs/project-config@workspace:packages/project-config" dependencies: "@iarna/toml": 2.2.5 - "@types/findup-sync": 4.0.2 deepmerge: 4.3.1 dependency-cruiser: 13.0.1 + esbuild: 0.17.19 fast-glob: 3.2.12 - findup-sync: 5.0.0 jest: 29.5.0 rimraf: 5.0.1 string-env-interpolation: 1.0.1 @@ -7406,7 +7401,6 @@ __metadata: dotenv-defaults: 5.0.2 enquirer: 2.3.6 fast-glob: 3.2.12 - findup-sync: 5.0.0 graphql: 16.6.0 jest: 29.5.0 lazy-get-decorator: 2.2.1 @@ -9370,13 +9364,6 @@ __metadata: languageName: node linkType: hard -"@types/braces@npm:*": - version: 3.0.1 - resolution: "@types/braces@npm:3.0.1" - checksum: 2052cf78c7378ceb692b823f743ac3a838b05f4c27f6eba3e5b6e298fd11d64322b1c7be1fa0eb53d99d9c6049202bf16a88ec1f40ebfd09e086b54eb69ff767 - languageName: node - linkType: hard - "@types/btoa-lite@npm:^1.0.0": version: 1.0.0 resolution: "@types/btoa-lite@npm:1.0.0" @@ -9523,15 +9510,6 @@ __metadata: languageName: node linkType: hard -"@types/findup-sync@npm:4.0.2": - version: 4.0.2 - resolution: "@types/findup-sync@npm:4.0.2" - dependencies: - "@types/micromatch": "*" - checksum: f7c169a5fa48aa0f5e4aba25cdff412aa1817f7b60c62a9c915325b852177431f1ecffcb29537799c438ecc192e87748aabf67b478d677cc2811a6732fbd7849 - languageName: node - linkType: hard - "@types/fs-extra@npm:11.0.1, @types/fs-extra@npm:^11.0.1": version: 11.0.1 resolution: "@types/fs-extra@npm:11.0.1" @@ -9842,15 +9820,6 @@ __metadata: languageName: node linkType: hard -"@types/micromatch@npm:*": - version: 4.0.2 - resolution: "@types/micromatch@npm:4.0.2" - dependencies: - "@types/braces": "*" - checksum: e557324460e658283778c77d0f8995ee95e371c4fd54474b3186e947486427cc4af66b841393304b65c09a7bb36710158260db7a7cf761384e1a9a728e82e6f4 - languageName: node - linkType: hard - "@types/mime-types@npm:2.1.1": version: 2.1.1 resolution: "@types/mime-types@npm:2.1.1" @@ -15667,13 +15636,6 @@ __metadata: languageName: node linkType: hard -"detect-file@npm:^1.0.0": - version: 1.0.0 - resolution: "detect-file@npm:1.0.0" - checksum: c782a5f992047944c39d337c82f5d1d21d65d1378986d46c354df9d9ec6d5f356bca0182969c11b08b9b8a7af8727b3c2d5a9fad0b022be4a3bf4c216f63ed07 - languageName: node - linkType: hard - "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -17141,15 +17103,6 @@ __metadata: languageName: node linkType: hard -"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": - version: 2.0.2 - resolution: "expand-tilde@npm:2.0.2" - dependencies: - homedir-polyfill: ^1.0.1 - checksum: 205a60497422746d1c3acbc1d65bd609b945066f239a2b785e69a7a651ac4cbeb4e08555b1ea0023abbe855e6fcb5bbf27d0b371367fdccd303d4fb2b4d66845 - languageName: node - linkType: hard - "expect@npm:^29.0.0, expect@npm:^29.5.0": version: 29.5.0 resolution: "expect@npm:29.5.0" @@ -17809,18 +17762,6 @@ __metadata: languageName: node linkType: hard -"findup-sync@npm:5.0.0": - version: 5.0.0 - resolution: "findup-sync@npm:5.0.0" - dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.3 - micromatch: ^4.0.4 - resolve-dir: ^1.0.1 - checksum: bbdb8af8c86a0bde4445e2f738003b92e4cd2a4539a5b45199d0252f2f504aeaf19aeca1fac776c3632c60657b2659151e72c8ead29a79617459a57419a0920b - languageName: node - linkType: hard - "firebase-admin@npm:10.3.0": version: 10.3.0 resolution: "firebase-admin@npm:10.3.0" @@ -18746,30 +18687,6 @@ __metadata: languageName: node linkType: hard -"global-modules@npm:^1.0.0": - version: 1.0.0 - resolution: "global-modules@npm:1.0.0" - dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 7d91ecf78d4fcbc966b2d89c1400df273afea795bc8cadf39857ee1684e442065621fd79413ff5fcd9e90c6f1b2dc0123e644fa0b7811f987fd54c6b9afad858 - languageName: node - linkType: hard - -"global-prefix@npm:^1.0.1": - version: 1.0.2 - resolution: "global-prefix@npm:1.0.2" - dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: d8037e300f1dc04d5d410d16afa662e71bfad22dcceba6c9727bb55cc273b8988ca940b3402f62e5392fd261dd9924a9a73a865ef2000219461f31f3fc86be06 - languageName: node - linkType: hard - "global@npm:^4.4.0": version: 4.4.0 resolution: "global@npm:4.4.0" @@ -28136,16 +28053,6 @@ __metadata: languageName: node linkType: hard -"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": - version: 1.0.1 - resolution: "resolve-dir@npm:1.0.1" - dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 - checksum: 8197ed13e4a51d9cd786ef6a09fc83450db016abe7ef3311ca39389b3e508d77c26fe0cf0483a9b407b8caa2764bb5ccc52cf6a017ded91492a416475a56066f - languageName: node - linkType: hard - "resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": version: 5.0.0 resolution: "resolve-from@npm:5.0.0" @@ -32718,7 +32625,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^1.2.14, which@npm:^1.2.9": +"which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: From ad4bf6dd55b85906820f6eec298753ed395c2913 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 May 2023 02:13:55 +0000 Subject: [PATCH 23/23] chore(deps): update dependency @clerk/clerk-react to v4.16.2 (#8362) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../auth-providers/clerk/web/package.json | 4 +-- yarn.lock | 35 ++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/auth-providers/clerk/web/package.json b/packages/auth-providers/clerk/web/package.json index da5bbd37fe7b..4e8081d0937e 100644 --- a/packages/auth-providers/clerk/web/package.json +++ b/packages/auth-providers/clerk/web/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@babel/cli": "7.21.5", "@babel/core": "7.21.8", - "@clerk/clerk-react": "4.16.1", + "@clerk/clerk-react": "4.16.2", "@clerk/types": "3.38.0", "@types/react": "18.2.6", "jest": "29.5.0", @@ -37,7 +37,7 @@ "typescript": "5.0.4" }, "peerDependencies": { - "@clerk/clerk-react": "4.16.1" + "@clerk/clerk-react": "4.16.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" } diff --git a/yarn.lock b/yarn.lock index 559b395eb151..1a6b48871218 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2122,17 +2122,17 @@ __metadata: languageName: node linkType: hard -"@clerk/clerk-react@npm:4.16.1": - version: 4.16.1 - resolution: "@clerk/clerk-react@npm:4.16.1" +"@clerk/clerk-react@npm:4.16.2": + version: 4.16.2 + resolution: "@clerk/clerk-react@npm:4.16.2" dependencies: - "@clerk/shared": ^0.16.1 - "@clerk/types": ^3.37.1 + "@clerk/shared": ^0.16.2 + "@clerk/types": ^3.38.1 swr: 1.3.0 tslib: 2.4.1 peerDependencies: react: ">=16" - checksum: 1288c8fe4aa70af6685b61770e6d443affbe16084cbe13598c45e009f8481181e12e8bb1df858cc445b30c0c34e91195e5bbd6db7678e040353fbd468617e744 + checksum: 460c53afa6774763f877240ccaf5c8d524f76e9c36fdbd19c0e60c1ce8420aeeebafa049b8446f4205f15a361a5aa5bf9be3ed2a3f663ff702915f491abf8256 languageName: node linkType: hard @@ -2153,18 +2153,18 @@ __metadata: languageName: node linkType: hard -"@clerk/shared@npm:^0.16.1": - version: 0.16.1 - resolution: "@clerk/shared@npm:0.16.1" +"@clerk/shared@npm:^0.16.2": + version: 0.16.2 + resolution: "@clerk/shared@npm:0.16.2" dependencies: glob-to-regexp: 0.4.1 peerDependencies: react: ">=16" - checksum: 5818970f52ec99cea3ca15379a2a103ebd64a67d29add79adbcc76a091c2b97608f5ad2352721d65b2f67519d44ffa52b13a1e12d7a5254a4f6daa7b455de213 + checksum: 88f684b0e81b2e016afa8a5917fbc8adb7c4623d6fc4c71316d674869d852b24d4c02fdebdf54e14915b2182cbf0cdb52e8fc7dfbcaefc1142604862668a0582 languageName: node linkType: hard -"@clerk/types@npm:3.38.0, @clerk/types@npm:^3.37.1": +"@clerk/types@npm:3.38.0": version: 3.38.0 resolution: "@clerk/types@npm:3.38.0" dependencies: @@ -2173,6 +2173,15 @@ __metadata: languageName: node linkType: hard +"@clerk/types@npm:^3.37.1, @clerk/types@npm:^3.38.1": + version: 3.38.1 + resolution: "@clerk/types@npm:3.38.1" + dependencies: + csstype: 3.1.1 + checksum: 608806b5438d0b316b109a9adf514a7c337c50023fccd7882440847bd0619efb9de40c05e91fead8fc23318a60c22607d9d5c10031b84db611f2309d02dc6e3b + languageName: node + linkType: hard + "@cnakazawa/watch@npm:^1.0.3": version: 1.0.4 resolution: "@cnakazawa/watch@npm:1.0.4" @@ -6613,7 +6622,7 @@ __metadata: "@babel/cli": 7.21.5 "@babel/core": 7.21.8 "@babel/runtime-corejs3": 7.21.5 - "@clerk/clerk-react": 4.16.1 + "@clerk/clerk-react": 4.16.2 "@clerk/types": 3.38.0 "@redwoodjs/auth": 5.0.0 "@types/react": 18.2.6 @@ -6622,7 +6631,7 @@ __metadata: react: 18.2.0 typescript: 5.0.4 peerDependencies: - "@clerk/clerk-react": 4.16.1 + "@clerk/clerk-react": 4.16.2 languageName: unknown linkType: soft