diff --git a/.vscode/deno_resolve_npm_imports.json b/.vscode/deno_resolve_npm_imports.json
index 8444a962762..93886c5fbec 100644
--- a/.vscode/deno_resolve_npm_imports.json
+++ b/.vscode/deno_resolve_npm_imports.json
@@ -1,13 +1,11 @@
{
"// Resolve NPM imports for `packages/remix-deno`.": "",
-
"// This import map is used solely for the denoland.vscode-deno extension.": "",
"// Remix does not support import maps.": "",
"// Dependency management is done through `npm` and `node_modules/` instead.": "",
"// Deno-only dependencies may be imported via URL imports (without using import maps).": "",
-
"imports": {
"mime": "https://esm.sh/mime@3.0.0",
- "@remix-run/server-runtime": "https://esm.sh/@remix-run/server-runtime@1.4.3"
+ "@remix-run/server-runtime": "https://esm.sh/@remix-run/server-runtime@0.0.0-experimental-ae984c8e"
}
}
diff --git a/examples/basic/package.json b/examples/basic/package.json
index 62fa9466a0a..ba213f290df 100644
--- a/examples/basic/package.json
+++ b/examples/basic/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/blog-tutorial/package.json b/examples/blog-tutorial/package.json
index 554b72b91a6..2f6d785cc38 100644
--- a/examples/blog-tutorial/package.json
+++ b/examples/blog-tutorial/package.json
@@ -34,9 +34,9 @@
"@node-rs/bcrypt": "^1.6.0",
"@prisma/client": "^3.13.0",
"@reach/alert": "^0.17.0",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"marked": "^4.0.15",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -44,8 +44,8 @@
},
"devDependencies": {
"@faker-js/faker": "^6.3.1",
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@testing-library/cypress": "^8.0.2",
"@testing-library/dom": "^8.13.0",
"@testing-library/jest-dom": "^5.16.4",
diff --git a/examples/bullmq-task-queue/package.json b/examples/bullmq-task-queue/package.json
index 9185f45c9fd..8491d522a90 100644
--- a/examples/bullmq-task-queue/package.json
+++ b/examples/bullmq-task-queue/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"bullmq": "^1.76.0",
"ioredis": "^4.28.5",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/ioredis": "^4.28.8",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
diff --git a/examples/catch-boundary/package.json b/examples/catch-boundary/package.json
index 625245a2dc1..f8998a5a035 100644
--- a/examples/catch-boundary/package.json
+++ b/examples/catch-boundary/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/chakra-ui/package.json b/examples/chakra-ui/package.json
index e6a2c8e943a..eb51bb2ba68 100644
--- a/examples/chakra-ui/package.json
+++ b/examples/chakra-ui/package.json
@@ -13,16 +13,16 @@
"@chakra-ui/react": "^1.8.6",
"@emotion/react": "^11.8.1",
"@emotion/styled": "^11.8.1",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"framer-motion": "^5.6.0",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/client-only-components/package.json b/examples/client-only-components/package.json
index 1161056712d..2ca3549f651 100644
--- a/examples/client-only-components/package.json
+++ b/examples/client-only-components/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"remix-utils": "^2.7.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/client-side-validation/package.json b/examples/client-side-validation/package.json
index e9e248496d7..eb01e652e36 100644
--- a/examples/client-side-validation/package.json
+++ b/examples/client-side-validation/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/collected-notes/package.json b/examples/collected-notes/package.json
index b70f8b6bd97..8b94618f5d1 100644
--- a/examples/collected-notes/package.json
+++ b/examples/collected-notes/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"collected-notes": "^2.3.0",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/combobox-resource-route/package.json b/examples/combobox-resource-route/package.json
index 026ebda3f4d..6bed3449cd3 100644
--- a/examples/combobox-resource-route/package.json
+++ b/examples/combobox-resource-route/package.json
@@ -11,16 +11,16 @@
},
"dependencies": {
"@reach/combobox": "^0.16.5",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"match-sorter": "^6.3.1",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/dark-mode/package.json b/examples/dark-mode/package.json
index 64a20dae122..b0efacc5927 100644
--- a/examples/dark-mode/package.json
+++ b/examples/dark-mode/package.json
@@ -10,14 +10,14 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.38",
"@types/react-dom": "^17.0.11",
"typescript": "^4.5.4"
diff --git a/examples/dataloader/package.json b/examples/dataloader/package.json
index 34fbb078de7..81f0fb74297 100644
--- a/examples/dataloader/package.json
+++ b/examples/dataloader/package.json
@@ -11,9 +11,9 @@
"start:dev": "cross-env NODE_ENV=development node -r esbuild-register server/index.ts"
},
"dependencies": {
- "@remix-run/express": "1.5.1",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
+ "@remix-run/express": "0.0.0-experimental-ae984c8e",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
"compression": "^1.7.4",
"cross-env": "^7.0.3",
"dataloader": "^2.0.0",
@@ -23,8 +23,8 @@
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"esbuild-register": "^3.3.2",
diff --git a/examples/emotion/package.json b/examples/emotion/package.json
index 250bab6e21a..2496f667d1a 100644
--- a/examples/emotion/package.json
+++ b/examples/emotion/package.json
@@ -14,15 +14,15 @@
"@emotion/react": "^11.8.1",
"@emotion/server": "^11.4.0",
"@emotion/styled": "^11.8.1",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/file-and-cloudinary-upload/package.json b/examples/file-and-cloudinary-upload/package.json
index 23cf4109d11..b62521f47e5 100644
--- a/examples/file-and-cloudinary-upload/package.json
+++ b/examples/file-and-cloudinary-upload/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"cloudinary": "^1.28.1",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/firebase-auth-firestore/package.json b/examples/firebase-auth-firestore/package.json
index 1dab56b6970..efe7082232c 100644
--- a/examples/firebase-auth-firestore/package.json
+++ b/examples/firebase-auth-firestore/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"firebase": "^9.6.10",
"firebase-admin": "^10.0.2",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.43",
"@types/react-dom": "^17.0.14",
"eslint": "^8.12.0",
diff --git a/examples/form-to-notion-db/package.json b/examples/form-to-notion-db/package.json
index 9dbd13fac75..4f7f21c96be 100644
--- a/examples/form-to-notion-db/package.json
+++ b/examples/form-to-notion-db/package.json
@@ -11,15 +11,15 @@
},
"dependencies": {
"@notionhq/client": "^0.4.13",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/framer-motion/package.json b/examples/framer-motion/package.json
index 0efcafca29c..9e07572c4d6 100644
--- a/examples/framer-motion/package.json
+++ b/examples/framer-motion/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"framer-motion": "^5.6.0",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/framer-route-animation/package.json b/examples/framer-route-animation/package.json
index b66c443eaac..e2262260b5f 100644
--- a/examples/framer-route-animation/package.json
+++ b/examples/framer-route-animation/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"framer-motion": "^6.2.8",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/gdpr-cookie-consent/package.json b/examples/gdpr-cookie-consent/package.json
index 8679a643ef8..624807de302 100644
--- a/examples/gdpr-cookie-consent/package.json
+++ b/examples/gdpr-cookie-consent/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/google-analytics/package.json b/examples/google-analytics/package.json
index d2c6608cd0d..7b8aa66a670 100644
--- a/examples/google-analytics/package.json
+++ b/examples/google-analytics/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/graphql-api/package.json b/examples/graphql-api/package.json
index 76580b88c9a..dd1efa8c243 100644
--- a/examples/graphql-api/package.json
+++ b/examples/graphql-api/package.json
@@ -13,9 +13,9 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"apollo-server-errors": "^3.3.1",
"graphql": "^16.4.0",
"react": "^17.0.2",
@@ -25,8 +25,8 @@
"@graphql-codegen/cli": "2.6.2",
"@graphql-codegen/typescript": "^2.4.5",
"@graphql-codegen/typescript-operations": "^2.3.2",
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/image-resize/package.json b/examples/image-resize/package.json
index 910043f6ff4..2c50a643f04 100644
--- a/examples/image-resize/package.json
+++ b/examples/image-resize/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"sharp": "^0.30.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"@types/sharp": "^0.29.5",
diff --git a/examples/infinite-scrolling/package.json b/examples/infinite-scrolling/package.json
index b0cabc64803..2aba8f864c3 100644
--- a/examples/infinite-scrolling/package.json
+++ b/examples/infinite-scrolling/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-virtual": "^2.10.4"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.42",
"@types/react-dom": "^17.0.14",
"eslint": "^8.11.0",
diff --git a/examples/io-ts-formdata-decoding/package.json b/examples/io-ts-formdata-decoding/package.json
index 1ad83851b76..e4d29d9d564 100644
--- a/examples/io-ts-formdata-decoding/package.json
+++ b/examples/io-ts-formdata-decoding/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"fp-ts": "^2.11.8",
"io-ts": "^2.2.16",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/ioredis/package.json b/examples/ioredis/package.json
index 2d6802ed395..e3b400586f5 100644
--- a/examples/ioredis/package.json
+++ b/examples/ioredis/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"ioredis": "^4.28.5",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/ioredis": "^4.28.8",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
diff --git a/examples/jokes/package.json b/examples/jokes/package.json
index 711bcd916f3..169dcde7b45 100644
--- a/examples/jokes/package.json
+++ b/examples/jokes/package.json
@@ -11,16 +11,16 @@
},
"dependencies": {
"@prisma/client": "^3.10.0",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"bcryptjs": "^2.4.3",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/bcryptjs": "^2.4.2",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
diff --git a/examples/mantine/package.json b/examples/mantine/package.json
index f37f31b88b6..eb3ad5404e2 100644
--- a/examples/mantine/package.json
+++ b/examples/mantine/package.json
@@ -13,15 +13,15 @@
"@mantine/core": "^3.6.14",
"@mantine/hooks": "^3.6.14",
"@mantine/ssr": "^3.6.14",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/msw/package.json b/examples/msw/package.json
index dffa0ad868e..b3c7e2e5cf9 100644
--- a/examples/msw/package.json
+++ b/examples/msw/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.40",
"@types/react-dom": "^17.0.13",
"eslint": "^8.11.0",
diff --git a/examples/multiple-forms/package.json b/examples/multiple-forms/package.json
index 003a81bf19a..ba7b5753e10 100644
--- a/examples/multiple-forms/package.json
+++ b/examples/multiple-forms/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/multiple-params/package.json b/examples/multiple-params/package.json
index 12e411d223c..a4d89970708 100644
--- a/examples/multiple-params/package.json
+++ b/examples/multiple-params/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/newsletter-signup/package.json b/examples/newsletter-signup/package.json
index f7bf4576c54..59971d7ede3 100644
--- a/examples/newsletter-signup/package.json
+++ b/examples/newsletter-signup/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/nprogress/package.json b/examples/nprogress/package.json
index 1dedec3b76e..31ff000470f 100644
--- a/examples/nprogress/package.json
+++ b/examples/nprogress/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"nprogress": "^0.2.0",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/nprogress": "^0.2.0",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
diff --git a/examples/on-demand-hydration/package.json b/examples/on-demand-hydration/package.json
index a97691825c6..cb1fd502425 100644
--- a/examples/on-demand-hydration/package.json
+++ b/examples/on-demand-hydration/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"remix-utils": "^2.7.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/outlet-form-rerender/package.json b/examples/outlet-form-rerender/package.json
index 60db3e95ab6..538bed0ad0b 100644
--- a/examples/outlet-form-rerender/package.json
+++ b/examples/outlet-form-rerender/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/pathless-routes/package.json b/examples/pathless-routes/package.json
index e2536763c4e..73b1ad682dc 100644
--- a/examples/pathless-routes/package.json
+++ b/examples/pathless-routes/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/pm-app/package.json b/examples/pm-app/package.json
index b0953a01dad..877d1647292 100644
--- a/examples/pm-app/package.json
+++ b/examples/pm-app/package.json
@@ -26,9 +26,9 @@
"@reach/combobox": "^0.16.5",
"@reach/dialog": "^0.16.2",
"@reach/menu-button": "^0.16.2",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"bcrypt": "^5.0.1",
"clsx": "^1.1.1",
"match-sorter": "^6.3.1",
@@ -38,9 +38,9 @@
"validator": "^13.7.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
- "@remix-run/express": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
+ "@remix-run/express": "0.0.0-experimental-ae984c8e",
"@types/bcrypt": "^5.0.0",
"@types/express": "^4.17.13",
"@types/react": "^17.0.39",
diff --git a/examples/quirrel/package.json b/examples/quirrel/package.json
index 6053d06714c..b9b132fa14d 100644
--- a/examples/quirrel/package.json
+++ b/examples/quirrel/package.json
@@ -12,16 +12,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"quirrel": "^1.8.1",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/react-spring/package.json b/examples/react-spring/package.json
index 51203c2d355..6823560f9ae 100644
--- a/examples/react-spring/package.json
+++ b/examples/react-spring/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-spring": "^9.4.3"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/redis-upstash-session/package.json b/examples/redis-upstash-session/package.json
index 0043fed4963..bbc56ebd28c 100644
--- a/examples/redis-upstash-session/package.json
+++ b/examples/redis-upstash-session/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/remix-auth-auth0/package.json b/examples/remix-auth-auth0/package.json
index 3d1b13770c9..332972a500c 100644
--- a/examples/remix-auth-auth0/package.json
+++ b/examples/remix-auth-auth0/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"remix-auth": "^3.2.1",
"remix-auth-auth0": "^1.3.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/remix-auth-form/package.json b/examples/remix-auth-form/package.json
index 60ceb5f3af2..b584afd8c61 100644
--- a/examples/remix-auth-form/package.json
+++ b/examples/remix-auth-form/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"remix-auth": "^3.2.1",
"remix-auth-form": "^1.1.1"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/remix-auth-github/package.json b/examples/remix-auth-github/package.json
index 6f57b081d7d..1f79aab99a1 100644
--- a/examples/remix-auth-github/package.json
+++ b/examples/remix-auth-github/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"remix-auth": "^3.2.1",
"remix-auth-github": "^1.0.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/remix-auth-supabase-github/package.json b/examples/remix-auth-supabase-github/package.json
index 67aac24d057..77582d23d31 100644
--- a/examples/remix-auth-supabase-github/package.json
+++ b/examples/remix-auth-supabase-github/package.json
@@ -10,9 +10,9 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@supabase/supabase-js": "^1.30.7",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -20,8 +20,8 @@
"remix-auth-supabase": "^3.1.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/remix-auth-supabase/package.json b/examples/remix-auth-supabase/package.json
index fbf74707a01..a136f2e6409 100644
--- a/examples/remix-auth-supabase/package.json
+++ b/examples/remix-auth-supabase/package.json
@@ -10,9 +10,9 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@supabase/supabase-js": "^1.30.7",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -20,8 +20,8 @@
"remix-auth-supabase": "^3.1.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/route-modal/package.json b/examples/route-modal/package.json
index 41fadb22547..3afa258c07e 100644
--- a/examples/route-modal/package.json
+++ b/examples/route-modal/package.json
@@ -11,15 +11,15 @@
},
"dependencies": {
"@reach/dialog": "^0.16.2",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/routes-gen/package.json b/examples/routes-gen/package.json
index 546400757ad..8a183c07c2c 100644
--- a/examples/routes-gen/package.json
+++ b/examples/routes-gen/package.json
@@ -11,16 +11,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"routes-gen": "^0.3.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@routes-gen/remix": "^0.2.10",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
diff --git a/examples/rust/package.json b/examples/rust/package.json
index 993691c41a6..f380c1d9cf5 100644
--- a/examples/rust/package.json
+++ b/examples/rust/package.json
@@ -11,16 +11,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"rust-functions": "file:rust-functions/pkg"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/sanity/package.json b/examples/sanity/package.json
index 3b1ca36f265..0573849bdc8 100644
--- a/examples/sanity/package.json
+++ b/examples/sanity/package.json
@@ -10,9 +10,9 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@sanity/block-content-to-react": "^3.0.0",
"@sanity/groq-store": "^0.3.1",
"@sanity/image-url": "^1.0.1",
@@ -21,8 +21,8 @@
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"eslint": "^8.10.0"
},
"engines": {
diff --git a/examples/sass/package.json b/examples/sass/package.json
index afbba026a6c..a3d653ec800 100644
--- a/examples/sass/package.json
+++ b/examples/sass/package.json
@@ -14,15 +14,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/search-input/package.json b/examples/search-input/package.json
index dc4882cec93..9a249223dcb 100644
--- a/examples/search-input/package.json
+++ b/examples/search-input/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/session-flash/package.json b/examples/session-flash/package.json
index 179aeff25d3..33d7b4112ba 100644
--- a/examples/session-flash/package.json
+++ b/examples/session-flash/package.json
@@ -11,16 +11,16 @@
},
"dependencies": {
"@fontsource/fira-sans": "^4.5.8",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^6.3.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/sharing-loader-data/package.json b/examples/sharing-loader-data/package.json
index 9365ceda9e7..8a219989a13 100644
--- a/examples/sharing-loader-data/package.json
+++ b/examples/sharing-loader-data/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/socket.io/package.json b/examples/socket.io/package.json
index 9f4279c38d4..478b89c32c2 100644
--- a/examples/socket.io/package.json
+++ b/examples/socket.io/package.json
@@ -11,9 +11,9 @@
"start:dev": "cross-env NODE_ENV=development node server/index.js"
},
"dependencies": {
- "@remix-run/express": "1.5.1",
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
+ "@remix-run/express": "0.0.0-experimental-ae984c8e",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
"compression": "^1.7.4",
"cross-env": "^7.0.3",
"express": "^4.17.3",
@@ -24,8 +24,8 @@
"socket.io-client": "^4.4.1"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/stitches/package.json b/examples/stitches/package.json
index fc6bd169e97..76eea4cdc91 100644
--- a/examples/stitches/package.json
+++ b/examples/stitches/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@stitches/react": "^1.2.7",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/strapi/package.json b/examples/strapi/package.json
index 66ccf3c7a37..8a9109e52d6 100755
--- a/examples/strapi/package.json
+++ b/examples/strapi/package.json
@@ -12,16 +12,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"marked": "^4.0.12",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/marked": "^4.0.2",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
diff --git a/examples/stripe-integration/package.json b/examples/stripe-integration/package.json
index 4a1747bedcc..fee26a102de 100644
--- a/examples/stripe-integration/package.json
+++ b/examples/stripe-integration/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"stripe": "^8.209.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.40",
"@types/react-dom": "^17.0.13",
"eslint": "^8.11.0",
diff --git a/examples/styled-components/package.json b/examples/styled-components/package.json
index 189a60df6f5..4dc90382058 100644
--- a/examples/styled-components/package.json
+++ b/examples/styled-components/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"styled-components": "^5.3.3"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"@types/styled-components": "^5.1.24",
diff --git a/examples/styletron/package.json b/examples/styletron/package.json
index 0e0522a4c70..e8c85773d5f 100644
--- a/examples/styletron/package.json
+++ b/examples/styletron/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"styletron-engine-atomic": "^1.4.8",
"styletron-react": "^6.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"@types/styled-components": "^5.1.24",
diff --git a/examples/supabase-subscription/package.json b/examples/supabase-subscription/package.json
index 97bb6868022..c23394da0e5 100644
--- a/examples/supabase-subscription/package.json
+++ b/examples/supabase-subscription/package.json
@@ -10,17 +10,17 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@supabase/supabase-js": "^1.31.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-supabase": "^0.2.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/tailwindcss/package.json b/examples/tailwindcss/package.json
index f2fa7cecaad..a6a15c6e2c4 100644
--- a/examples/tailwindcss/package.json
+++ b/examples/tailwindcss/package.json
@@ -15,15 +15,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/template/package.json b/examples/template/package.json
index ec98db90657..e87ed920a84 100644
--- a/examples/template/package.json
+++ b/examples/template/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/tiptap-collab-editing/package.json b/examples/tiptap-collab-editing/package.json
index 618dc4bcda0..400b079e326 100644
--- a/examples/tiptap-collab-editing/package.json
+++ b/examples/tiptap-collab-editing/package.json
@@ -10,9 +10,9 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@tiptap/extension-collaboration": "^2.0.0-beta.33",
"@tiptap/react": "^2.0.0-beta.108",
"@tiptap/starter-kit": "^2.0.0-beta.183",
@@ -22,8 +22,8 @@
"yjs": "^13.5.34"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/toast-message/package.json b/examples/toast-message/package.json
index a62ec76c333..46cf574dc63 100644
--- a/examples/toast-message/package.json
+++ b/examples/toast-message/package.json
@@ -10,16 +10,16 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-hot-toast": "^2.2.0"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/twind/package.json b/examples/twind/package.json
index 51904091a38..12d4f6297b4 100644
--- a/examples/twind/package.json
+++ b/examples/twind/package.json
@@ -10,9 +10,9 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"@twind/preset-autoprefix": "1.0.0-next.38",
"@twind/preset-tailwind": "1.0.0-next.38",
"@twind/with-remix": "1.0.0-next.38",
@@ -22,8 +22,8 @@
"twind": "^1.0.0-next.32"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/examples/usematches-loader-data/package.json b/examples/usematches-loader-data/package.json
index 8d6c184e98d..38132db85fc 100644
--- a/examples/usematches-loader-data/package.json
+++ b/examples/usematches-loader-data/package.json
@@ -10,15 +10,15 @@
"start": "remix-serve build"
},
"dependencies": {
- "@remix-run/node": "1.5.1",
- "@remix-run/react": "1.5.1",
- "@remix-run/serve": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "0.0.0-experimental-ae984c8e",
+ "@remix-run/serve": "0.0.0-experimental-ae984c8e",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@remix-run/dev": "1.5.1",
- "@remix-run/eslint-config": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
+ "@remix-run/eslint-config": "0.0.0-experimental-ae984c8e",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
"eslint": "^8.10.0",
diff --git a/integration/css-modules-test.ts b/integration/css-modules-test.ts
new file mode 100644
index 00000000000..381a1555cb5
--- /dev/null
+++ b/integration/css-modules-test.ts
@@ -0,0 +1,381 @@
+import { test, expect } from "@playwright/test";
+import type * as Playwright from "@playwright/test";
+
+import { PlaywrightFixture } from "./helpers/playwright-fixture";
+import type { Fixture, AppFixture } from "./helpers/create-fixture";
+import {
+ createAppFixture,
+ createFixture,
+ css,
+ js,
+} from "./helpers/create-fixture";
+
+test.describe("CSS Modules", () => {
+ // TODO: Finish all todo tests
+ let testTodo = (
+ title: string,
+ testFunction?: (
+ args: { page: Playwright.Page },
+ testInfo: Playwright.TestInfo
+ ) => any
+ ) => {};
+
+ let fixture: Fixture;
+ let appFixture: AppFixture;
+
+ test.beforeAll(async () => {
+ fixture = await createFixture({
+ files: {
+ "app/root.jsx": js`
+ import { Links, Outlet, Scripts } from "@remix-run/react";
+ import { cssModulesStylesheetUrl } from "@remix-run/css-modules";
+ import stylesHref from "~/styles.css";
+ export function links() {
+ return [
+ { rel: "stylesheet", href: stylesHref },
+ { rel: "stylesheet", href: cssModulesStylesheetUrl },
+ ];
+ }
+ export default function Root() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+ `,
+ "app/styles.css": css`
+ .reset--button {
+ appearance: none;
+ display: inline-block;
+ border: none;
+ padding: 0;
+ text-decoration: none;
+ background: 0;
+ color: inherit;
+ font: inherit;
+ }
+ `,
+
+ "app/routes/index.jsx": js`
+ import { Badge } from "~/lib/badge";
+ export default function() {
+ return (
+
+
Index
+ Hello
+
+ );
+ }
+ `,
+
+ "app/routes/page-a.jsx": js`
+ import { Badge } from "~/lib/badge";
+ import { Button } from "~/lib/button";
+ import { Heading } from "~/lib/heading";
+ import { Text } from "~/lib/text";
+ export default function() {
+ return (
+
+ Route A
+ Welcome
+ This is really good information, eh?
+
+
+ );
+ }
+ `,
+
+ "app/routes/page-b.jsx": js`
+ import { Button } from "~/lib/button";
+ import { Heading } from "~/lib/heading";
+ import { Text } from "~/lib/text";
+ export default function() {
+ return (
+
+ Route B
+ Here's a red button
+
+
+ );
+ }
+ `,
+
+ "app/routes/layout.jsx": js`
+ import { Outlet } from "@remix-run/react";
+ import { Container } from "~/lib/container";
+ import { Heading } from "~/lib/heading";
+ import { Text } from "~/lib/text";
+ export default function() {
+ return (
+
+
+ Layout
+
+
+
+ );
+ }
+ `,
+
+ "app/routes/layout/one.jsx": js`
+ import { Heading } from "~/lib/heading";
+ import { Input } from "~/lib/input";
+ export default function() {
+ return (
+
+ Subpage 1
+
+
+ );
+ }
+ `,
+
+ "app/lib/button.jsx": js`
+ import styles from "./button.module.css";
+ export function Button({ variant, ...props }) {
+ return (
+
+ );
+ }
+ `,
+ "app/lib/button.module.css": css`
+ .button {
+ /* TODO: composes: text from "./text.module.css"; */
+ composes: reset--button from global;
+ padding: 0.5rem 1rem;
+ box-shadow: none;
+ background-color: dodgerblue;
+ color: white;
+ font-weight: bold;
+ }
+ .buttonRed {
+ composes: button;
+ background-color: red;
+ }
+ `,
+
+ "app/lib/container.jsx": js`
+ import styles from "~/lib/container.module.css";
+ export function Container(props) {
+ return (
+
+ );
+ }
+ `,
+
+ "app/lib/container.module.css": css`
+ .container {
+ display: block;
+ max-width: 1000px;
+ margin: 0 auto;
+ }
+ `,
+
+ "app/lib/badge.jsx": js`
+ import styles from "./badge.module.css";
+ export function Badge(props) {
+ return (
+
+ );
+ }
+ `,
+
+ "app/lib/badge.module.css": css`
+ .badge {
+ /* TODO: composes: text from "./text.module.css"; */
+ display: inline-block;
+ padding: 0.25rem 0.5rem;
+ background-color: lightgray;
+ color: black;
+ font-size: 0.8rem;
+ }
+ :global(.bold):local(.badge) {
+ text-transform: uppercase;
+ }
+ `,
+
+ "app/lib/input.jsx": js`
+ import styles from "./input.module.css";
+ export function Input(props) {
+ return (
+
+ );
+ }
+ `,
+
+ "app/lib/input.module.css": css`
+ .input {
+ width: 100%;
+ outline-offset: 2px;
+ appearance: none;
+ border-radius: 3px;
+ border: 1px solid #000;
+ }
+ `,
+
+ "app/lib/text.jsx": js`
+ import styles from "./text.module.css";
+ export function Text({ as: Comp = "span", ...props }) {
+ return (
+
+ );
+ }
+ `,
+ "app/lib/text.module.css": css`
+ .text {
+ font-family: system-ui, sans-serif;
+ letter-spacing: -0.5px;
+ }
+ `,
+ "app/lib/heading.jsx": js`
+ import styles from "./heading.module.css";
+ import { Text } from "~/lib/text";
+ export function Heading({ level = 2, ...props }) {
+ return (
+
+ );
+ }
+ `,
+ "app/lib/heading.module.css": css`
+ .heading {
+ font-weight: bold;
+ }
+ .heading[data-heading-level="1"] {
+ font-size: 3rem;
+ }
+ .heading[data-heading-level="2"] {
+ font-size: 2rem;
+ }
+ `,
+ },
+ });
+ appFixture = await createAppFixture(fixture);
+ });
+
+ test.afterAll(async () => {
+ await appFixture.close();
+ });
+
+ test("server renders with hashed classnames", async ({ page }) => {
+ let app = new PlaywrightFixture(appFixture, page);
+ await app.goto("/");
+ let badge = await app.getElement("[data-ui-badge]");
+ let badgeClasses = badge.attr("class").split(" ");
+ let found: string[] = [];
+ for (let className of badgeClasses) {
+ if (/^badge-module__[\w-]+_badge$/.test(className)) {
+ found.push(className);
+ }
+ }
+ expect(found.length).toBe(1);
+ });
+
+ test("composes from global classname", async ({ page }) => {
+ let app = new PlaywrightFixture(appFixture, page);
+ await app.goto("/page-a");
+ let button = await app.getElement("[data-ui-button]");
+ expect(
+ button
+ .attr("class")
+ // .button composes the global .reset--button class
+ .includes("reset--button")
+ ).toBe(true);
+ });
+
+ test("composes from locally scoped classname", async ({ page }) => {
+ let app = new PlaywrightFixture(appFixture, page);
+ await app.goto("/page-b");
+ let button = await app.getElement("[data-ui-button]");
+ let buttonClasses = button.attr("class").split(" ");
+ let found: string[] = [];
+ for (let className of buttonClasses) {
+ if (
+ /^button-module__[\w-]+_button$/.test(className) ||
+ /^button-module__[\w-]+_buttonRed$/.test(className)
+ ) {
+ found.push(className);
+ }
+ }
+ expect(found.length).toBe(2);
+ });
+
+ // TODO: Feature not implemented yet
+ testTodo("composes from imported module classname");
+
+ test("composes :global selector with :local selector", async ({ page }) => {
+ let app = new PlaywrightFixture(appFixture, page);
+ await app.goto("/");
+ let badge = await app.getElement("[data-ui-badge]");
+ let buttonClasses = badge.attr("class").split(" ");
+ let found: string[] = [];
+ for (let className of buttonClasses) {
+ if (
+ /^badge-module__[\w-]+_badge$/.test(className) ||
+ // .badge composes the global .bold class
+ className === "bold"
+ ) {
+ found.push(className);
+ }
+ }
+ expect(found.length).toBe(2);
+ });
+
+ testTodo("keeps declarations in the correct order", async ({ page }) => {
+ let app = new PlaywrightFixture(appFixture, page);
+ await app.goto("/page-a");
+ // let heading = await app.getElement("[data-ui-heading]"); A couple of
+ // approaches:
+ // - get the stylesheet text and check the order
+ // - check that the heading itself has computed styles from `Text` that are
+ // not overridden
+ // - check that the heading does NOT have computed styles from `Text` that
+ // are overridden
+ });
+
+ test.describe("No javascript", () => {
+ test.use({ javaScriptEnabled: false });
+ test("loads the CSS Modules stylesheet", async ({ page }) => {
+ let app = new PlaywrightFixture(appFixture, page);
+ let cssResponses = app.collectResponses((url) =>
+ url.pathname.endsWith(".css")
+ );
+ await app.goto("/");
+ expect(cssResponses.length).toEqual(2);
+ });
+ });
+});
diff --git a/jest.config.js b/jest.config.js
index 11f98c692f4..9198d8dc8bc 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -7,6 +7,7 @@ module.exports = {
],
projects: [
"packages/remix-dev",
+ "packages/remix-css-modules",
"packages/remix-architect",
"packages/remix-express",
"packages/remix-netlify",
diff --git a/package.json b/package.json
index 18a186ee2ec..d75461cb8b8 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,6 @@
"scripts": {
"clean": "git clean -fdX .",
"build": "rollup -c && tsc -b",
- "dev": "yarn build && yarn --cwd ./fixtures/gists-app/ dev",
"license": "node ./scripts/license.js",
"publish": "node ./scripts/publish.js",
"publish:private": "node ./scripts/publish-private.js",
@@ -30,6 +29,7 @@
"packages/remix-cloudflare",
"packages/remix-cloudflare-pages",
"packages/remix-cloudflare-workers",
+ "packages/remix-css-modules",
"packages/remix-deno",
"packages/remix-dev",
"packages/remix-eslint-config",
diff --git a/packages/create-remix/package.json b/packages/create-remix/package.json
index eb033422a8c..3f88c2b77de 100644
--- a/packages/create-remix/package.json
+++ b/packages/create-remix/package.json
@@ -1,6 +1,6 @@
{
"name": "create-remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"description": "Create a new Remix app",
"homepage": "https://remix.run",
"license": "MIT",
@@ -16,6 +16,6 @@
"create-remix": "cli.js"
},
"dependencies": {
- "@remix-run/dev": "1.5.1"
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e"
}
}
diff --git a/packages/remix-architect/package.json b/packages/remix-architect/package.json
index 9ee57d670b7..53a40ffabae 100644
--- a/packages/remix-architect/package.json
+++ b/packages/remix-architect/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/architect",
"description": "Architect server request handler for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -13,7 +13,7 @@
},
"dependencies": {
"@architect/functions": "^5.0.2",
- "@remix-run/node": "1.5.1",
+ "@remix-run/node": "0.0.0-experimental-ae984c8e",
"@types/aws-lambda": "^8.10.82"
},
"devDependencies": {
diff --git a/packages/remix-cloudflare-pages/package.json b/packages/remix-cloudflare-pages/package.json
index fb24eae5e17..f51c001f74b 100644
--- a/packages/remix-cloudflare-pages/package.json
+++ b/packages/remix-cloudflare-pages/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/cloudflare-pages",
"description": "Cloudflare Pages request handler for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"main": "./index.js",
"module": "./esm/index.js",
@@ -14,7 +14,7 @@
"url": "https://github.com/remix-run/remix/issues"
},
"dependencies": {
- "@remix-run/cloudflare": "1.5.1"
+ "@remix-run/cloudflare": "0.0.0-experimental-ae984c8e"
},
"peerDependencies": {
"@cloudflare/workers-types": "^3.0.0"
diff --git a/packages/remix-cloudflare-workers/package.json b/packages/remix-cloudflare-workers/package.json
index 335d82eec42..e49b8f44e36 100644
--- a/packages/remix-cloudflare-workers/package.json
+++ b/packages/remix-cloudflare-workers/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/cloudflare-workers",
"description": "Cloudflare worker request handler for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"main": "./index.js",
"module": "./esm/index.js",
@@ -15,7 +15,7 @@
},
"dependencies": {
"@cloudflare/kv-asset-handler": "^0.1.3",
- "@remix-run/cloudflare": "1.5.1"
+ "@remix-run/cloudflare": "0.0.0-experimental-ae984c8e"
},
"peerDependencies": {
"@cloudflare/workers-types": "^2.0.0 || ^3.0.0"
diff --git a/packages/remix-cloudflare/package.json b/packages/remix-cloudflare/package.json
index 916abf12763..804da411948 100644
--- a/packages/remix-cloudflare/package.json
+++ b/packages/remix-cloudflare/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/cloudflare",
"description": "Cloudflare platform abstractions for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -13,7 +13,7 @@
},
"dependencies": {
"@cloudflare/kv-asset-handler": "^0.1.3",
- "@remix-run/server-runtime": "1.5.1"
+ "@remix-run/server-runtime": "0.0.0-experimental-ae984c8e"
},
"peerDependencies": {
"@cloudflare/workers-types": "^2.0.0 || ^3.0.0"
diff --git a/packages/remix-css-modules/README.md b/packages/remix-css-modules/README.md
new file mode 100644
index 00000000000..5c278710d2c
--- /dev/null
+++ b/packages/remix-css-modules/README.md
@@ -0,0 +1,13 @@
+# Welcome to Remix!
+
+[Remix](https://remix.run) is a web framework that helps you build better websites with React.
+
+To get started, open a new shell and run:
+
+```sh
+$ npx create-remix@latest
+```
+
+Then follow the prompts you see in your terminal.
+
+For more information about Remix, [visit remix.run](https://remix.run)!
diff --git a/packages/remix-css-modules/browser.ts b/packages/remix-css-modules/browser.ts
new file mode 100644
index 00000000000..51086ba5126
--- /dev/null
+++ b/packages/remix-css-modules/browser.ts
@@ -0,0 +1,5 @@
+import type { AssetsManifest } from "@remix-run/dev/assets-manifest";
+let assetsManifest: AssetsManifest = (window as any).__remixManifest;
+const cssModulesStylesheetUrl =
+ assetsManifest.cssModules?.stylesheetUrl;
+export { cssModulesStylesheetUrl };
diff --git a/packages/remix-css-modules/package.json b/packages/remix-css-modules/package.json
new file mode 100644
index 00000000000..13ad1f3f71a
--- /dev/null
+++ b/packages/remix-css-modules/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@remix-run/css-modules",
+ "description": "Entrypoint for stylesheets created by CSS Modules in Remix",
+ "version": "0.0.0-experimental-ae984c8e",
+ "license": "MIT",
+ "main": "./server.js",
+ "module": "./esm/server.js",
+ "browser": {
+ "./server.js": "./browser.js",
+ "./esm/server.js": "./esm/browser.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/remix-run/remix",
+ "directory": "packages/remix-css-modules"
+ },
+ "bugs": {
+ "url": "https://github.com/remix-run/remix/issues"
+ },
+ "dependencies": {
+ "@parcel/css": "1.8.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e"
+ }
+}
diff --git a/packages/remix-css-modules/server.ts b/packages/remix-css-modules/server.ts
new file mode 100644
index 00000000000..7d06b5a8c4f
--- /dev/null
+++ b/packages/remix-css-modules/server.ts
@@ -0,0 +1,4 @@
+import assetsManifest from "@remix-run/dev/assets-manifest";
+const cssModulesStylesheetUrl =
+ assetsManifest.cssModules?.stylesheetUrl;
+export { cssModulesStylesheetUrl };
diff --git a/packages/remix-css-modules/tsconfig.json b/packages/remix-css-modules/tsconfig.json
new file mode 100644
index 00000000000..fe0a0ab4cc6
--- /dev/null
+++ b/packages/remix-css-modules/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "exclude": ["__tests__"],
+ "compilerOptions": {
+ "lib": ["ES2019", "DOM.Iterable"],
+ "target": "ES2019",
+
+ "module": "CommonJS",
+ "moduleResolution": "node",
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+
+ "declaration": true,
+ "emitDeclarationOnly": true,
+ "skipLibCheck": true,
+ "resolveJsonModule": true,
+
+ "outDir": "../../build/node_modules/@remix-run/css-modules",
+ "rootDir": "."
+ }
+}
diff --git a/packages/remix-css-modules/types.ts b/packages/remix-css-modules/types.ts
new file mode 100644
index 00000000000..a2c896b15f0
--- /dev/null
+++ b/packages/remix-css-modules/types.ts
@@ -0,0 +1,77 @@
+/**
+ * Many of these types were copied from @parcel/css and modified slightly for
+ * our needs. Some of this data will end up in the assets manifest but we don't
+ * want more than we need.
+ */
+
+export type CssModuleExports = {
+ [name: string]: CssModuleExport;
+};
+
+export interface CssModuleExport {
+ name: string;
+ composes: CssModuleReference[];
+}
+
+export type CssModuleReference =
+ | LocalCssModuleReference
+ | GlobalCssModuleReference
+ | DependencyCssModuleReference;
+
+export interface LocalCssModuleReference {
+ type: "local";
+ name: string;
+}
+
+export interface GlobalCssModuleReference {
+ type: "global";
+ name: string;
+}
+
+interface DependencyCssModuleReference {
+ type: "dependency";
+ name: string;
+ /** The dependency specifier for the referenced file. */
+ specifier: string;
+}
+
+export type CssModuleDependency =
+ | CssModuleImportDependency
+ | CssModuleUrlDependency;
+
+interface CssModuleImportDependency {
+ type: "import";
+ /** The url of the `@import` dependency. */
+ url: string;
+ /** The media query for the `@import` rule. */
+ media: string | null;
+ /** The `supports()` query for the `@import` rule. */
+ supports: string | null;
+ /** The source location where the `@import` rule was found. */
+ loc: CssModuleSourceLocation;
+}
+
+interface CssModuleUrlDependency {
+ type: "url";
+ /** The url of the dependency. */
+ url: string;
+ /** The source location where the `url()` was found. */
+ loc: CssModuleSourceLocation;
+ /** The placeholder that the url was replaced with. */
+ placeholder: string;
+}
+
+interface CssModuleSourceLocation {
+ /** The file path in which the dependency exists. */
+ filePath: string;
+ /** The start location of the dependency. */
+ start: {
+ line: number;
+ column: number;
+ };
+ /** The end location (inclusive) of the dependency. */
+ end: {
+ line: number;
+ column: number;
+ };
+}
diff --git a/packages/remix-deno/package.json b/packages/remix-deno/package.json
index 6dd32eb2c59..76172608b92 100644
--- a/packages/remix-deno/package.json
+++ b/packages/remix-deno/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-run/deno",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"description": "Deno platform abstractions for Remix",
"homepage": "https://remix.run",
"license": "MIT",
@@ -14,7 +14,7 @@
},
"sideEffects": false,
"dependencies": {
- "@remix-run/server-runtime": "1.5.1",
+ "@remix-run/server-runtime": "0.0.0-experimental-ae984c8e",
"mime": "^3.0.0"
}
}
diff --git a/packages/remix-dev/assets-manifest.d.ts b/packages/remix-dev/assets-manifest.d.ts
new file mode 100644
index 00000000000..7526558f4bc
--- /dev/null
+++ b/packages/remix-dev/assets-manifest.d.ts
@@ -0,0 +1,4 @@
+import type { AssetsManifest } from "@remix-run/dev";
+declare const manifest: AssetsManifest;
+export type { AssetsManifest };
+export default manifest;
diff --git a/packages/remix-dev/compiler.ts b/packages/remix-dev/compiler.ts
index 1ce772e6013..434d112d8df 100644
--- a/packages/remix-dev/compiler.ts
+++ b/packages/remix-dev/compiler.ts
@@ -22,6 +22,13 @@ import { serverAssetsManifestPlugin } from "./compiler/plugins/serverAssetsManif
import { serverBareModulesPlugin } from "./compiler/plugins/serverBareModulesPlugin";
import { serverEntryModulePlugin } from "./compiler/plugins/serverEntryModulePlugin";
import { serverRouteModulesPlugin } from "./compiler/plugins/serverRouteModulesPlugin";
+import type { CssModulesResults } from "./compiler/plugins/cssModulesPlugin";
+import {
+ cssModulesBrowserPlugin,
+ cssModulesServerPlugin,
+ getCssModulesFileReferences,
+ processCss,
+} from "./compiler/plugins/cssModulesPlugin";
import { writeFileSafe } from "./compiler/utils/fs";
import { urlImportsPlugin } from "./compiler/plugins/urlImportsPlugin";
@@ -163,8 +170,7 @@ export async function watch(
options
);
if (onRebuildFinish) onRebuildFinish();
- browserBuild = builders[0];
- serverBuild = builders[1];
+ [browserBuild, serverBuild] = builders;
}, 500);
let rebuildEverything = debounce(async () => {
@@ -197,7 +203,7 @@ export async function watch(
// should probably blow as it's not really recoverable.
let browserBuildPromise = browserBuild.rebuild();
let assetsManifestPromise = browserBuildPromise.then((build) =>
- generateAssetsManifest(config, build.metafile!)
+ generateAssetsManifest(config, build.metafile!, build.cssModules)
);
// Assign the assetsManifestPromise to a ref so the server build can await
@@ -284,15 +290,31 @@ function isEntryPoint(config: RemixConfig, file: string) {
///////////////////////////////////////////////////////////////////////////////
+interface ServerBuild extends esbuild.BuildResult {}
+
+interface BuildInvalidate {
+ (): Promise;
+ dispose(): void;
+}
+export interface BrowserBuild extends Omit {
+ cssModules: CssModulesResults;
+ rebuild?: BuildInvalidate;
+}
+
+interface BrowserBuildIncremental extends BrowserBuild {
+ rebuild: BuildInvalidate;
+}
+
async function buildEverything(
config: RemixConfig,
assetsManifestPromiseRef: AssetsManifestPromiseRef,
options: Required & { incremental?: boolean }
-): Promise<(esbuild.BuildResult | undefined)[]> {
+): Promise<[BrowserBuild | undefined, ServerBuild | undefined]> {
try {
let browserBuildPromise = createBrowserBuild(config, options);
+
let assetsManifestPromise = browserBuildPromise.then((build) =>
- generateAssetsManifest(config, build.metafile!)
+ generateAssetsManifest(config, build.metafile!, build.cssModules)
);
// Assign the assetsManifestPromise to a ref so the server build can await
@@ -318,7 +340,7 @@ async function buildEverything(
async function createBrowserBuild(
config: RemixConfig,
options: BuildOptions & { incremental?: boolean }
-): Promise {
+): Promise {
// For the browser build, exclude node built-ins that don't have a
// browser-safe alternative installed in node_modules. Nothing should
// *actually* be external in the browser build (we want to bundle all deps) so
@@ -348,6 +370,7 @@ async function createBrowserBuild(
}
let plugins = [
+ cssModulesBrowserPlugin(config),
urlImportsPlugin(),
mdxPlugin(config),
browserRouteModulesPlugin(config, /\?browser$/),
@@ -355,42 +378,91 @@ async function createBrowserBuild(
NodeModulesPolyfillPlugin(),
];
- return esbuild.build({
- entryPoints,
- outdir: config.assetsBuildDirectory,
- platform: "browser",
- format: "esm",
- external: externals,
- inject: config.serverBuildTarget === "deno" ? [] : [reactShim],
- loader: loaders,
- bundle: true,
- logLevel: "silent",
- splitting: true,
- sourcemap: options.sourcemap,
- metafile: true,
- incremental: options.incremental,
- mainFields: ["browser", "module", "main"],
- treeShaking: true,
- minify: options.mode === BuildMode.Production,
- entryNames: "[dir]/[name]-[hash]",
- chunkNames: "_shared/[name]-[hash]",
- assetNames: "_assets/[name]-[hash]",
- publicPath: config.publicPath,
- define: {
- "process.env.NODE_ENV": JSON.stringify(options.mode),
- "process.env.REMIX_DEV_SERVER_WS_PORT": JSON.stringify(
- config.devServerPort
- ),
- },
- plugins,
- });
+ return esbuild
+ .build({
+ entryPoints,
+ outdir: config.assetsBuildDirectory,
+ platform: "browser",
+ format: "esm",
+ external: externals,
+ inject: config.serverBuildTarget === "deno" ? [] : [reactShim],
+ loader: loaders,
+ bundle: true,
+ logLevel: "silent",
+ splitting: true,
+ sourcemap: options.sourcemap,
+ metafile: true,
+ incremental: options.incremental,
+ mainFields: ["browser", "module", "main"],
+ treeShaking: true,
+ minify: options.mode === BuildMode.Production,
+ entryNames: "[dir]/[name]-[hash]",
+ chunkNames: "_shared/[name]-[hash]",
+ assetNames: "_assets/[name]-[hash]",
+ publicPath: config.publicPath,
+ define: {
+ "process.env.NODE_ENV": JSON.stringify(options.mode),
+ "process.env.REMIX_DEV_SERVER_WS_PORT": JSON.stringify(
+ config.devServerPort
+ ),
+ },
+ plugins,
+ })
+ .then(async (build) => {
+ let { css, moduleMap, stylesheetUrl, stylesheetPath } =
+ await buildCssModules(config, build);
+
+ await fse.ensureDir(path.dirname(stylesheetPath));
+ await fse.writeFile(stylesheetPath, css);
+
+ return {
+ ...build,
+ // This is a bit gnarly, but because the watch function calls `rebuild`
+ // on everything we need to essentially re-write it to ensure that we
+ // process CSS Modules, update our local state, and write to disk. This
+ // may have implications for LiveReload, so we should definitely test
+ // that.
+ rebuild: (() => {
+ // TODO support rebuild
+ if (!options.incremental) {
+ return undefined;
+ }
+ let builder = (async () => {
+ let { stylesheetUrl, stylesheetPath, css, moduleMap } =
+ await buildCssModules(config, build);
+ await fse.ensureDir(path.dirname(stylesheetPath));
+ await fse.writeFile(stylesheetPath, css);
+ let result = await build.rebuild!();
+
+ return {
+ ...result,
+ rebuild: builder,
+ cssModules: {
+ stylesheetPath,
+ stylesheetUrl,
+ moduleMap,
+ },
+ };
+ }) as BuildInvalidate;
+ // TODO: unsure about this, check back w/ esbuild docs to clarify what
+ // dispose is doing and see if we need to clear any internal state
+ builder.dispose = build.rebuild!.dispose;
+ return builder;
+ })(),
+ cssModules: {
+ stylesheetPath,
+ stylesheetUrl,
+ moduleMap,
+ },
+ };
+ });
}
function createServerBuild(
config: RemixConfig,
options: Required & { incremental?: boolean },
assetsManifestPromiseRef: AssetsManifestPromiseRef
-): Promise {
+): Promise {
let dependencies = getAppDependencies(config);
let stdin: esbuild.StdinOptions | undefined;
@@ -412,6 +484,7 @@ function createServerBuild(
let isDenoRuntime = config.serverBuildTarget === "deno";
let plugins: esbuild.Plugin[] = [
+ cssModulesServerPlugin(config, assetsManifestPromiseRef),
urlImportsPlugin(),
mdxPlugin(config),
emptyModulesPlugin(config, /\.client(\.[jt]sx?)?$/),
@@ -473,9 +546,14 @@ function createServerBuild(
async function generateAssetsManifest(
config: RemixConfig,
- metafile: esbuild.Metafile
+ metafile: esbuild.Metafile,
+ cssModules: CssModulesResults | undefined
): Promise {
- let assetsManifest = await createAssetsManifest(config, metafile);
+ let assetsManifest = await createAssetsManifest(
+ config,
+ metafile!,
+ cssModules
+ );
let filename = `manifest-${assetsManifest.version.toUpperCase()}.js`;
assetsManifest.url = config.publicPath + filename;
@@ -511,3 +589,88 @@ async function writeServerBuildResult(
}
}
}
+
+/**
+ * Topological sort: For each node, all of its (recursive) dependencies come
+ * before it.
+ * @see https://en.wikipedia.org/wiki/Topological_sorting
+ */
+function topologicalSort(
+ graph: Record,
+ opts: Partial<{ filterEdges(edge: string): boolean }> = {}
+) {
+ let filter = opts.filterEdges || (() => true);
+ let visited: string[] = [];
+ let chain = new Set();
+ let nodes = Object.keys(graph);
+ nodes.forEach(visit);
+
+ function visit(n: string) {
+ if (visited.includes(n)) return;
+ if (chain.has(n)) throw Error(`Cycle detected: ${[...chain].join(" -> ")}`);
+
+ chain.add(n);
+ for (let edge of graph[n]) {
+ if (filter(edge)) {
+ visit(edge);
+ }
+ }
+ chain.delete(n);
+ visited.push(n);
+ }
+ return visited;
+}
+
+async function buildCssModules(
+ config: RemixConfig,
+ build: esbuild.BuildResult & {
+ metafile: esbuild.Metafile;
+ }
+) {
+ // Model files and their imports as an adjacency list
+ // https://en.wikipedia.org/wiki/Adjacency_list
+ // E.g. "Module A imports from B, C, and D" becomes `{A:[B,C,D]}`
+ let graph = Object.fromEntries(
+ Object.entries(build.metafile.inputs).map(([input, { imports }]) => {
+ return [input, imports.map(({ path }) => path)];
+ })
+ );
+
+ // Order CSS Modules based on the module that imported them
+ let componentFiles = topologicalSort(graph, {
+ filterEdges: (node) => node.startsWith("css-modules-namespace:"),
+ });
+
+ let cssModules: string[] = [];
+ for (let componentFile of componentFiles) {
+ let imports = graph[componentFile];
+ for (let imported of imports) {
+ if (imported.endsWith(".module.css") && !cssModules.includes(imported)) {
+ cssModules.push(imported);
+ }
+ }
+ }
+
+ let css = "";
+ let moduleMap = Object.fromEntries(
+ await Promise.all(
+ cssModules.map(async (filePath) => {
+ filePath = filePath.replace(/^css-modules-namespace:/, "");
+ let processed = await processCss({ config, filePath });
+ css += processed.css;
+ return [filePath, processed] as const;
+ })
+ )
+ );
+ let [stylesheetPath, stylesheetUrl] = getCssModulesFileReferences(
+ config,
+ css
+ );
+
+ return {
+ css,
+ moduleMap,
+ stylesheetPath,
+ stylesheetUrl,
+ };
+}
diff --git a/packages/remix-dev/compiler/assets.ts b/packages/remix-dev/compiler/assets.ts
index 4656c8328ee..afdeccecd01 100644
--- a/packages/remix-dev/compiler/assets.ts
+++ b/packages/remix-dev/compiler/assets.ts
@@ -6,6 +6,7 @@ import invariant from "../invariant";
import { getRouteModuleExportsCached } from "./routes";
import { getHash } from "./utils/crypto";
import { createUrl } from "./utils/url";
+import type { CssModulesResults } from "./plugins/cssModulesPlugin";
type Route = RemixConfig["routes"][string];
@@ -31,11 +32,13 @@ export interface AssetsManifest {
hasErrorBoundary: boolean;
};
};
+ cssModules: CssModulesResults | undefined;
}
export async function createAssetsManifest(
config: RemixConfig,
- metafile: esbuild.Metafile
+ metafile: esbuild.Metafile,
+ cssModules: CssModulesResults | undefined
): Promise {
function resolveUrl(outputPath: string): string {
return createUrl(
@@ -106,7 +109,12 @@ export async function createAssetsManifest(
optimizeRoutes(routes, entry.imports);
let version = getHash(JSON.stringify({ entry, routes })).slice(0, 8);
- return { version, entry, routes };
+ return {
+ version,
+ entry,
+ routes,
+ cssModules,
+ };
}
type ImportsCache = { [routeId: string]: string[] };
diff --git a/packages/remix-dev/compiler/plugins/cssModulesPlugin.ts b/packages/remix-dev/compiler/plugins/cssModulesPlugin.ts
new file mode 100644
index 00000000000..46cc9c2c792
--- /dev/null
+++ b/packages/remix-dev/compiler/plugins/cssModulesPlugin.ts
@@ -0,0 +1,362 @@
+import path from "path";
+import * as fse from "fs-extra";
+import chalk from "chalk";
+import type * as esbuild from "esbuild";
+
+import { getHash } from "../utils/crypto";
+import type { RemixConfig } from "../../config";
+import { resolveUrl } from "../utils/url";
+import { createMatchPath } from "../utils/tsconfig";
+import type { AssetsManifestPromiseRef } from "./serverAssetsManifestPlugin";
+
+const browserPluginName = "css-modules";
+const browserPluginNamespace = `${browserPluginName}-namespace`;
+const serverPluginName = "css-modules-server";
+const serverPluginNamespace = `${serverPluginName}-namespace`;
+const suffixMatcher = /\.modules?\.css$/;
+
+let parcelTransform: (opts: ParcelTransformOptions) => ParcelTransformResult;
+const decoder = new TextDecoder();
+
+/**
+ * Loads *.module.css files and returns the hashed JSON so we can get the right
+ * classnames in the HTML.
+ */
+export function cssModulesBrowserPlugin(config: RemixConfig): esbuild.Plugin {
+ return {
+ name: browserPluginName,
+ async setup(build) {
+ build.onResolve({ filter: suffixMatcher }, async (args) => {
+ try {
+ if (!parcelTransform) {
+ parcelTransform = (await import("@parcel/css")).default.transform;
+ console.warn(
+ chalk.yellow(`
+--------------------------------------------------------------------------------
+
+CSS Modules support in Remix is experimental. Its implementation may change.
+If you find a bug, please report it by opening an issue on GitHub:
+
+https://github.com/remix-run/remix/issues/new?labels=bug&template=bug_report.yml
+
+--------------------------------------------------------------------------------
+`)
+ );
+ }
+ } catch (err) {
+ console.error(`
+--------------------------------------------------------------------------------
+
+A CSS Modules file was imported, but the required \`@remix-run/css-modules\`
+dependency was not found.
+
+Install the dependency by running the following command, then restart your app.
+
+ npm install @remix-run/css-modules
+
+--------------------------------------------------------------------------------
+`);
+ throw err;
+ }
+
+ let path = getResolvedFilePath(args);
+ return {
+ pluginName: browserPluginName,
+ namespace: browserPluginNamespace,
+ path,
+ sideEffects: false,
+ };
+ });
+
+ build.onLoad(
+ { filter: suffixMatcher, namespace: browserPluginNamespace },
+ async (args) => {
+ try {
+ let processed = await processCss({
+ config,
+ filePath: args.path,
+ });
+ let json = processed?.json || {};
+ return {
+ contents: JSON.stringify(json),
+ loader: "json",
+ };
+ } catch (err: any) {
+ return {
+ errors: [{ text: err.message }],
+ };
+ }
+ }
+ );
+ },
+ };
+}
+
+/**
+ * This plugin is for the server build. It doesn't actually process the CSS, but
+ * it and waits for the assets manifest to resolve module imports.
+ */
+export function cssModulesServerPlugin(
+ config: RemixConfig,
+ assetsManifestPromiseRef: AssetsManifestPromiseRef
+): esbuild.Plugin {
+ return {
+ name: serverPluginName,
+ async setup(build) {
+ build.onResolve({ filter: suffixMatcher }, (args) => {
+ return {
+ pluginName: serverPluginName,
+ namespace: serverPluginNamespace,
+ path: getResolvedFilePath(args),
+ sideEffects: false,
+ };
+ });
+
+ build.onLoad(
+ { filter: suffixMatcher, namespace: serverPluginNamespace },
+ async (args) => {
+ let res = await assetsManifestPromiseRef.current;
+ let json = res?.cssModules?.moduleMap[args.path]?.json || {};
+ return {
+ contents: JSON.stringify(json),
+ loader: "json",
+ };
+ }
+ );
+ },
+ };
+}
+
+export async function processCss({
+ config,
+ filePath,
+}: {
+ config: RemixConfig;
+ filePath: string;
+}): Promise {
+ let classPrefix =
+ path.basename(filePath, path.extname(filePath)).replace(/\./g, "-") + "__";
+ let source = await fse.readFile(filePath);
+
+ let res = parcelTransform({
+ filename: path.relative(config.appDirectory, filePath),
+ code: source,
+ cssModules: true,
+ minify: process.env.NODE_ENV === "production",
+ analyzeDependencies: true,
+ sourceMap: true,
+ drafts: { nesting: true },
+ });
+
+ let json: CssModuleClassMap = {};
+ let cssModulesContent = decoder.decode(res.code);
+ let parcelExports = res.exports || {};
+
+ // sort() to keep order consistent in different builds
+ for (let originClass of Object.keys(parcelExports).sort()) {
+ let props = parcelExports[originClass];
+ let patchedClass = props.name;
+ let prefixedClassName = getPrefixedClassName(classPrefix, patchedClass);
+ json[originClass] = props.composes.length
+ ? getComposedClassNames(classPrefix, prefixedClassName, props.composes)
+ : prefixedClassName;
+ cssModulesContent = cssModulesContent.replace(
+ new RegExp(`\\.${patchedClass}`, "g"),
+ "." + prefixedClassName
+ );
+ }
+
+ let cssWithSourceMap = cssModulesContent;
+ if (res.map) {
+ // TODO: Sourcemaps aren't working as expected because we are inlining the
+ // map at the end of each module. We need to merge them into a single
+ // inline sourcemap at the end of the build. We can probably use something
+ // like https://www.npmjs.com/package/merge-source-maps
+ // cssWithSourceMap += `\n/*# sourceMappingURL=data:application/json;base64,${res.map.toString(
+ // "base64"
+ // )} */`;
+ }
+
+ return {
+ css: cssWithSourceMap,
+ source: source.toString(),
+ json,
+ moduleExports: parcelExports,
+ dependencies: res.dependencies || [],
+ };
+}
+
+function getResolvedFilePath(args: { path: string; resolveDir: string }) {
+ let matchPath = createMatchPath();
+ if (!matchPath) {
+ return path.resolve(args.resolveDir, args.path);
+ }
+
+ let resolvedPath =
+ matchPath(args.path, undefined, undefined, [
+ ".ts",
+ ".tsx",
+ ".js",
+ ".jsx",
+ ".mdx",
+ ".md",
+ ]) || args.path;
+
+ return path.resolve(args.resolveDir, resolvedPath);
+}
+
+export function getCssModulesFileReferences(
+ config: RemixConfig,
+ css: string
+): [stylesheetPath: string, stylesheetUrl: string] {
+ let hash = getHash(css).slice(0, 8).toUpperCase();
+ let filePath = path.resolve(
+ config.assetsBuildDirectory,
+ "_assets",
+ `__css-modules-${hash}.css`
+ );
+ let fileUrl = resolveUrl(config, filePath);
+ return [filePath, fileUrl];
+}
+
+/**
+ * When a user composes classnames in CSS modules, the value returned for the
+ * JSON map is a concat'd version of all the classname strings composed. Note
+ * that the user may compose classnames referenced in other CSS module files,
+ * but that will require us to juggle dependencies which is a little tricky with
+ * the current build since we don't know for sure if that dependency has been
+ * processed yet. We may encounter limitations with local composition as well.
+ * Coming back to this, but we'll initially launch without official support for
+ * the `composes` property.
+ * https://github.com/remix-run/remix/pull/2489/files#r862282330
+ */
+function getComposedClassNames(
+ prefix: string,
+ name: string,
+ composes: CssModuleReference[]
+) {
+ return composes.reduce((className, composed) => {
+ // skip dependencies for now
+ if (composed.type === "dependency") {
+ return className;
+ }
+ return className + " " + getPrefixedClassName(prefix, composed.name);
+ }, name);
+}
+
+function getPrefixedClassName(prefix: string, name: string) {
+ return prefix + name;
+}
+
+export interface CssModuleFileContents {
+ css: string;
+ source: string;
+ json: CssModuleClassMap;
+ moduleExports: CssModuleExports;
+ dependencies: CssModuleDependency[];
+}
+
+export type CssModuleFileMap = Record;
+
+export interface CssModulesResults {
+ stylesheetPath: string;
+ stylesheetUrl: string;
+ moduleMap: CssModuleFileMap;
+}
+
+export type CssModuleClassMap = Record;
+
+// Copy/pasted some types from @parcel/css to avoid dependency issues
+interface ParcelTransformOptions {
+ filename: string;
+ code: Buffer;
+ minify?: boolean;
+ sourceMap?: boolean;
+ cssModules?: boolean;
+ drafts?: { [key: string]: boolean };
+ analyzeDependencies?: boolean;
+ unusedSymbols?: string[];
+}
+
+interface ParcelTransformResult {
+ code: Buffer;
+ map: Buffer | void;
+ exports: CssModuleExports | void;
+ dependencies: CssModuleDependency[] | void;
+}
+
+/**
+ * Many of these types were copied from @parcel/css and modified slightly for
+ * our needs. Some of this data will end up in the assets manifest but we don't
+ * want more than we need.
+ */
+
+type CssModuleExports = {
+ [name: string]: CssModuleExport;
+};
+
+interface CssModuleExport {
+ name: string;
+ composes: CssModuleReference[];
+}
+
+type CssModuleReference =
+ | LocalCssModuleReference
+ | GlobalCssModuleReference
+ | DependencyCssModuleReference;
+
+interface LocalCssModuleReference {
+ type: "local";
+ name: string;
+}
+
+interface GlobalCssModuleReference {
+ type: "global";
+ name: string;
+}
+
+interface DependencyCssModuleReference {
+ type: "dependency";
+ name: string;
+ /** The dependency specifier for the referenced file. */
+ specifier: string;
+}
+
+type CssModuleDependency = CssModuleImportDependency | CssModuleUrlDependency;
+
+interface CssModuleImportDependency {
+ type: "import";
+ /** The url of the `@import` dependency. */
+ url: string;
+ /** The media query for the `@import` rule. */
+ media: string | null;
+ /** The `supports()` query for the `@import` rule. */
+ supports: string | null;
+ /** The source location where the `@import` rule was found. */
+ loc: CssModuleSourceLocation;
+}
+
+interface CssModuleUrlDependency {
+ type: "url";
+ /** The url of the dependency. */
+ url: string;
+ /** The source location where the `url()` was found. */
+ loc: CssModuleSourceLocation;
+ /** The placeholder that the url was replaced with. */
+ placeholder: string;
+}
+
+interface CssModuleSourceLocation {
+ /** The file path in which the dependency exists. */
+ filePath: string;
+ /** The start location of the dependency. */
+ start: {
+ line: number;
+ column: number;
+ };
+ /** The end location (inclusive) of the dependency. */
+ end: {
+ line: number;
+ column: number;
+ };
+}
diff --git a/packages/remix-dev/compiler/plugins/serverAssetsManifestPlugin.ts b/packages/remix-dev/compiler/plugins/serverAssetsManifestPlugin.ts
index fd434042ccc..561de097b6f 100644
--- a/packages/remix-dev/compiler/plugins/serverAssetsManifestPlugin.ts
+++ b/packages/remix-dev/compiler/plugins/serverAssetsManifestPlugin.ts
@@ -3,8 +3,9 @@ import jsesc from "jsesc";
import invariant from "../../invariant";
import { assetsManifestVirtualModule } from "../virtualModules";
+import type { AssetsManifest } from "../../compiler/assets";
-export type AssetsManifestPromiseRef = { current?: Promise };
+export type AssetsManifestPromiseRef = { current?: Promise };
/**
* Creates a virtual module called `@remix-run/dev/assets-manifest` that exports
diff --git a/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts b/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts
index 09c20fdc908..f4bbfb7363f 100644
--- a/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts
+++ b/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts
@@ -43,6 +43,11 @@ export function serverBareModulesPlugin(
return undefined;
}
+ // Always bundle @remix-run/css-modules
+ if (path === "@remix-run/css-modules") {
+ return undefined;
+ }
+
// To prevent `import xxx from "remix"` from ending up in the bundle
// we "bundle" remix but the other modules where the code lives.
if (path === "remix") {
diff --git a/packages/remix-dev/compiler/routes.ts b/packages/remix-dev/compiler/routes.ts
index 22764cfb728..57e33438683 100644
--- a/packages/remix-dev/compiler/routes.ts
+++ b/packages/remix-dev/compiler/routes.ts
@@ -33,6 +33,9 @@ export async function getRouteModuleExportsCached(
}
}
+ // TODO: Why is this here? The only purpose of this function is to cache the
+ // result of getRouteModuleExports! This should either be there or somewhere
+ // in the caller.
// Layout routes can't have actions
if (routeId.match(/\/__[\s\w\d_-]+$/) && cached.exports.includes("action")) {
throw new Error(`Actions are not supported in layout routes: ${routeId}`);
diff --git a/packages/remix-dev/compiler/utils/url.ts b/packages/remix-dev/compiler/utils/url.ts
index 7c30e4d248d..f873af4b2c6 100644
--- a/packages/remix-dev/compiler/utils/url.ts
+++ b/packages/remix-dev/compiler/utils/url.ts
@@ -1,5 +1,14 @@
import * as path from "path";
+import type { RemixConfig } from "../../config";
+
export function createUrl(publicPath: string, file: string): string {
return publicPath + file.split(path.win32.sep).join("/");
}
+
+export function resolveUrl(config: RemixConfig, outputPath: string): string {
+ return createUrl(
+ config.publicPath,
+ path.relative(config.assetsBuildDirectory, path.resolve(outputPath))
+ );
+}
diff --git a/packages/remix-dev/index.ts b/packages/remix-dev/index.ts
index 7a504273be1..2df8c7ec79e 100644
--- a/packages/remix-dev/index.ts
+++ b/packages/remix-dev/index.ts
@@ -5,4 +5,5 @@ export type { AppConfig } from "./config";
export * as cli from "./cli/index";
export { createApp } from "./cli/create";
+export type { AssetsManifest } from "./compiler/assets";
export { getDependenciesToBundle } from "./compiler/dependencies";
diff --git a/packages/remix-dev/modules.ts b/packages/remix-dev/modules.ts
index 1dfe7c86ac4..7890dcd4ea4 100644
--- a/packages/remix-dev/modules.ts
+++ b/packages/remix-dev/modules.ts
@@ -2,8 +2,18 @@ declare module "*.aac" {
let asset: string;
export default asset;
}
+
declare module "*.css" {
- let asset: string;
+ // This needs to be any because TS cannot differentiate between *.css &
+ // *.module.css. In an ideal world we could make it an object for modules and
+ // a string for regular CSS, but in practice I don't think the typing provides
+ // much value in either scenario. For users to get TS benefits w/ modules
+ // they'd need a declaration file for individual CSS module files. Would be
+ // nice if we could generate that for them.
+ //
+ // See https://github.com/microsoft/TypeScript/issues/38638 for TS limitations
+ // with wildcard matching.
+ let asset: any;
export default asset;
}
declare module "*.eot" {
diff --git a/packages/remix-dev/package.json b/packages/remix-dev/package.json
index fbefdff5bc6..f0ed2ba1e57 100644
--- a/packages/remix-dev/package.json
+++ b/packages/remix-dev/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-run/dev",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"description": "Dev tools and CLI for Remix",
"homepage": "https://remix.run",
"license": "MIT",
@@ -21,7 +21,7 @@
"@babel/preset-typescript": "7.16.7",
"@esbuild-plugins/node-modules-polyfill": "^0.1.4",
"@npmcli/package-json": "^2.0.0",
- "@remix-run/server-runtime": "1.5.1",
+ "@remix-run/server-runtime": "0.0.0-experimental-ae984c8e",
"cacache": "^15.0.5",
"chalk": "^4.1.2",
"chokidar": "^3.5.1",
@@ -55,6 +55,7 @@
"xdm": "^2.0.0"
},
"devDependencies": {
+ "@parcel/css": "1.8.1",
"@types/cacache": "^15.0.0",
"@types/gunzip-maybe": "^1.4.0",
"@types/inquirer": "^8.2.0",
diff --git a/packages/remix-eslint-config/package.json b/packages/remix-eslint-config/package.json
index 0f6120ae156..9867f6c18c1 100644
--- a/packages/remix-eslint-config/package.json
+++ b/packages/remix-eslint-config/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/eslint-config",
"description": "ESLint configuration for Remix projects",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"repository": {
"type": "git",
"url": "https://github.com/remix-run/remix",
diff --git a/packages/remix-express/package.json b/packages/remix-express/package.json
index 4e5fb98d01d..87d0a7e4d0c 100644
--- a/packages/remix-express/package.json
+++ b/packages/remix-express/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/express",
"description": "Express server request handler for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -12,7 +12,7 @@
"url": "https://github.com/remix-run/remix/issues"
},
"dependencies": {
- "@remix-run/node": "1.5.1"
+ "@remix-run/node": "0.0.0-experimental-ae984c8e"
},
"peerDependencies": {
"express": "^4.17.1"
diff --git a/packages/remix-netlify/package.json b/packages/remix-netlify/package.json
index f0a33ede010..a043e2ae3a8 100644
--- a/packages/remix-netlify/package.json
+++ b/packages/remix-netlify/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/netlify",
"description": "Netlify server request handler for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -12,7 +12,7 @@
"url": "https://github.com/remix-run/remix/issues"
},
"dependencies": {
- "@remix-run/node": "1.5.1"
+ "@remix-run/node": "0.0.0-experimental-ae984c8e"
},
"peerDependencies": {
"@netlify/functions": "^0.10.0 || ^1.0.0"
diff --git a/packages/remix-node/package.json b/packages/remix-node/package.json
index 0adcd5cdd85..fdc81b80c4c 100644
--- a/packages/remix-node/package.json
+++ b/packages/remix-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/node",
"description": "Node.js platform abstractions for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -12,7 +12,7 @@
"url": "https://github.com/remix-run/remix/issues"
},
"dependencies": {
- "@remix-run/server-runtime": "1.5.1",
+ "@remix-run/server-runtime": "0.0.0-experimental-ae984c8e",
"@remix-run/web-fetch": "^4.1.3",
"@remix-run/web-file": "^3.0.2",
"@remix-run/web-stream": "^1.0.3",
diff --git a/packages/remix-react/entry.ts b/packages/remix-react/entry.ts
index 77feb17a8b7..9d0052c6920 100644
--- a/packages/remix-react/entry.ts
+++ b/packages/remix-react/entry.ts
@@ -22,4 +22,100 @@ export interface AssetsManifest {
routes: RouteManifest;
url: string;
version: string;
+ cssModules: CssModulesResults | undefined;
+}
+
+// TODO: This should ideally be in one place; duped for now from remix-dev
+interface CssModulesResults {
+ stylesheetPath: string;
+ stylesheetUrl: string;
+ moduleMap: CssModuleFileMap;
+}
+
+interface CssModuleFileContents {
+ css: string;
+ sourceMap: string | null;
+ json: CssModuleClassMap;
+ moduleExports: CssModuleExports;
+ dependencies: CssModuleDependency[];
+}
+
+type CssModuleFileMap = Record;
+
+type CssModuleClassMap = Record;
+
+/**
+ * Many of these types were copied from @parcel/css and modified slightly for
+ * our needs. Some of this data will end up in the assets manifest but we don't
+ * want more than we need.
+ */
+
+type CssModuleExports = {
+ [name: string]: CssModuleExport;
+};
+
+interface CssModuleExport {
+ name: string;
+ composes: CssModuleReference[];
+}
+
+type CssModuleReference =
+ | LocalCssModuleReference
+ | GlobalCssModuleReference
+ | DependencyCssModuleReference;
+
+interface LocalCssModuleReference {
+ type: "local";
+ name: string;
+}
+
+interface GlobalCssModuleReference {
+ type: "global";
+ name: string;
+}
+
+interface DependencyCssModuleReference {
+ type: "dependency";
+ name: string;
+ /** The dependency specifier for the referenced file. */
+ specifier: string;
+}
+
+type CssModuleDependency = CssModuleImportDependency | CssModuleUrlDependency;
+
+interface CssModuleImportDependency {
+ type: "import";
+ /** The url of the `@import` dependency. */
+ url: string;
+ /** The media query for the `@import` rule. */
+ media: string | null;
+ /** The `supports()` query for the `@import` rule. */
+ supports: string | null;
+ /** The source location where the `@import` rule was found. */
+ loc: CssModuleSourceLocation;
+}
+
+interface CssModuleUrlDependency {
+ type: "url";
+ /** The url of the dependency. */
+ url: string;
+ /** The source location where the `url()` was found. */
+ loc: CssModuleSourceLocation;
+ /** The placeholder that the url was replaced with. */
+ placeholder: string;
+}
+
+interface CssModuleSourceLocation {
+ /** The file path in which the dependency exists. */
+ filePath: string;
+ /** The start location of the dependency. */
+ start: {
+ line: number;
+ column: number;
+ };
+ /** The end location (inclusive) of the dependency. */
+ end: {
+ line: number;
+ column: number;
+ };
}
diff --git a/packages/remix-react/package.json b/packages/remix-react/package.json
index c52218680a0..d2bdbf1668b 100644
--- a/packages/remix-react/package.json
+++ b/packages/remix-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/react",
"description": "React DOM bindings for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
diff --git a/packages/remix-serve/package.json b/packages/remix-serve/package.json
index efee2e78516..b0ba5c5d5ca 100644
--- a/packages/remix-serve/package.json
+++ b/packages/remix-serve/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/serve",
"description": "Production application server for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -15,7 +15,7 @@
"remix-serve": "cli.js"
},
"dependencies": {
- "@remix-run/express": "1.5.1",
+ "@remix-run/express": "0.0.0-experimental-ae984c8e",
"compression": "^1.7.4",
"express": "^4.17.1",
"morgan": "^1.10.0"
diff --git a/packages/remix-server-runtime/entry.ts b/packages/remix-server-runtime/entry.ts
index 8a555c429a4..f7208f48f9c 100644
--- a/packages/remix-server-runtime/entry.ts
+++ b/packages/remix-server-runtime/entry.ts
@@ -27,8 +27,28 @@ export interface AssetsManifest {
routes: RouteManifest;
url: string;
version: string;
+ cssModules: CssModulesResults | undefined;
}
+// TODO: This should ideally be in one place; duped for now from remix-dev
+interface CssModulesResults {
+ stylesheetPath: string;
+ stylesheetUrl: string;
+ moduleMap: CssModuleFileMap;
+}
+
+interface CssModuleFileContents {
+ css: string;
+ sourceMap: string | null;
+ json: CssModuleClassMap;
+ moduleExports: CssModuleExports;
+ dependencies: CssModuleDependency[];
+}
+
+type CssModuleFileMap = Record;
+
+type CssModuleClassMap = Record;
+
export function createEntryMatches(
matches: RouteMatch[],
routes: RouteManifest
@@ -48,3 +68,79 @@ export function createEntryRouteModules(
return memo;
}, {} as RouteModules);
}
+
+/**
+ * Many of these types were copied from @parcel/css and modified slightly for
+ * our needs. Some of this data will end up in the assets manifest but we don't
+ * want more than we need.
+ */
+
+type CssModuleExports = {
+ [name: string]: CssModuleExport;
+};
+
+interface CssModuleExport {
+ name: string;
+ composes: CssModuleReference[];
+}
+
+type CssModuleReference =
+ | LocalCssModuleReference
+ | GlobalCssModuleReference
+ | DependencyCssModuleReference;
+
+interface LocalCssModuleReference {
+ type: "local";
+ name: string;
+}
+
+interface GlobalCssModuleReference {
+ type: "global";
+ name: string;
+}
+
+interface DependencyCssModuleReference {
+ type: "dependency";
+ name: string;
+ /** The dependency specifier for the referenced file. */
+ specifier: string;
+}
+
+type CssModuleDependency = CssModuleImportDependency | CssModuleUrlDependency;
+
+interface CssModuleImportDependency {
+ type: "import";
+ /** The url of the `@import` dependency. */
+ url: string;
+ /** The media query for the `@import` rule. */
+ media: string | null;
+ /** The `supports()` query for the `@import` rule. */
+ supports: string | null;
+ /** The source location where the `@import` rule was found. */
+ loc: CssModuleSourceLocation;
+}
+
+interface CssModuleUrlDependency {
+ type: "url";
+ /** The url of the dependency. */
+ url: string;
+ /** The source location where the `url()` was found. */
+ loc: CssModuleSourceLocation;
+ /** The placeholder that the url was replaced with. */
+ placeholder: string;
+}
+
+interface CssModuleSourceLocation {
+ /** The file path in which the dependency exists. */
+ filePath: string;
+ /** The start location of the dependency. */
+ start: {
+ line: number;
+ column: number;
+ };
+ /** The end location (inclusive) of the dependency. */
+ end: {
+ line: number;
+ column: number;
+ };
+}
diff --git a/packages/remix-server-runtime/package.json b/packages/remix-server-runtime/package.json
index 70d0b4146e6..545f04a05cd 100644
--- a/packages/remix-server-runtime/package.json
+++ b/packages/remix-server-runtime/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/server-runtime",
"description": "Server runtime for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"main": "./index.js",
"module": "./esm/index.js",
diff --git a/packages/remix-vercel/package.json b/packages/remix-vercel/package.json
index 5fdd47ed0bc..2b594436307 100644
--- a/packages/remix-vercel/package.json
+++ b/packages/remix-vercel/package.json
@@ -1,7 +1,7 @@
{
"name": "@remix-run/vercel",
"description": "Vercel server request handler for Remix",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"license": "MIT",
"repository": {
"type": "git",
@@ -12,7 +12,7 @@
"url": "https://github.com/remix-run/remix/issues"
},
"dependencies": {
- "@remix-run/node": "1.5.1"
+ "@remix-run/node": "0.0.0-experimental-ae984c8e"
},
"peerDependencies": {
"@vercel/node": "^1.8.3"
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 5cf5e35aca2..81c3f317ab6 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,7 +1,7 @@
{
"name": "remix",
"description": "A framework for building better websites",
- "version": "1.5.1",
+ "version": "0.0.0-experimental-ae984c8e",
"homepage": "https://remix.run",
"license": "MIT",
"repository": {
diff --git a/rollup.config.js b/rollup.config.js
index 43da5834d5d..ec547df7475 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -145,6 +145,64 @@ function remix() {
];
}
+/** @returns {import("rollup").RollupOptions[]} */
+function remixCssModules() {
+ let sourceDir = "packages/remix-css-modules";
+ let outputDir = getOutputDir("@remix-run/css-modules")
+ let version = getVersion(sourceDir);
+
+ return [
+ {
+ external(id) {
+ return isBareModuleId(id);
+ },
+ input: [`${sourceDir}/browser.ts`, `${sourceDir}/server.ts`],
+ output: {
+ banner: createBanner("@remix-run/css-modules", version),
+ dir: outputDir,
+ format: "cjs",
+ preserveModules: true,
+ exports: "named",
+ },
+ plugins: [
+ babel({
+ babelHelpers: "bundled",
+ exclude: /node_modules/,
+ extensions: [".ts"],
+ }),
+ nodeResolve({ extensions: [".ts"] }),
+ copy({
+ targets: [
+ { src: `LICENSE.md`, dest: outputDir },
+ { src: `${sourceDir}/package.json`, dest: outputDir },
+ { src: `${sourceDir}/README.md`, dest: outputDir },
+ ],
+ }),
+ ],
+ },
+ {
+ external(id) {
+ return isBareModuleId(id);
+ },
+ input: [`${sourceDir}/browser.ts`, `${sourceDir}/server.ts`],
+ output: {
+ banner: createBanner("@remix-run/css-modules", version),
+ dir: `${outputDir}/esm`,
+ format: "esm",
+ preserveModules: true,
+ },
+ plugins: [
+ babel({
+ babelHelpers: "bundled",
+ exclude: /node_modules/,
+ extensions: [".ts"],
+ }),
+ nodeResolve({ extensions: [".ts"] }),
+ ],
+ },
+ ];
+}
+
/** @returns {import("rollup").RollupOptions[]} */
function remixDev() {
let sourceDir = "packages/remix-dev";
@@ -183,6 +241,7 @@ function remixDev() {
{ src: `LICENSE.md`, dest: outputDir },
{ src: `${sourceDir}/package.json`, dest: outputDir },
{ src: `${sourceDir}/README.md`, dest: outputDir },
+ { src: `${sourceDir}/assets-manifest.d.ts`, dest: outputDir },
{
src: `${sourceDir}/compiler/shims`,
dest: `${outputDir}/compiler`,
@@ -876,6 +935,7 @@ export default function rollup(options) {
// Do not blow away destination app node_modules/remix directory which is
// correct for that deploy target setup
...(activeOutputDir === "build" ? remix(options) : []),
+ ...remixCssModules(options),
...remixDev(options),
...remixServerRuntime(options),
...remixNode(options),
diff --git a/scripts/deployment-test/package.json b/scripts/deployment-test/package.json
index 66772016d1b..0dbbef82d80 100644
--- a/scripts/deployment-test/package.json
+++ b/scripts/deployment-test/package.json
@@ -10,7 +10,7 @@
"@cloudflare/wrangler": "latest",
"@iarna/toml": "^2.2.5",
"@octokit/rest": "^18.12.0",
- "@remix-run/dev": "1.5.1",
+ "@remix-run/dev": "0.0.0-experimental-ae984c8e",
"@testing-library/cypress": "^8.0.2",
"aws-sdk": "^2.1055.0",
"cypress": "9.2.0",
diff --git a/scripts/publish.js b/scripts/publish.js
index 12accadb20f..a807dc9c7c3 100644
--- a/scripts/publish.js
+++ b/scripts/publish.js
@@ -56,6 +56,7 @@ async function run() {
"netlify",
"react",
"serve",
+ "css-modules",
]) {
publish(path.join(buildDir, "@remix-run", name), tag);
}
diff --git a/scripts/utils.js b/scripts/utils.js
index cd46b3b636b..5d25606f427 100644
--- a/scripts/utils.js
+++ b/scripts/utils.js
@@ -18,7 +18,7 @@ let remixPackages = {
"vercel",
],
runtimes: ["cloudflare", "deno", "node"],
- core: ["dev", "server-runtime", "react", "eslint-config"],
+ core: ["dev", "server-runtime", "react", "css-modules", "eslint-config"],
get all() {
return [...this.adapters, ...this.runtimes, ...this.core, "serve"];
},
diff --git a/templates/deno/.vscode/resolve_npm_imports.json b/templates/deno/.vscode/resolve_npm_imports.json
index 2a7dcfdd408..ebb38556432 100644
--- a/templates/deno/.vscode/resolve_npm_imports.json
+++ b/templates/deno/.vscode/resolve_npm_imports.json
@@ -3,13 +3,12 @@
"// Remix does not support import maps.": "",
"// Dependency management is done through `npm` and `node_modules/` instead.": "",
"// Deno-only dependencies may be imported via URL imports (without using import maps).": "",
-
"imports": {
"react": "https://esm.sh/react@18.0.0",
"react-dom": "https://esm.sh/react-dom@18.0.0",
"react-dom/server": "https://esm.sh/react-dom@18.0.0/server",
- "@remix-run/dev/server-build": "https://esm.sh/@remix-run/dev@1.4.3/server-build",
- "@remix-run/deno": "https://esm.sh/@remix-run/deno@1.4.3",
- "@remix-run/react": "https://esm.sh/@remix-run/react@1.4.3"
+ "@remix-run/dev/server-build": "https://esm.sh/@remix-run/dev@0.0.0-experimental-ae984c8e/server-build",
+ "@remix-run/deno": "https://esm.sh/@remix-run/deno@0.0.0-experimental-ae984c8e",
+ "@remix-run/react": "https://esm.sh/@remix-run/react@0.0.0-experimental-ae984c8e"
}
}
diff --git a/tsconfig.json b/tsconfig.json
index 31fd49101c5..619d500e8cc 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -8,6 +8,7 @@
{ "path": "packages/remix-cloudflare" },
{ "path": "packages/remix-cloudflare-pages" },
{ "path": "packages/remix-cloudflare-workers" },
+ { "path": "packages/remix-css-modules" },
{ "path": "packages/remix-dev" },
{ "path": "packages/remix-express" },
{ "path": "packages/remix-netlify" },
diff --git a/yarn.lock b/yarn.lock
index e896c97412d..35373f5fab5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1565,6 +1565,62 @@
resolved "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz"
integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==
+"@parcel/css-darwin-arm64@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-darwin-arm64/-/css-darwin-arm64-1.8.1.tgz#1d7694185626f956504cc6f099317455145bb880"
+ integrity sha512-PbpIlqLMAhWZlimKCdNP/ZfGNJUlEWgNeTcO2LDjPIK5JK6oTAJHfP/PPzjLS8mu+JIznZ//9MnVOUi1xcjXMA==
+
+"@parcel/css-darwin-x64@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-darwin-x64/-/css-darwin-x64-1.8.1.tgz#40ce6bff78c7aecc32759faa9b52954247bc2ec1"
+ integrity sha512-R4FrwXQGAgW3/YRCSRCBNcV6mz+OKqYuyrVnZBmKTLDuTGhZHCF12qLL7SV5jYsKXBDauYAXDv/SOFIwlikVXg==
+
+"@parcel/css-linux-arm-gnueabihf@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-linux-arm-gnueabihf/-/css-linux-arm-gnueabihf-1.8.1.tgz#f540f8a92ed99ec6b07408aeef443804a8c7aba5"
+ integrity sha512-MVRlPGipRrs+f6nURR6cJbFw85YSXkPbR6l/0Hm1vyFlNn0HmRDCEWZFPwvvSavibU968Wgc5yKaC78D6Ecgsw==
+
+"@parcel/css-linux-arm64-gnu@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-linux-arm64-gnu/-/css-linux-arm64-gnu-1.8.1.tgz#4a63ea53eea93d2858bf2096fdad5ddeb3e65ee8"
+ integrity sha512-s6UpF9CjUMeeCELx0Cu+HtR8RKycm516b1mJlQC8hsPtAyDYlByW4tSDwC3By4Fqf3xCan6IH/oaq0ujS0Iqew==
+
+"@parcel/css-linux-arm64-musl@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-linux-arm64-musl/-/css-linux-arm64-musl-1.8.1.tgz#7fe489a92cd74139b904216813a4002ae44300cf"
+ integrity sha512-Tp3Pe2tx7mltPrZ1ZDV8PLkgYcwQOigrH9YjPPOaf8iFptDpHOv1y2cs1eSgnvP+5kBdIXd7H87kGSC7OosuXg==
+
+"@parcel/css-linux-x64-gnu@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-linux-x64-gnu/-/css-linux-x64-gnu-1.8.1.tgz#6a1d733eca71367735d8a7f841f779a03d30272e"
+ integrity sha512-8yqXRlei4qBFSv9R8yru6yB2ak7frA/z6rMB2E5lNN8kMhpB1E0xKYMhsTZdMOV5A/gkPZlP3sHZG4qQ3GOLgQ==
+
+"@parcel/css-linux-x64-musl@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-linux-x64-musl/-/css-linux-x64-musl-1.8.1.tgz#603245a11222fad815f8fa704fe59d15f0abdd46"
+ integrity sha512-S1Qf9tZzX7AnmqKRhR/qpFYsqSCxYSz5KdekdxIijPEMxyI5tpWp6g2adGYxrCuV0E5EpcpmXlBT6d6+8FrgPg==
+
+"@parcel/css-win32-x64-msvc@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css-win32-x64-msvc/-/css-win32-x64-msvc-1.8.1.tgz#175a909ae80cd7634f1c9ffa84063b85161df22b"
+ integrity sha512-tZ5s2zM/63mEdpdnE82xtfDDR7tAN32REii1EU5LOdfpB2PIw902p30fvklj1pOFBji/v/JdpAdLIYc4W7Gb6w==
+
+"@parcel/css@1.8.1":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@parcel/css/-/css-1.8.1.tgz#d5a756c18eefcc407267c5675c8e66edf206c483"
+ integrity sha512-TOfe+msei+NuPPKb60Kc+nPuCThl07L3Fut67nfot1OXy2hKYr/eF7AiAguCaIlRXkjEtXRR4S7fO24dLZ1C9g==
+ dependencies:
+ detect-libc "^1.0.3"
+ optionalDependencies:
+ "@parcel/css-darwin-arm64" "1.8.1"
+ "@parcel/css-darwin-x64" "1.8.1"
+ "@parcel/css-linux-arm-gnueabihf" "1.8.1"
+ "@parcel/css-linux-arm64-gnu" "1.8.1"
+ "@parcel/css-linux-arm64-musl" "1.8.1"
+ "@parcel/css-linux-x64-gnu" "1.8.1"
+ "@parcel/css-linux-x64-musl" "1.8.1"
+ "@parcel/css-win32-x64-msvc" "1.8.1"
+
"@playwright/test@1.20.2":
version "1.20.2"
resolved "https://registry.npmjs.org/@playwright/test/-/test-1.20.2.tgz"
@@ -4183,6 +4239,11 @@ detect-indent@^6.0.0:
resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz"
integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==
+detect-libc@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
detect-newline@3.1.0, detect-newline@^3.0.0:
version "3.1.0"
resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz"