diff --git a/.changeset/fuzzy-cows-press.md b/.changeset/fuzzy-cows-press.md new file mode 100644 index 000000000..d295e92a0 --- /dev/null +++ b/.changeset/fuzzy-cows-press.md @@ -0,0 +1,6 @@ +--- +"@headstartwp/core": minor +"@headstartwp/next": minor +--- + +Link handling diff --git a/package-lock.json b/package-lock.json index 1258b3857..9180eb693 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "jest-environment-jsdom": "^29.0.3", "lint-staged": "^11.1.2", "prettier": "3.2.5", - "turbo": "^2.0.3" + "turbo": "^2.0.11" }, "engines": { "node": ">=18.0.0", @@ -4567,8 +4567,9 @@ } }, "node_modules/@next/env": { - "version": "14.2.4", - "license": "MIT" + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", + "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" }, "node_modules/@next/eslint-plugin-next": { "version": "14.2.3", @@ -4600,9 +4601,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", - "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", "cpu": [ "arm64" ], @@ -4615,9 +4616,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", - "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", "cpu": [ "x64" ], @@ -4630,9 +4631,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", - "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", "cpu": [ "arm64" ], @@ -4645,9 +4646,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", - "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", "cpu": [ "arm64" ], @@ -4660,11 +4661,12 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.4", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4674,11 +4676,12 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.4", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4688,9 +4691,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", - "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", "cpu": [ "arm64" ], @@ -4703,9 +4706,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", - "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", "cpu": [ "ia32" ], @@ -4718,9 +4721,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", - "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", "cpu": [ "x64" ], @@ -15411,10 +15414,11 @@ "peer": true }, "node_modules/next": { - "version": "14.2.4", - "license": "MIT", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", + "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", "dependencies": { - "@next/env": "14.2.4", + "@next/env": "14.2.5", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -15429,15 +15433,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.4", - "@next/swc-darwin-x64": "14.2.4", - "@next/swc-linux-arm64-gnu": "14.2.4", - "@next/swc-linux-arm64-musl": "14.2.4", - "@next/swc-linux-x64-gnu": "14.2.4", - "@next/swc-linux-x64-musl": "14.2.4", - "@next/swc-win32-arm64-msvc": "14.2.4", - "@next/swc-win32-ia32-msvc": "14.2.4", - "@next/swc-win32-x64-msvc": "14.2.4" + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -15467,111 +15471,6 @@ "react": ">=17.0.0" } }, - "node_modules/next/node_modules/@next/swc-darwin-arm64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", - "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/next/node_modules/@next/swc-darwin-x64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", - "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/next/node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", - "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/next/node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", - "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/next/node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", - "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/next/node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", - "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/next/node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", - "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "dev": true, @@ -19398,25 +19297,26 @@ "peer": true }, "node_modules/turbo": { - "version": "2.0.5", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.0.11.tgz", + "integrity": "sha512-imDlFFAvitbCm1JtDFJ6eG882qwxHUmVT2noPb3p2jq5o5DuXOchMbkVS9kUeC3/4WpY5N0GBZ3RvqNyjHZw1Q==", "dev": true, - "license": "MIT", "bin": { "turbo": "bin/turbo" }, "optionalDependencies": { - "turbo-darwin-64": "2.0.5", - "turbo-darwin-arm64": "2.0.5", - "turbo-linux-64": "2.0.5", - "turbo-linux-arm64": "2.0.5", - "turbo-windows-64": "2.0.5", - "turbo-windows-arm64": "2.0.5" + "turbo-darwin-64": "2.0.11", + "turbo-darwin-arm64": "2.0.11", + "turbo-linux-64": "2.0.11", + "turbo-linux-arm64": "2.0.11", + "turbo-windows-64": "2.0.11", + "turbo-windows-arm64": "2.0.11" } }, "node_modules/turbo-darwin-64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.0.6.tgz", - "integrity": "sha512-XpgBwWj3Ggmz/gQVqXdMKXHC1iFPMDiuwugLwSzE7Ih0O13JuNtYZKhQnopvbDQnFQCeRq2Vsm5OTWabg/oB/g==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.0.11.tgz", + "integrity": "sha512-YlHEEhcm+jI1BSZoLugGHUWDfRXaNaQIv7tGQBfadYjo9kixBnqoTOU6s1ubOrQMID+lizZZQs79GXwqM6vohg==", "cpu": [ "x64" ], @@ -19426,9 +19326,9 @@ ] }, "node_modules/turbo-darwin-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.0.6.tgz", - "integrity": "sha512-RfeZYXIAkiA21E8lsvfptGTqz/256YD+eI1x37fedfvnHFWuIMFZGAOwJxtZc6QasQunDZ9TRRREbJNI68tkIw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.0.11.tgz", + "integrity": "sha512-K/YW+hWzRQ/wGmtffxllH4M1tgy8OlwgXODrIiAGzkSpZl9+pIsem/F86UULlhsIeavBYK/LS5+dzV3DPMjJ9w==", "cpu": [ "arm64" ], @@ -19438,20 +19338,21 @@ ] }, "node_modules/turbo-linux-64": { - "version": "2.0.5", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.0.11.tgz", + "integrity": "sha512-mv8CwGP06UPweMh1Vlp6PI6OWnkuibxfIJ4Vlof7xqjohAaZU5FLqeOeHkjQflH/6YrCVuS9wrK0TFOu+meTtA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/turbo-linux-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.0.6.tgz", - "integrity": "sha512-eQKu6utCVUkIH2kqOzD8OS6E0ba6COjWm6PRDTNCHQRljZW503ycaTUIdMOiJrVg1MkEjDyOReUg8s8D18aJ4Q==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.0.11.tgz", + "integrity": "sha512-wLE5tl4oriTmHbuayc0ki0csaCplmVLj+uCWtecM/mfBuZgNS9ICNM9c4sB+Cfl5tlBBFeepqRNgvRvn8WeVZg==", "cpu": [ "arm64" ], @@ -19461,9 +19362,9 @@ ] }, "node_modules/turbo-windows-64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.0.6.tgz", - "integrity": "sha512-+9u4EPrpoeHYCQ46dRcou9kbkSoelhOelHNcbs2d86D6ruYD/oIAHK9qgYK8LeARRz0jxhZIA/dWYdYsxJJWkw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.0.11.tgz", + "integrity": "sha512-tja3zvVCSWu3HizOoeQv0qDJ+GeWGWRFOOM6a8i3BYnXLgGKAaDZFcjwzgC50tWiAw4aowIVR4OouwIyRhLBaQ==", "cpu": [ "x64" ], @@ -19473,77 +19374,12 @@ ] }, "node_modules/turbo-windows-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.0.6.tgz", - "integrity": "sha512-rdrKL+p+EjtdDVg0wQ/7yTbzkIYrnb0Pw4IKcjsy3M0RqUM9UcEi67b94XOAyTa5a0GqJL1+tUj2ebsFGPgZbg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo/node_modules/turbo-darwin-64": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.0.5.tgz", - "integrity": "sha512-t/9XpWYIjOhIHUdwiR47SYBGYHkR1zWLxTkTNKZwCSn8BN0cfjPZ1BR6kcwYGxLGBhtl5GBf6A29nq2K7iwAjg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo/node_modules/turbo-darwin-arm64": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.0.5.tgz", - "integrity": "sha512-//5y4RJvnal8CttOLBwlaBqblcQb1qTlIxLN+I8O3E3rPuvHOupNKB9ZJxYIQ8oWf8ns8Ec8cxQ0GSBLTJIMtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo/node_modules/turbo-linux-arm64": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.0.5.tgz", - "integrity": "sha512-84wdrzntErBNxkHcwHxiTZdaginQAxGPnwLTyZj8lpUYI7okPoxy3jKpUeMHN3adm3iDedl/x0mYSIvVVkmOiA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo/node_modules/turbo-windows-64": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.0.5.tgz", - "integrity": "sha512-SgaFZ0VW6kHCJogLNuLEleAauAJx2Y48wazZGVRmBpgSUS2AylXesaBMhJaEScYqLz7mIRn6KOgwM8D4wTxI9g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo/node_modules/turbo-windows-arm64": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.0.5.tgz", - "integrity": "sha512-foUxLOZoru0IRNIxm53fkfM4ubas9P0nTFjIcHtd+E8YHeogt8GqTweNre2e6ri1EHDo71emmuQgpuoFCOXZMg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.0.11.tgz", + "integrity": "sha512-sYjXP6k94Bqh99R+y3M1Ks6LRIEZybMz+7enA8GKl6JJ2ZFaXxTnS6q+/2+ii1+rRwxohj5OBb4gxODcF8Jd4w==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -21128,7 +20964,7 @@ "@linaria/core": "^5.0.2", "@linaria/react": "^5.0.3", "clsx": "^1.1.1", - "next": "^14.1.0", + "next": "^14.2.5", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", @@ -21157,7 +20993,7 @@ "@linaria/core": "^5.0.2", "@linaria/react": "^5.0.3", "clsx": "^1.1.1", - "next": "^14.1.0", + "next": "^14.2.5", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", @@ -21182,7 +21018,7 @@ "dependencies": { "@headstartwp/core": "^1.4.3", "@headstartwp/next": "^1.4.2", - "next": "14.2.3", + "next": "^14.2.5", "react": "^18", "react-dom": "^18" }, @@ -21196,41 +21032,6 @@ "typescript": "^5" } }, - "projects/wp-multisite-nextjs-app/node_modules/@next/env": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", - "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==" - }, - "projects/wp-multisite-nextjs-app/node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", - "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-multisite-nextjs-app/node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", - "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "projects/wp-multisite-nextjs-app/node_modules/@types/node": { "version": "20.14.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", @@ -21240,55 +21041,6 @@ "undici-types": "~5.26.4" } }, - "projects/wp-multisite-nextjs-app/node_modules/next": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", - "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==", - "dependencies": { - "@next/env": "14.2.3", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.3", - "@next/swc-darwin-x64": "14.2.3", - "@next/swc-linux-arm64-gnu": "14.2.3", - "@next/swc-linux-arm64-musl": "14.2.3", - "@next/swc-linux-x64-gnu": "14.2.3", - "@next/swc-linux-x64-musl": "14.2.3", - "@next/swc-win32-arm64-msvc": "14.2.3", - "@next/swc-win32-ia32-msvc": "14.2.3", - "@next/swc-win32-x64-msvc": "14.2.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, "projects/wp-multisite-nextjs-app/node_modules/typescript": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", @@ -21313,7 +21065,7 @@ "@linaria/core": "^5.0.2", "@linaria/react": "^5.0.3", "clsx": "^1.1.1", - "next": "^14.1.0", + "next": "^14.2.5", "nprogress": "^0.2.0", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -21341,7 +21093,7 @@ "dependencies": { "@headstartwp/core": "^1.4.3", "@headstartwp/next": "^1.4.2", - "next": "14.2.3", + "next": "^14.2.5", "react": "^18", "react-dom": "^18" }, @@ -21355,143 +21107,6 @@ "typescript": "^5" } }, - "projects/wp-nextjs-app/node_modules/@next/env": { - "version": "14.2.3", - "license": "MIT" - }, - "projects/wp-nextjs-app/node_modules/@next/swc-darwin-arm64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", - "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-darwin-x64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", - "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", - "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", - "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.3", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.3", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", - "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", - "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-nextjs-app/node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", - "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "projects/wp-nextjs-app/node_modules/@types/node": { "version": "20.12.12", "dev": true, @@ -21500,54 +21115,6 @@ "undici-types": "~5.26.4" } }, - "projects/wp-nextjs-app/node_modules/next": { - "version": "14.2.3", - "license": "MIT", - "dependencies": { - "@next/env": "14.2.3", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.3", - "@next/swc-darwin-x64": "14.2.3", - "@next/swc-linux-arm64-gnu": "14.2.3", - "@next/swc-linux-arm64-musl": "14.2.3", - "@next/swc-linux-x64-gnu": "14.2.3", - "@next/swc-linux-x64-musl": "14.2.3", - "@next/swc-win32-arm64-msvc": "14.2.3", - "@next/swc-win32-ia32-msvc": "14.2.3", - "@next/swc-win32-x64-msvc": "14.2.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, "projects/wp-nextjs-app/node_modules/typescript": { "version": "5.4.5", "dev": true, @@ -21579,7 +21146,7 @@ "dependencies": { "@headstartwp/core": "^1.4.3", "@headstartwp/next": "^1.4.2", - "next": "14.2.3", + "next": "^14.2.5", "react": "^18", "react-dom": "^18" }, @@ -21593,146 +21160,6 @@ "typescript": "^5" } }, - "projects/wp-polylang-nextjs-app/node_modules/@next/env": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", - "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==" - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-darwin-arm64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", - "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-darwin-x64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", - "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", - "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", - "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", - "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", - "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", - "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", - "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "projects/wp-polylang-nextjs-app/node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", - "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "projects/wp-polylang-nextjs-app/node_modules/@types/node": { "version": "20.14.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", @@ -21742,55 +21169,6 @@ "undici-types": "~5.26.4" } }, - "projects/wp-polylang-nextjs-app/node_modules/next": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", - "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==", - "dependencies": { - "@next/env": "14.2.3", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.3", - "@next/swc-darwin-x64": "14.2.3", - "@next/swc-linux-arm64-gnu": "14.2.3", - "@next/swc-linux-arm64-musl": "14.2.3", - "@next/swc-linux-x64-gnu": "14.2.3", - "@next/swc-linux-x64-musl": "14.2.3", - "@next/swc-win32-arm64-msvc": "14.2.3", - "@next/swc-win32-ia32-msvc": "14.2.3", - "@next/swc-win32-x64-msvc": "14.2.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, "projects/wp-polylang-nextjs-app/node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", diff --git a/package.json b/package.json index c297aab63..f756336bd 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "jest-environment-jsdom": "^29.0.3", "lint-staged": "^11.1.2", "prettier": "3.2.5", - "turbo": "^2.0.3" + "turbo": "^2.0.11" }, "nextBundleAnalysis": { "buildOutputDirectory": "./projects/wp-nextjs/.next", diff --git a/packages/core/package.json b/packages/core/package.json index b0e6127c9..d0b885e15 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -26,6 +26,7 @@ "./react": { "react-server": { "import": "./dist/mjs/rsc/index.js", + "require": "./dist/cjs/rsc/index.js", "types": "./dist/mjs/rsc/index.d.ts" }, "require": "./dist/cjs/react/index.js", diff --git a/packages/core/src/react/components/BaseBlocksRenderer.tsx b/packages/core/src/react/components/BaseBlocksRenderer.tsx index f28e8e7a8..3148f2820 100644 --- a/packages/core/src/react/components/BaseBlocksRenderer.tsx +++ b/packages/core/src/react/components/BaseBlocksRenderer.tsx @@ -11,12 +11,14 @@ import { IDataWPBlock, parseBlockAttributes, ParsedBlock } from '../../dom/parse const { default: parse, domToReact } = HtmlReactParser; +export type BlockContext = { settings?: HeadlessConfig; [key: string]: unknown }; + /** * The interface any children of {@link BlocksRenderer} must implement. */ export interface BlockProps< BlockAttributes extends IDataWPBlock = IDataWPBlock, - Context extends Record = Record, + Context extends BlockContext = BlockContext, > { /** * A test function receives a domNode and returns a boolean value indicating @@ -74,6 +76,10 @@ export interface BlockProps< blockContext?: Context; } +export type BlockFC = React.FC & { + test?: BlockProps['test']; +}; + /** * The common interface for a block transform component */ @@ -125,6 +131,11 @@ export interface BlockRendererProps { */ children?: ReactNode; + /** + * The headless config + */ + settings?: HeadlessConfig; + /** * Whether to forward the block attributes to the children components. */ @@ -241,7 +252,9 @@ export function BaseBlocksRenderer({ } if (typeof blockContext !== 'undefined') { - blockProps.blockContext = { ...blockContext }; + blockProps.blockContext = { ...blockContext, settings }; + } else { + blockProps.blockContext = { settings }; } component = React.createElement( diff --git a/packages/core/src/react/components/BlocksRenderer.tsx b/packages/core/src/react/components/BlocksRenderer.tsx index e8e73fe08..1b53c0645 100644 --- a/packages/core/src/react/components/BlocksRenderer.tsx +++ b/packages/core/src/react/components/BlocksRenderer.tsx @@ -34,11 +34,11 @@ import { BlockRendererProps, BaseBlocksRenderer } from './BaseBlocksRenderer'; * * @category React Components */ -export function BlocksRenderer({ children, ...props }: BlockRendererProps) { +export function BlocksRenderer({ children, settings: propSettings, ...props }: BlockRendererProps) { const settings = useSettings(); return ( - + {children} ); diff --git a/packages/core/src/react/components/__tests__/__snapshots__/BlocksRenderer.tsx.snap b/packages/core/src/react/components/__tests__/__snapshots__/BlocksRenderer.tsx.snap index 548076689..8e4272223 100644 --- a/packages/core/src/react/components/__tests__/__snapshots__/BlocksRenderer.tsx.snap +++ b/packages/core/src/react/components/__tests__/__snapshots__/BlocksRenderer.tsx.snap @@ -17,7 +17,7 @@ exports[`BlocksRenderer forward context to the component 1`] = ` > {"attributes":{"blockAttribute":"this is a block attribute"},"name":"10up/custom-block","className":"my-class"} - - {"contextProp":"this is a context prop"} + {"contextProp":"this is a context prop","settings":{}}

`; diff --git a/packages/next/package.json b/packages/next/package.json index 5f1f24196..4a6ba8cb3 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -27,6 +27,7 @@ }, "./app": { "import": "./dist/mjs/rsc/index.js", + "require": "./dist/cjs/rsc/index.js", "types": "./dist/mjs/rsc/index.d.ts" } }, diff --git a/packages/next/src/middlewares/appMidleware.ts b/packages/next/src/middlewares/appMidleware.ts index df0b0e3d2..d0d12a882 100644 --- a/packages/next/src/middlewares/appMidleware.ts +++ b/packages/next/src/middlewares/appMidleware.ts @@ -1,5 +1,4 @@ -import { NextResponse } from 'next/server'; -import type { NextRequest } from 'next/server'; +import { NextResponse, NextRequest } from 'next/server'; import { fetchRedirect, getHeadstartWPConfig, getSiteByHost } from '@headstartwp/core/utils'; import Negotiator from 'negotiator'; import { match as matchLocale } from '@formatjs/intl-localematcher'; diff --git a/packages/next/src/rsc/actions/preview.ts b/packages/next/src/rsc/actions/preview.ts new file mode 100644 index 000000000..c6e1eaa54 --- /dev/null +++ b/packages/next/src/rsc/actions/preview.ts @@ -0,0 +1,12 @@ +'use server'; + +import { cookies, draftMode, headers } from 'next/headers'; +import { redirect } from 'next/navigation'; +import { COOKIE_NAME } from '../handlers/previewRouteHandler'; + +export async function disableDraftMode() { + const currentUrl = headers().get('x-headstartwp-current-url') ?? '/'; + draftMode().disable(); + cookies().delete(COOKIE_NAME); + redirect(currentUrl); +} diff --git a/packages/next/src/rsc/blocks/LinkBlock.tsx b/packages/next/src/rsc/blocks/LinkBlock.tsx new file mode 100644 index 000000000..2ec3138a5 --- /dev/null +++ b/packages/next/src/rsc/blocks/LinkBlock.tsx @@ -0,0 +1,56 @@ +import Link from 'next/link.js'; +import { removeSourceUrl } from '@headstartwp/core/utils'; +import { BlockFC, BlockProps, IDataWPBlock } from '@headstartwp/core/react'; +import { getAttributes, isAnchorTag } from '@headstartwp/core'; +import React from 'react'; + +interface LinkBlockProps extends BlockProps { + children?: React.ReactNode; +} + +/** + * The Link Block converts a anchor tag node into a next/link component if it's an internal link + * + * #### Usage + * + * ```tsx + * import { BlocksRenderer } from "@headstartwp/core/react"; + * import { LinkBlock } from "@headstartwp/next/app"; + * + * + * + * + * ``` + * + * @param props Link Block Props + * @param props.domNode The domNode element + * @param props.children Children prop + * + * @returns The next/link component + * + * @category React Components + */ +export const LinkBlock: BlockFC = ({ domNode, children, blockContext }) => { + if (typeof blockContext?.settings === 'undefined') { + return children; + } + + const { settings } = blockContext; + + // Links might not always be an actual block since it can be just regular links + const { href, rel, className } = getAttributes(domNode?.attribs ?? {}); + + const link = removeSourceUrl({ + link: href, + backendUrl: settings.sourceUrl || '', + publicUrl: settings.hostUrl ?? '/', + }); + + return ( + + {children} + + ); +}; + +LinkBlock.test = (node, site) => isAnchorTag(node, { isInternalLink: true }, site); diff --git a/packages/next/src/rsc/blocks/__tests__/LinkBlock.tsx b/packages/next/src/rsc/blocks/__tests__/LinkBlock.tsx new file mode 100644 index 000000000..a4b927f54 --- /dev/null +++ b/packages/next/src/rsc/blocks/__tests__/LinkBlock.tsx @@ -0,0 +1,25 @@ +import { render } from '@testing-library/react'; +import React from 'react'; +import { BlocksRenderer } from '@headstartwp/core/react'; +import { getHeadstartWPConfig, setHeadstartWPConfig } from '@headstartwp/core'; +import { LinkBlock } from '../LinkBlock'; + +describe('LinkBlock', () => { + it('shound replace internal links with next/link', () => { + setHeadstartWPConfig({ + sourceUrl: 'http://wpadmin.com', + hostUrl: 'http://domain.com', + }); + + const { container } = render( + + + , + ); + + expect(container).toMatchSnapshot(); + }); +}); diff --git a/packages/next/src/rsc/blocks/__tests__/__snapshots__/LinkBlock.tsx.snap b/packages/next/src/rsc/blocks/__tests__/__snapshots__/LinkBlock.tsx.snap new file mode 100644 index 000000000..e2759896e --- /dev/null +++ b/packages/next/src/rsc/blocks/__tests__/__snapshots__/LinkBlock.tsx.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`LinkBlock shound replace internal links with next/link 1`] = ` + +`; diff --git a/packages/next/src/rsc/components/HeadstartWPApp.tsx b/packages/next/src/rsc/components/HeadstartWPApp.tsx new file mode 100644 index 000000000..ee76f4a04 --- /dev/null +++ b/packages/next/src/rsc/components/HeadstartWPApp.tsx @@ -0,0 +1,33 @@ +import { + SettingsContextProps, + SettingsProvider, + ThemeSettingsProvider, +} from '@headstartwp/core/react'; +import React, { FC, ReactNode } from 'react'; +import { AppEntity } from '@headstartwp/core'; + +type HeadstartWPAppProps = { + /** + * Supported settings by the framework. Such as custom image component, custom link component etc. + * + * @see {@link SettingsContextProps} + */ + settings: SettingsContextProps; + + /** + * Theme settings from the `theme.json`. + * + * Passing this will expose theme json through `useThemeSettings` hook. + */ + themeJSON?: AppEntity['theme.json']; + + children?: ReactNode; +}; + +export const HeadstartWPApp: FC = ({ settings, children, themeJSON = {} }) => { + return ( + + {children} + + ); +}; diff --git a/packages/next/src/rsc/components/Link.tsx b/packages/next/src/rsc/components/Link.tsx new file mode 100644 index 000000000..dc714ecc8 --- /dev/null +++ b/packages/next/src/rsc/components/Link.tsx @@ -0,0 +1,31 @@ +'use client'; + +import { removeSourceUrl } from '@headstartwp/core'; +import { useSettings } from '@headstartwp/core/react'; +import { FC } from 'react'; +import NextLink from 'next/link.js'; + +type LinkProps = React.ComponentProps; + +export const Link: FC = ({ children, href, ...props }) => { + const settings = useSettings(); + + if (typeof settings === 'undefined') { + throw new Error('The Link component must be used within the SettingsProvider'); + } + + const link = + typeof href === 'string' + ? removeSourceUrl({ + link: href, + backendUrl: settings.sourceUrl || '', + publicUrl: settings.hostUrl ?? '/', + }) + : href; + + return ( + + {children} + + ); +}; diff --git a/packages/next/src/rsc/components/PreviewIndicator.tsx b/packages/next/src/rsc/components/PreviewIndicator.tsx index fdb4d5f65..f1bc207e6 100644 --- a/packages/next/src/rsc/components/PreviewIndicator.tsx +++ b/packages/next/src/rsc/components/PreviewIndicator.tsx @@ -1,8 +1,6 @@ -import { cookies, draftMode, headers } from 'next/headers'; +import { draftMode } from 'next/headers'; import React from 'react'; -import { redirect } from 'next/navigation'; - -import { COOKIE_NAME } from '../handlers/previewRouteHandler'; +import { disableDraftMode } from '../actions/preview'; export type PreviewIndicatorProps = { className?: string; @@ -15,15 +13,6 @@ export const PreviewIndicator: React.FC = ({ className }) return null; } - async function disableDraftMode() { - 'use server'; - - const currentUrl = headers().get('x-headstartwp-current-url') ?? '/'; - draftMode().disable(); - cookies().delete(COOKIE_NAME); - redirect(currentUrl); - } - return (
diff --git a/packages/next/src/rsc/components/__tests__/Link.tsx b/packages/next/src/rsc/components/__tests__/Link.tsx new file mode 100644 index 000000000..8e3d7c792 --- /dev/null +++ b/packages/next/src/rsc/components/__tests__/Link.tsx @@ -0,0 +1,21 @@ +import { render } from '@testing-library/react'; +import React from 'react'; +import { SettingsProvider } from '@headstartwp/core/react'; +import { Link } from '../Link'; + +describe('Link', () => { + it('shound replace internal links with next/link', () => { + const { container } = render( + + + , + ); + + expect(container).toMatchSnapshot(); + }); +}); diff --git a/packages/next/src/rsc/components/__tests__/__snapshots__/Link.tsx.snap b/packages/next/src/rsc/components/__tests__/__snapshots__/Link.tsx.snap new file mode 100644 index 000000000..589660b0c --- /dev/null +++ b/packages/next/src/rsc/components/__tests__/__snapshots__/Link.tsx.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Link shound replace internal links with next/link 1`] = ` +
+ +
+`; diff --git a/packages/next/src/rsc/data/queries/queryAppSettings.ts b/packages/next/src/rsc/data/queries/queryAppSettings.ts index 963f64376..bbb982568 100644 --- a/packages/next/src/rsc/data/queries/queryAppSettings.ts +++ b/packages/next/src/rsc/data/queries/queryAppSettings.ts @@ -18,7 +18,7 @@ export async function queryAppSettings< try { const result = await fetchAppSettings(query, config); - return result; + return { ...result, config }; } catch (error) { if (error instanceof Error && handleError) { await handleFetchError(error, config, query.path); diff --git a/packages/next/src/rsc/data/queries/queryAuthorArchive.ts b/packages/next/src/rsc/data/queries/queryAuthorArchive.ts index db3f0d7f0..4c9492d7f 100644 --- a/packages/next/src/rsc/data/queries/queryAuthorArchive.ts +++ b/packages/next/src/rsc/data/queries/queryAuthorArchive.ts @@ -20,6 +20,7 @@ export async function queryAuthorArchive< return { ...result, + config, seo: prepareSEOMetadata(result.data.queriedObject, config), }; } catch (error) { diff --git a/packages/next/src/rsc/data/queries/queryPost.ts b/packages/next/src/rsc/data/queries/queryPost.ts index 3e4c56730..e49d3ecfc 100644 --- a/packages/next/src/rsc/data/queries/queryPost.ts +++ b/packages/next/src/rsc/data/queries/queryPost.ts @@ -43,6 +43,7 @@ export async function queryPost< return { ...result, + config, seo: prepareSEOMetadata(result.data.post, config), }; } catch (error) { diff --git a/packages/next/src/rsc/data/queries/queryPostOrPosts.ts b/packages/next/src/rsc/data/queries/queryPostOrPosts.ts index 6e7cf157d..ce6e23cb4 100644 --- a/packages/next/src/rsc/data/queries/queryPostOrPosts.ts +++ b/packages/next/src/rsc/data/queries/queryPostOrPosts.ts @@ -22,6 +22,7 @@ export async function queryPostOrPosts< return { ...result, + config, seo: prepareSEOMetadata(result.data.queriedObject, config), }; } catch (error) { diff --git a/packages/next/src/rsc/data/queries/queryPosts.ts b/packages/next/src/rsc/data/queries/queryPosts.ts index dae2c45b9..b05df3ccc 100644 --- a/packages/next/src/rsc/data/queries/queryPosts.ts +++ b/packages/next/src/rsc/data/queries/queryPosts.ts @@ -15,6 +15,7 @@ export async function queryPosts< return { ...result, + config, seo: prepareSEOMetadata(result.data.queriedObject, config), }; } catch (error) { diff --git a/packages/next/src/rsc/data/queries/querySearch.ts b/packages/next/src/rsc/data/queries/querySearch.ts index 72f68b1ba..a35c11f0e 100644 --- a/packages/next/src/rsc/data/queries/querySearch.ts +++ b/packages/next/src/rsc/data/queries/querySearch.ts @@ -21,6 +21,7 @@ export async function querySearch< return { ...result, + config, seo: prepareSEOMetadata(result.data.queriedObject, config), }; } catch (error) { diff --git a/packages/next/src/rsc/data/queries/queryTerms.ts b/packages/next/src/rsc/data/queries/queryTerms.ts index 45d8f7b50..c528e6dea 100644 --- a/packages/next/src/rsc/data/queries/queryTerms.ts +++ b/packages/next/src/rsc/data/queries/queryTerms.ts @@ -12,7 +12,7 @@ export async function queryTerms< try { const result = await fetchTerms(query, config); - return result; + return { ...result, config }; } catch (error) { if (error instanceof Error && handleError) { await handleFetchError(error, config, query.path); diff --git a/packages/next/src/rsc/index.ts b/packages/next/src/rsc/index.ts index 1b5b18090..ac4e12427 100644 --- a/packages/next/src/rsc/index.ts +++ b/packages/next/src/rsc/index.ts @@ -9,3 +9,9 @@ export * from './handlers/revalidateRouterHandler'; // components export * from './components/PreviewIndicator'; export * from './components/JSONLD'; +export * from './components/Link'; +export * from './components/HeadstartWPApp'; + +// blocks +export * from './blocks/LinkBlock'; +export * from '../blocks/TwitterBlock'; diff --git a/projects/wp-multisite-i18n-nextjs/package.json b/projects/wp-multisite-i18n-nextjs/package.json index e9964ad99..e6694c3b3 100644 --- a/projects/wp-multisite-i18n-nextjs/package.json +++ b/projects/wp-multisite-i18n-nextjs/package.json @@ -19,7 +19,7 @@ "@linaria/core": "^5.0.2", "@linaria/react": "^5.0.3", "clsx": "^1.1.1", - "next": "^14.1.0", + "next": "^14.2.5", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", diff --git a/projects/wp-multisite-nextjs-app/package.json b/projects/wp-multisite-nextjs-app/package.json index 9300c806b..6ff01d41e 100644 --- a/projects/wp-multisite-nextjs-app/package.json +++ b/projects/wp-multisite-nextjs-app/package.json @@ -11,7 +11,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "14.2.3", + "next": "^14.2.5", "@headstartwp/core": "^1.4.3", "@headstartwp/next": "^1.4.2" }, diff --git a/projects/wp-multisite-nextjs-app/src/app/[site]/layout.tsx b/projects/wp-multisite-nextjs-app/src/app/[site]/layout.tsx index 20ab08c6b..ce6b985e4 100644 --- a/projects/wp-multisite-nextjs-app/src/app/[site]/layout.tsx +++ b/projects/wp-multisite-nextjs-app/src/app/[site]/layout.tsx @@ -1,15 +1,12 @@ import { HeadstartWPLayout, PreviewIndicator, queryAppSettings } from '@headstartwp/next/app'; import { Menu, SettingsProvider, ThemeSettingsProvider } from '@headstartwp/core/react'; -import { getHeadstartWPConfig } from '@headstartwp/core'; const RootLayout = async ({ children, params }: Readonly) => { - console.log('SITE ROOT LAYOUT'); - - const { menu, data } = await queryAppSettings({ menu: 'primary', routeParams: params }); + const { menu, data, config } = await queryAppSettings({ menu: 'primary', routeParams: params }); return ( - + {menu ? : null} {children} diff --git a/projects/wp-multisite-nextjs-app/src/app/api/preview/route.ts b/projects/wp-multisite-nextjs-app/src/app/api/preview/route.ts index 9ec544fff..cdf657430 100644 --- a/projects/wp-multisite-nextjs-app/src/app/api/preview/route.ts +++ b/projects/wp-multisite-nextjs-app/src/app/api/preview/route.ts @@ -4,6 +4,5 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { - // @ts-expect-error return previewRouteHandler(request); } diff --git a/projects/wp-multisite-nextjs-app/src/app/api/revalidate/route.ts b/projects/wp-multisite-nextjs-app/src/app/api/revalidate/route.ts index 324e9b272..37556984d 100644 --- a/projects/wp-multisite-nextjs-app/src/app/api/revalidate/route.ts +++ b/projects/wp-multisite-nextjs-app/src/app/api/revalidate/route.ts @@ -4,6 +4,5 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { - // @ts-expect-error return revalidateRouteHandler(request); } diff --git a/projects/wp-multisite-nextjs-app/src/middleware.ts b/projects/wp-multisite-nextjs-app/src/middleware.ts index f73062bbd..1fb773757 100644 --- a/projects/wp-multisite-nextjs-app/src/middleware.ts +++ b/projects/wp-multisite-nextjs-app/src/middleware.ts @@ -15,6 +15,5 @@ export const config = { }; export async function middleware(req: NextRequest) { - // @ts-expect-error return AppMiddleware(req, { appRouter: true }); } diff --git a/projects/wp-multisite-nextjs/package.json b/projects/wp-multisite-nextjs/package.json index bda988843..580864dc3 100644 --- a/projects/wp-multisite-nextjs/package.json +++ b/projects/wp-multisite-nextjs/package.json @@ -19,7 +19,7 @@ "@linaria/core": "^5.0.2", "@linaria/react": "^5.0.3", "clsx": "^1.1.1", - "next": "^14.1.0", + "next": "^14.2.5", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", diff --git a/projects/wp-nextjs-app/next.config.js b/projects/wp-nextjs-app/next.config.js index 3aea7dbd8..191842431 100644 --- a/projects/wp-nextjs-app/next.config.js +++ b/projects/wp-nextjs-app/next.config.js @@ -2,15 +2,6 @@ const { withHeadstartWPConfig } = require('@headstartwp/next/config'); /** @type {import('next').NextConfig} */ const nextConfig = { - webpack: (config) => { - // TODO: figure out why this is needed - config.resolve = { - ...config.resolve, - conditionNames: ['import'], - }; - - return config; - }, logging: { fetches: { fullUrl: true, diff --git a/projects/wp-nextjs-app/package.json b/projects/wp-nextjs-app/package.json index d3d8ca1c8..5a0d6806b 100644 --- a/projects/wp-nextjs-app/package.json +++ b/projects/wp-nextjs-app/package.json @@ -11,7 +11,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "14.2.3", + "next": "^14.2.5", "@headstartwp/core": "^1.4.3", "@headstartwp/next": "^1.4.2" }, diff --git a/projects/wp-nextjs-app/src/app/(single)/[...path]/page.tsx b/projects/wp-nextjs-app/src/app/(single)/[...path]/page.tsx index da37bc487..23b1c92df 100644 --- a/projects/wp-nextjs-app/src/app/(single)/[...path]/page.tsx +++ b/projects/wp-nextjs-app/src/app/(single)/[...path]/page.tsx @@ -8,8 +8,14 @@ import { } from '@headstartwp/next/app'; import { Metadata } from 'next'; import { removeSourceUrl } from '@headstartwp/core'; +import dynamic from 'next/dynamic'; +import { FC, Suspense } from 'react'; import Blocks from '../../../components/Blocks'; +const ClientRelatedPosts = dynamic(() => + import('../../../components/RelatedPosts').then((mod) => mod.RelatedPosts), +); + export async function generateStaticParams({ params }: HeadstartWPRoute) { // loads the right config based on route params (this is needed over getHeadstartWP for sites using polylang integration or multisite) const { sourceUrl = '', hostUrl = '/' } = loadHeadstartWPConfig(params); @@ -47,8 +53,28 @@ export async function generateMetadata({ params }: HeadstartWPRoute): Promise = async ({ + post_id, + category, +}) => { + const { data } = await queryPosts({ + params: { postType: 'post', per_page: 3, category, exclude: [post_id] }, + }); + + return ( +
+

Related Posts (Streamed from Server)

+
    + {data.posts.map((post) => ( +
  • {post.title.rendered}
  • + ))} +
+
+ ); +}; + const Single = async ({ params }: HeadstartWPRoute) => { - const { data, seo } = await query({ params }); + const { data, seo, config } = await query({ params }); return (
@@ -56,9 +82,24 @@ const Single = async ({ params }: HeadstartWPRoute) => { - + {seo.schema && } + + {data.post.terms.category && ( + <> + + + + + + )}
); }; diff --git a/projects/wp-nextjs-app/src/app/api/preview/route.ts b/projects/wp-nextjs-app/src/app/api/preview/route.ts index 9ec544fff..cdf657430 100644 --- a/projects/wp-nextjs-app/src/app/api/preview/route.ts +++ b/projects/wp-nextjs-app/src/app/api/preview/route.ts @@ -4,6 +4,5 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { - // @ts-expect-error return previewRouteHandler(request); } diff --git a/projects/wp-nextjs-app/src/app/api/revalidate/route.ts b/projects/wp-nextjs-app/src/app/api/revalidate/route.ts index 324e9b272..37556984d 100644 --- a/projects/wp-nextjs-app/src/app/api/revalidate/route.ts +++ b/projects/wp-nextjs-app/src/app/api/revalidate/route.ts @@ -4,6 +4,5 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { - // @ts-expect-error return revalidateRouteHandler(request); } diff --git a/projects/wp-nextjs-app/src/app/layout.tsx b/projects/wp-nextjs-app/src/app/layout.tsx index 4455de74b..a1af618ff 100644 --- a/projects/wp-nextjs-app/src/app/layout.tsx +++ b/projects/wp-nextjs-app/src/app/layout.tsx @@ -1,8 +1,7 @@ import { Inter } from 'next/font/google'; import './globals.css'; -import { PreviewIndicator, queryAppSettings } from '@headstartwp/next/app'; -import { Menu, SettingsProvider, ThemeSettingsProvider } from '@headstartwp/core/react'; -import { getHeadstartWPConfig } from '@headstartwp/core'; +import { Link, PreviewIndicator, queryAppSettings, HeadstartWPApp } from '@headstartwp/next/app'; +import { Menu, SettingsContextProps } from '@headstartwp/core/react'; const inter = Inter({ subsets: ['latin'] }); @@ -11,18 +10,22 @@ const RootLayout = async ({ }: Readonly<{ children: React.ReactNode; }>) => { - const { menu, data } = await queryAppSettings({ menu: 'primary' }); + const { menu, data, config } = await queryAppSettings({ menu: 'primary' }); + + const settings: SettingsContextProps = { + ...config, + // @ts-expect-error + linkComponent: Link, + }; return ( - - - {menu ? : null} - {children} - - - + + {menu ? : null} + {children} + + ); diff --git a/projects/wp-nextjs-app/src/app/middleware.ts b/projects/wp-nextjs-app/src/app/middleware.ts deleted file mode 100644 index f73062bbd..000000000 --- a/projects/wp-nextjs-app/src/app/middleware.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AppMiddleware } from '@headstartwp/next/middlewares'; -import { NextRequest } from 'next/server'; - -export const config = { - matcher: [ - /* - * Match all paths except for: - * 1. /api routes - * 2. /_next (Next.js internals) - * 3. /fonts (inside /public) - * 4. all root files inside /public (e.g. /favicon.ico) - */ - '/((?!api|cache-healthcheck|_next|fonts[\\w-]+\\.\\w+).*)', - ], -}; - -export async function middleware(req: NextRequest) { - // @ts-expect-error - return AppMiddleware(req, { appRouter: true }); -} diff --git a/projects/wp-nextjs-app/src/app/page.tsx b/projects/wp-nextjs-app/src/app/page.tsx index d34cb379f..944904679 100644 --- a/projects/wp-nextjs-app/src/app/page.tsx +++ b/projects/wp-nextjs-app/src/app/page.tsx @@ -1,6 +1,6 @@ -import { BlocksRenderer } from '@headstartwp/core/react'; import { HeadstartWPRoute, JSONLD, queryPost } from '@headstartwp/next/app'; import { Metadata } from 'next'; +import Blocks from '../components/Blocks'; async function query({ params }: HeadstartWPRoute) { return queryPost({ @@ -9,9 +9,6 @@ async function query({ params }: HeadstartWPRoute) { slug: 'sample-page', postType: 'page', }, - options: { - cache: 'force-cache', - }, }); } @@ -22,12 +19,12 @@ export async function generateMetadata({ params }: HeadstartWPRoute): Promise { - const { data, seo } = await query({ params }); + const { data, seo, config } = await query({ params }); return (
- +
{seo?.schema && } diff --git a/projects/wp-nextjs-app/src/components/Blocks.tsx b/projects/wp-nextjs-app/src/components/Blocks.tsx index 8c6d23424..1c086e9ca 100644 --- a/projects/wp-nextjs-app/src/components/Blocks.tsx +++ b/projects/wp-nextjs-app/src/components/Blocks.tsx @@ -1,16 +1,23 @@ import { BlocksRenderer } from '@headstartwp/core/react'; import React from 'react'; -import { isBlockByName } from '@headstartwp/core'; +import { HeadlessConfig, isBlockByName } from '@headstartwp/core'; +import { LinkBlock, TwitterBlock } from '@headstartwp/next/app'; import { PostList } from './Blocks/PostList'; type BlockProps = { html: string; + settings: HeadlessConfig; }; -const Blocks: React.FC = ({ html }) => { +const Blocks: React.FC = ({ html, settings }) => { + // we need to pass settings as a prop since there's no context in server components + // and BlocksRenderer needs the settings for the LinkBlock + // the settings is automatically passed to the children components via blockContext return ( - + isBlockByName(node, 'core/query')} /> + + ); }; diff --git a/projects/wp-nextjs-app/src/components/RelatedPosts.tsx b/projects/wp-nextjs-app/src/components/RelatedPosts.tsx new file mode 100644 index 000000000..82b7488e5 --- /dev/null +++ b/projects/wp-nextjs-app/src/components/RelatedPosts.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { useFetchPosts } from '@headstartwp/core/react'; +import React from 'react'; + +type Props = { + category: string; + post_id: number; +}; + +export const RelatedPosts: React.FC = ({ category, post_id }) => { + const { data, loading } = useFetchPosts({ per_page: 3, category, exclude: [post_id] }); + + if (loading) { + return
Loading...
; + } + + return ( +
+

Related Posts (Loaded Client-side)

+
    + {data.posts.map((post) => ( +
  • {post.title.rendered}
  • + ))} +
+
+ ); +}; diff --git a/projects/wp-nextjs-app/src/middleware.ts b/projects/wp-nextjs-app/src/middleware.ts index f73062bbd..1fb773757 100644 --- a/projects/wp-nextjs-app/src/middleware.ts +++ b/projects/wp-nextjs-app/src/middleware.ts @@ -15,6 +15,5 @@ export const config = { }; export async function middleware(req: NextRequest) { - // @ts-expect-error return AppMiddleware(req, { appRouter: true }); } diff --git a/projects/wp-nextjs/package.json b/projects/wp-nextjs/package.json index 466d88b7b..b3a6b24e3 100644 --- a/projects/wp-nextjs/package.json +++ b/projects/wp-nextjs/package.json @@ -21,7 +21,7 @@ "@linaria/core": "^5.0.2", "@linaria/react": "^5.0.3", "clsx": "^1.1.1", - "next": "^14.1.0", + "next": "^14.2.5", "nprogress": "^0.2.0", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/projects/wp-polylang-nextjs-app/package.json b/projects/wp-polylang-nextjs-app/package.json index 9e01db510..52395b20d 100644 --- a/projects/wp-polylang-nextjs-app/package.json +++ b/projects/wp-polylang-nextjs-app/package.json @@ -11,7 +11,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "14.2.3", + "next": "^14.2.5", "@headstartwp/core": "^1.4.3", "@headstartwp/next": "^1.4.2" }, diff --git a/projects/wp-polylang-nextjs-app/src/app/[lang]/(single)/[...path]/page.tsx b/projects/wp-polylang-nextjs-app/src/app/[lang]/(single)/[...path]/page.tsx index 27f40aa02..faff8fba6 100644 --- a/projects/wp-polylang-nextjs-app/src/app/[lang]/(single)/[...path]/page.tsx +++ b/projects/wp-polylang-nextjs-app/src/app/[lang]/(single)/[...path]/page.tsx @@ -1,11 +1,12 @@ import { removeSourceUrl } from '@headstartwp/core'; -import { BlocksRenderer, HtmlDecoder } from '@headstartwp/core/react'; +import { HtmlDecoder } from '@headstartwp/core/react'; import { HeadstartWPRoute, loadHeadstartWPConfig, queryPost, queryPosts, } from '@headstartwp/next/app'; +import Blocks from '../../../../components/Blocks'; export async function generateStaticParams({ params }: HeadstartWPRoute) { // loads the right config based on route params (this is needed over getHeadstartWPConfig() for sites using multisite) @@ -32,7 +33,7 @@ export async function generateStaticParams({ params }: HeadstartWPRoute) { } const Single = async ({ params }: HeadstartWPRoute) => { - const { data } = await queryPost({ + const { data, config } = await queryPost({ routeParams: params, params: { postType: ['post', 'page'], @@ -45,7 +46,7 @@ const Single = async ({ params }: HeadstartWPRoute) => { - + ); }; diff --git a/projects/wp-polylang-nextjs-app/src/app/[lang]/layout.tsx b/projects/wp-polylang-nextjs-app/src/app/[lang]/layout.tsx index b31edd097..9a4c1b9de 100644 --- a/projects/wp-polylang-nextjs-app/src/app/[lang]/layout.tsx +++ b/projects/wp-polylang-nextjs-app/src/app/[lang]/layout.tsx @@ -1,6 +1,5 @@ import { HeadstartWPLayout, PreviewIndicator, queryAppSettings } from '@headstartwp/next/app'; import { Menu, SettingsProvider, ThemeSettingsProvider } from '@headstartwp/core/react'; -import { getHeadstartWPConfig } from '@headstartwp/core'; export async function generateStaticParams() { // pre-render en and es posts @@ -8,11 +7,11 @@ export async function generateStaticParams() { } const RootLayout = async ({ children, params }: Readonly) => { - const { menu, data } = await queryAppSettings({ menu: 'primary', routeParams: params }); + const { menu, data, config } = await queryAppSettings({ menu: 'primary', routeParams: params }); return ( - + {menu ? : null} {children} diff --git a/projects/wp-polylang-nextjs-app/src/app/api/preview/route.ts b/projects/wp-polylang-nextjs-app/src/app/api/preview/route.ts index 9ec544fff..cdf657430 100644 --- a/projects/wp-polylang-nextjs-app/src/app/api/preview/route.ts +++ b/projects/wp-polylang-nextjs-app/src/app/api/preview/route.ts @@ -4,6 +4,5 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { - // @ts-expect-error return previewRouteHandler(request); } diff --git a/projects/wp-polylang-nextjs-app/src/app/api/revalidate/route.ts b/projects/wp-polylang-nextjs-app/src/app/api/revalidate/route.ts index 324e9b272..37556984d 100644 --- a/projects/wp-polylang-nextjs-app/src/app/api/revalidate/route.ts +++ b/projects/wp-polylang-nextjs-app/src/app/api/revalidate/route.ts @@ -4,6 +4,5 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { - // @ts-expect-error return revalidateRouteHandler(request); } diff --git a/projects/wp-polylang-nextjs-app/src/components/Blocks.tsx b/projects/wp-polylang-nextjs-app/src/components/Blocks.tsx new file mode 100644 index 000000000..ef6bb660a --- /dev/null +++ b/projects/wp-polylang-nextjs-app/src/components/Blocks.tsx @@ -0,0 +1,22 @@ +import { BlocksRenderer } from '@headstartwp/core/react'; +import React from 'react'; +import { HeadlessConfig } from '@headstartwp/core'; +import { LinkBlock } from '@headstartwp/next/app'; + +type BlockProps = { + html: string; + settings: HeadlessConfig; +}; + +const Blocks: React.FC = ({ html, settings }) => { + // we need to pass settings as a prop since there's no context in server components + // and BlocksRenderer needs the settings for the LinkBlock + // the settings is automatically passed to the children components via blockContext + return ( + + + + ); +}; + +export default Blocks; diff --git a/projects/wp-polylang-nextjs-app/src/middleware.ts b/projects/wp-polylang-nextjs-app/src/middleware.ts index f73062bbd..1fb773757 100644 --- a/projects/wp-polylang-nextjs-app/src/middleware.ts +++ b/projects/wp-polylang-nextjs-app/src/middleware.ts @@ -15,6 +15,5 @@ export const config = { }; export async function middleware(req: NextRequest) { - // @ts-expect-error return AppMiddleware(req, { appRouter: true }); } diff --git a/turbo.json b/turbo.json index ba6da7486..664fba695 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,6 @@ { "$schema": "https://turborepo.org/schema.json", + "ui": "tui", "tasks": { "build": { "dependsOn": [