diff --git a/deno.lock b/deno.lock index c4ba8ca1be8..229234090ac 100644 --- a/deno.lock +++ b/deno.lock @@ -5,13 +5,19 @@ "jsr:@deno-library/progress@^1.5.1": "1.5.1", "jsr:@deno/cache-dir@0.14": "0.14.0", "jsr:@deno/doc@0.172": "0.172.0", + "jsr:@deno/graph@0.86": "0.86.9", + "jsr:@deno/graph@~0.82.3": "0.82.3", "jsr:@deno/otel@*": "0.0.2", "jsr:@fresh/core@^2.0.0-alpha.26": "2.0.0-alpha.29", + "jsr:@fresh/core@^2.0.0-alpha.29": "2.0.0-alpha.29", + "jsr:@fresh/plugin-tailwind@0.0.1-alpha.7": "0.0.1-alpha.7", "jsr:@luca/esbuild-deno-loader@0.11": "0.11.1", "jsr:@marvinh-test/fresh-island@*": "0.0.1", "jsr:@marvinh-test/fresh-island@^0.0.1": "0.0.1", + "jsr:@std/assert@0.221": "0.221.0", "jsr:@std/assert@^1.0.12": "1.0.13", "jsr:@std/async@1": "1.0.12", + "jsr:@std/async@^1.0.12": "1.0.12", "jsr:@std/bytes@^1.0.2": "1.0.5", "jsr:@std/bytes@^1.0.5": "1.0.5", "jsr:@std/cli@1": "1.0.17", @@ -19,6 +25,7 @@ "jsr:@std/collections@^1.0.11": "1.0.11", "jsr:@std/crypto@1": "1.0.4", "jsr:@std/data-structures@^1.0.6": "1.0.7", + "jsr:@std/datetime@0.225.0": "0.225.0", "jsr:@std/datetime@~0.225.2": "0.225.4", "jsr:@std/encoding@1": "1.0.10", "jsr:@std/encoding@^1.0.10": "1.0.10", @@ -43,6 +50,7 @@ "jsr:@std/media-types@1": "1.1.0", "jsr:@std/media-types@^1.1.0": "1.1.0", "jsr:@std/net@^1.0.4": "1.0.4", + "jsr:@std/path@0.221": "0.221.0", "jsr:@std/path@1": "1.0.9", "jsr:@std/path@^1.0.6": "1.0.9", "jsr:@std/path@^1.0.8": "1.0.9", @@ -59,6 +67,7 @@ "npm:@opentelemetry/sdk-trace-base@1": "1.30.1_@opentelemetry+api@1.9.0", "npm:@preact/signals@^1.2.3": "1.3.2_preact@10.26.5", "npm:@preact/signals@^1.3.0": "1.3.2_preact@10.26.5", + "npm:@tailwindcss/postcss@^4.0.8": "4.0.8", "npm:@types/node@*": "22.12.0", "npm:autoprefixer@10.4.17": "10.4.17_postcss@8.4.35", "npm:cssnano@6.0.3": "6.0.3_postcss@8.4.35", @@ -82,7 +91,7 @@ "integrity": "dc4b7e0ea5d8186fcd9e33e2c54e62913d7eb99d5a2d4f987b1c5399d8e295de", "dependencies": [ "jsr:@deno-library/progress", - "jsr:@std/async", + "jsr:@std/async@1", "jsr:@std/fs@1", "jsr:@std/path@1", "jsr:@zip-js/zip-js" @@ -98,6 +107,7 @@ "@deno/cache-dir@0.14.0": { "integrity": "729f0b68e7fc96443c09c2c544b830ca70897bdd5168598446d752f7a4c731ad", "dependencies": [ + "jsr:@deno/graph@0.86", "jsr:@std/fmt@^1.0.3", "jsr:@std/fs@^1.0.6", "jsr:@std/io@0.225", @@ -107,9 +117,16 @@ "@deno/doc@0.172.0": { "integrity": "72a68ed533576a06feb930a84784ad9ba6d83ca9d581fc734d498c58e32b7cf5", "dependencies": [ - "jsr:@deno/cache-dir" + "jsr:@deno/cache-dir", + "jsr:@deno/graph@~0.82.3" ] }, + "@deno/graph@0.82.3": { + "integrity": "5c1fe944368172a9c87588ac81b82eb027ca78002a57521567e6264be322637e" + }, + "@deno/graph@0.86.9": { + "integrity": "c4f353a695bcc5246c099602977dabc6534eacea9999a35a8cb24e807192e6a1" + }, "@deno/otel@0.0.2": { "integrity": "4ef61b7eb1c4063f8224d66fc43f25e428a566d2e18785d0dc67bb70a318f0ff", "dependencies": [ @@ -122,7 +139,7 @@ "dependencies": [ "jsr:@luca/esbuild-deno-loader", "jsr:@std/crypto", - "jsr:@std/datetime", + "jsr:@std/datetime@~0.225.2", "jsr:@std/encoding@1", "jsr:@std/fmt@1", "jsr:@std/fs@1", @@ -132,12 +149,23 @@ "jsr:@std/path@1", "jsr:@std/semver", "npm:@opentelemetry/api@^1.9.0", + "npm:@preact/signals@^1.2.3", "npm:esbuild", "npm:esbuild-wasm", "npm:preact-render-to-string", "npm:preact@^10.25.1" ] }, + "@fresh/plugin-tailwind@0.0.1-alpha.7": { + "integrity": "b940991bdb76f0995dc58b25183f1001d72c4020e049d384ad3fb751556aa2a9", + "dependencies": [ + "jsr:@std/path@0.221", + "npm:autoprefixer", + "npm:cssnano", + "npm:postcss", + "npm:tailwindcss" + ] + }, "@luca/esbuild-deno-loader@0.11.1": { "integrity": "dc020d16d75b591f679f6b9288b10f38bdb4f24345edb2f5732affa1d9885267", "dependencies": [ @@ -154,6 +182,9 @@ "npm:preact@^10.25.1" ] }, + "@std/assert@0.221.0": { + "integrity": "a5f1aa6e7909dbea271754fd4ab3f4e687aeff4873b4cef9a320af813adb489a" + }, "@std/assert@1.0.13": { "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29", "dependencies": [ @@ -178,6 +209,9 @@ "@std/data-structures@1.0.7": { "integrity": "16932d2c8d281f65eaaa2209af2473209881e33b1ced54cd1b015e7b4cdbb0d2" }, + "@std/datetime@0.225.0": { + "integrity": "73ee4457218e06f50d3680fb0c430ba94006305e4104c84e783b3f5c0ec78900" + }, "@std/datetime@0.225.4": { "integrity": "682bc21738b941a4ed1465be6da01704e8010a3a6d9b615de9458202b84e00ec" }, @@ -187,7 +221,7 @@ "@std/expect@1.0.15": { "integrity": "eca360007b5a7f13dbfa1294224baee7fb98dcd460d8461fe64eeae302902945", "dependencies": [ - "jsr:@std/assert", + "jsr:@std/assert@^1.0.12", "jsr:@std/internal" ] }, @@ -250,6 +284,12 @@ "@std/net@1.0.4": { "integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852" }, + "@std/path@0.221.0": { + "integrity": "0a36f6b17314ef653a3a1649740cc8db51b25a133ecfe838f20b79a56ebe0095", + "dependencies": [ + "jsr:@std/assert@0.221" + ] + }, "@std/path@1.0.9": { "integrity": "260a49f11edd3db93dd38350bf9cd1b4d1366afa98e81b86167b4e3dd750129e" }, @@ -265,7 +305,8 @@ "@std/testing@1.0.11": { "integrity": "12b3db12d34f0f385a26248933bde766c0f8c5ad8b6ab34d4d38f528ab852f48", "dependencies": [ - "jsr:@std/assert", + "jsr:@std/assert@^1.0.12", + "jsr:@std/async@^1.0.12", "jsr:@std/data-structures", "jsr:@std/fs@^1.0.16", "jsr:@std/internal", @@ -504,6 +545,96 @@ "preact" ] }, + "@tailwindcss/node@4.0.8": { + "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==", + "dependencies": [ + "enhanced-resolve", + "jiti@2.4.2", + "tailwindcss@4.0.8" + ] + }, + "@tailwindcss/oxide-android-arm64@4.0.8": { + "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-darwin-arm64@4.0.8": { + "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-darwin-x64@4.0.8": { + "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-freebsd-x64@4.0.8": { + "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8": { + "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@tailwindcss/oxide-linux-arm64-gnu@4.0.8": { + "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-linux-arm64-musl@4.0.8": { + "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-linux-x64-gnu@4.0.8": { + "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-linux-x64-musl@4.0.8": { + "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-win32-arm64-msvc@4.0.8": { + "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-win32-x64-msvc@4.0.8": { + "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide@4.0.8": { + "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==", + "optionalDependencies": [ + "@tailwindcss/oxide-android-arm64", + "@tailwindcss/oxide-darwin-arm64", + "@tailwindcss/oxide-darwin-x64", + "@tailwindcss/oxide-freebsd-x64", + "@tailwindcss/oxide-linux-arm-gnueabihf", + "@tailwindcss/oxide-linux-arm64-gnu", + "@tailwindcss/oxide-linux-arm64-musl", + "@tailwindcss/oxide-linux-x64-gnu", + "@tailwindcss/oxide-linux-x64-musl", + "@tailwindcss/oxide-win32-arm64-msvc", + "@tailwindcss/oxide-win32-x64-msvc" + ] + }, + "@tailwindcss/postcss@4.0.8": { + "integrity": "sha512-SUwlrXjn1ycmUbA0o0n3Y0LqlXqxN5R8HR+ti+OBbRS79wl2seDmiypEs3xJCuQXe07ol81s1AmRMitBmPveJA==", + "dependencies": [ + "@alloc/quick-lru", + "@tailwindcss/node", + "@tailwindcss/oxide", + "lightningcss", + "postcss@8.5.3", + "tailwindcss@4.0.8" + ] + }, "@trysound/sax@0.2.0": { "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, @@ -749,6 +880,10 @@ "cssom@0.5.0": { "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" }, + "detect-libc@1.0.3": { + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": true + }, "didyoumean@1.2.2": { "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, @@ -792,6 +927,13 @@ "emoji-regex@9.2.2": { "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "enhanced-resolve@5.18.1": { + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dependencies": [ + "graceful-fs", + "tapable" + ] + }, "entities@4.5.0": { "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, @@ -900,6 +1042,9 @@ ], "bin": true }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "hasown@2.0.2": { "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": [ @@ -961,6 +1106,78 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "bin": true }, + "jiti@2.4.2": { + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "bin": true + }, + "lightningcss-darwin-arm64@1.29.1": { + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "lightningcss-darwin-x64@1.29.1": { + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "lightningcss-freebsd-x64@1.29.1": { + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "lightningcss-linux-arm-gnueabihf@1.29.1": { + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", + "os": ["linux"], + "cpu": ["arm"] + }, + "lightningcss-linux-arm64-gnu@1.29.1": { + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "lightningcss-linux-arm64-musl@1.29.1": { + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "lightningcss-linux-x64-gnu@1.29.1": { + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", + "os": ["linux"], + "cpu": ["x64"] + }, + "lightningcss-linux-x64-musl@1.29.1": { + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", + "os": ["linux"], + "cpu": ["x64"] + }, + "lightningcss-win32-arm64-msvc@1.29.1": { + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "lightningcss-win32-x64-msvc@1.29.1": { + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", + "os": ["win32"], + "cpu": ["x64"] + }, + "lightningcss@1.29.1": { + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "dependencies": [ + "detect-libc" + ], + "optionalDependencies": [ + "lightningcss-darwin-arm64", + "lightningcss-darwin-x64", + "lightningcss-freebsd-x64", + "lightningcss-linux-arm-gnueabihf", + "lightningcss-linux-arm64-gnu", + "lightningcss-linux-arm64-musl", + "lightningcss-linux-x64-gnu", + "lightningcss-linux-x64-musl", + "lightningcss-win32-arm64-msvc", + "lightningcss-win32-x64-msvc" + ] + }, "lilconfig@3.1.3": { "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" }, @@ -1486,7 +1703,7 @@ "fast-glob", "glob-parent@6.0.2", "is-glob", - "jiti", + "jiti@1.21.7", "lilconfig", "micromatch", "normalize-path", @@ -1503,6 +1720,12 @@ ], "bin": true }, + "tailwindcss@4.0.8": { + "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==" + }, + "tapable@2.2.1": { + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, "thenify-all@1.6.0": { "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dependencies": [ @@ -1660,12 +1883,9 @@ }, "plugin-tailwindcss": { "dependencies": [ - "jsr:@fresh/core@^2.0.0-alpha.22", - "jsr:@std/path@1", - "npm:autoprefixer@10.4.17", - "npm:cssnano@6.0.3", - "npm:postcss@8.4.35", - "npm:tailwindcss@^3.4.1" + "jsr:@fresh/core@^2.0.0-alpha.29", + "npm:@tailwindcss/postcss@^4.0.8", + "npm:postcss@8.4.35" ] }, "update": { @@ -1680,6 +1900,7 @@ }, "www": { "dependencies": [ + "jsr:@fresh/plugin-tailwind@0.0.1-alpha.7", "jsr:@luca/esbuild-deno-loader@0.11", "jsr:@std/crypto@1", "jsr:@std/datetime@0.225.0", diff --git a/init/src/init.ts b/init/src/init.ts index 04640b73960..912d5261189 100644 --- a/init/src/init.ts +++ b/init/src/init.ts @@ -3,7 +3,7 @@ import * as path from "@std/path"; // Keep these as is, as we replace these version in our release script const FRESH_VERSION = "2.0.0-alpha.29"; -const FRESH_TAILWIND_VERSION = "0.0.1-alpha.7"; +const FRESH_TAILWIND_VERSION = "0.0.1-alpha.8"; const PREACT_VERSION = "10.25.4"; const PREACT_SIGNALS_VERSION = "2.0.1"; @@ -542,7 +542,7 @@ import { Builder } from "fresh/dev"; import { app } from "./main.ts"; const builder = new Builder(); -${useTailwind ? "tailwind(builder, app, {});" : ""} +${useTailwind ? "tailwind(builder, app);" : ""} if (Deno.args.includes("build")) { await builder.build(app); } else { @@ -589,7 +589,7 @@ if (Deno.args.includes("build")) { }; if (useTailwind) { - denoJson.imports["tailwindcss"] = "npm:tailwindcss@^3.4.3"; + denoJson.imports["tailwindcss"] = "npm:tailwindcss@^4"; } await writeFile("deno.json", denoJson); diff --git a/init/src/init_test.ts b/init/src/init_test.ts index f8a6a9967fa..0c57c570a54 100644 --- a/init/src/init_test.ts +++ b/init/src/init_test.ts @@ -160,6 +160,7 @@ Deno.test("init with tailwind - fmt, lint, and type check project", async () => stderr: "inherit", stdout: "inherit", }).output(); + expect(check.code).toEqual(0); }); }); diff --git a/plugin-tailwindcss/README.md b/plugin-tailwindcss/README.md index 5fd0d8ff21e..d3d99205a7b 100644 --- a/plugin-tailwindcss/README.md +++ b/plugin-tailwindcss/README.md @@ -2,26 +2,23 @@ A Tailwind CSS plugin to use in Fresh. +> **Note:** This plugin **only** supports Tailwind CSS v4 + ```ts // dev.ts -import { tailwind } from "@fresh/plugin-tailwind"; -import { FreshDevApp } from "fresh/dev"; +import { Builder } from "fresh/dev"; import { app } from "./main.ts"; +import { tailwind } from "@fresh/plugin-tailwind"; -const devApp = new FreshDevApp(); - +const builder = new Builder({ target: "safari12" }); // Enable Tailwind CSS -tailwind(devApp); - -devApp.mountApp("/", app); +tailwind(builder, app); if (Deno.args.includes("build")) { - await devApp.build({ - target: "safari12", - }); + await builder.build(app); } else { - await devApp.listen(); + await builder.listen(app); } ``` diff --git a/plugin-tailwindcss/deno.json b/plugin-tailwindcss/deno.json index 0f48324724d..21396621fd0 100644 --- a/plugin-tailwindcss/deno.json +++ b/plugin-tailwindcss/deno.json @@ -1,16 +1,13 @@ { "name": "@fresh/plugin-tailwind", - "version": "0.0.1-alpha.7", + "version": "0.0.1-alpha.8", "license": "MIT", "exports": { ".": "./src/mod.ts" }, "imports": { - "fresh": "jsr:@fresh/core@^2.0.0-alpha.22", - "@std/path": "jsr:@std/path@1", - "autoprefixer": "npm:autoprefixer@10.4.17", - "cssnano": "npm:cssnano@6.0.3", - "postcss": "npm:postcss@8.4.35", - "tailwindcss": "npm:tailwindcss@^3.4.1" + "@tailwindcss/postcss": "npm:@tailwindcss/postcss@^4.0.8", + "fresh": "jsr:@fresh/core@^2.0.0-alpha.29", + "postcss": "npm:postcss@8.4.35" } } diff --git a/plugin-tailwindcss/src/compiler.ts b/plugin-tailwindcss/src/compiler.ts index a7b7658098a..3d45ff4cecc 100644 --- a/plugin-tailwindcss/src/compiler.ts +++ b/plugin-tailwindcss/src/compiler.ts @@ -1,80 +1,14 @@ -import tailwindCss, { type Config } from "tailwindcss"; +import tailwindPoscss from "@tailwindcss/postcss"; import postcss from "postcss"; -import autoprefixer from "autoprefixer"; -import * as path from "@std/path"; -import type { TailwindPluginOptions } from "./types.ts"; import type { ResolvedFreshConfig } from "fresh"; +import type { Plugin, Processor } from "postcss"; -const CONFIG_EXTENSIONS = ["ts", "js", "mjs"]; - -async function findTailwindConfigFile(directory: string): Promise { - let dir = directory; - while (true) { - for (let i = 0; i < CONFIG_EXTENSIONS.length; i++) { - const ext = CONFIG_EXTENSIONS[i]; - const filePath = path.join(dir, `tailwind.config.${ext}`); - try { - const stat = await Deno.stat(filePath); - if (stat.isFile) { - return filePath; - } - } catch (err) { - if (!(err instanceof Deno.errors.NotFound)) { - throw err; - } - } - } - - const parent = path.dirname(dir); - if (parent === dir) { - throw new Error( - `Could not find a tailwind config file in the current directory or any parent directory.`, - ); - } - - dir = parent; - } -} - -export async function initTailwind( +export function initTailwind( config: ResolvedFreshConfig, - options: TailwindPluginOptions, -): Promise { - const root = path.dirname(config.staticDir); - - const configPath = await findTailwindConfigFile(root); - const url = path.toFileUrl(configPath).href; - const tailwindConfig = (await import(url)).default as Config; - - if (!Array.isArray(tailwindConfig.content)) { - throw new Error(`Expected tailwind "content" option to be an array`); - } - - // deno-lint-ignore no-explicit-any - tailwindConfig.content = tailwindConfig.content.map((pattern: any) => { - if (typeof pattern === "string") { - const relative = path.relative(Deno.cwd(), path.dirname(configPath)); - - if (!relative.startsWith("..")) { - return path.join(relative, pattern); - } - } - return pattern; - }); - - // PostCSS types cause deep recursion - const plugins = [ - // deno-lint-ignore no-explicit-any - tailwindCss(tailwindConfig) as any, - // deno-lint-ignore no-explicit-any - autoprefixer(options.autoprefixer) as any, - ]; - - if (config.mode === "production") { - const { default: cssnano } = await import("cssnano"); - plugins.push(cssnano()); - } - - const res = postcss(plugins); - return res; +): Processor { + return postcss([ + tailwindPoscss({ + optimize: config.mode === "production", + }), + ] as Plugin[]); } diff --git a/plugin-tailwindcss/src/mod.ts b/plugin-tailwindcss/src/mod.ts index 28b309890fa..235485a212b 100644 --- a/plugin-tailwindcss/src/mod.ts +++ b/plugin-tailwindcss/src/mod.ts @@ -1,4 +1,3 @@ -import type { TailwindPluginOptions } from "./types.ts"; import { initTailwind } from "./compiler.ts"; import type { Builder } from "fresh/dev"; import type { App } from "fresh"; @@ -6,21 +5,21 @@ import type { App } from "fresh"; export function tailwind( builder: Builder, app: App, - options: TailwindPluginOptions = {}, ): void { let processor: ReturnType | null; builder.onTransformStaticFile( { pluginName: "tailwind", filter: /\.css$/ }, async (args) => { - if (!processor) processor = initTailwind(app.config, options); - const instance = await processor; + if (!processor) processor = initTailwind(app.config); + const instance = processor; const res = await instance.process(args.text, { from: args.path, }); + return { content: res.content, - map: res.map?.toString(), + map: res.map.toString(), }; }, ); diff --git a/plugin-tailwindcss/src/types.ts b/plugin-tailwindcss/src/types.ts deleted file mode 100644 index c82e3eadb3f..00000000000 --- a/plugin-tailwindcss/src/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -export interface AutoprefixerOptions { - /** environment for `Browserslist` */ - env?: string; - - /** should Autoprefixer use Visual Cascade, if CSS is uncompressed */ - cascade?: boolean; - - /** should Autoprefixer add prefixes. */ - add?: boolean; - - /** should Autoprefixer [remove outdated] prefixes */ - remove?: boolean; - - /** should Autoprefixer add prefixes for @supports parameters. */ - supports?: boolean; - - /** should Autoprefixer add prefixes for flexbox properties */ - flexbox?: boolean | "no-2009"; - - /** should Autoprefixer add IE 10-11 prefixes for Grid Layout properties */ - grid?: boolean | "autoplace" | "no-autoplace"; - - /** custom usage statistics for > 10% in my stats browsers query */ - stats?: { - [browser: string]: { - [version: string]: number; - }; - }; - - /** - * list of queries for target browsers. - * Try to not use it. - * The best practice is to use `.browserslistrc` config or `browserslist` key in `package.json` - * to share target browsers with Babel, ESLint and Stylelint - */ - overrideBrowserslist?: string | string[]; - - /** do not raise error on unknown browser version in `Browserslist` config. */ - ignoreUnknownVersions?: boolean; -} - -export interface TailwindPluginOptions { - autoprefixer?: AutoprefixerOptions; -} diff --git a/www/deno.json b/www/deno.json index a780067cd2e..4dc5dc62ee4 100644 --- a/www/deno.json +++ b/www/deno.json @@ -6,7 +6,7 @@ }, "imports": { "$ga4": "https://raw.githubusercontent.com/denoland/ga4/main/mod.ts", - "@fresh/plugin-tailwind": "../plugin-tailwindcss/src/mod.ts", + "@fresh/plugin-tailwind": "jsr:@fresh/plugin-tailwind@0.0.1-alpha.7", "@luca/esbuild-deno-loader": "jsr:@luca/esbuild-deno-loader@^0.11.0", "@preact/signals": "npm:@preact/signals@^1.3.0", "@std/crypto": "jsr:@std/crypto@1",