Fix `@source` with folders that are ignored
This PR fixes an issue where a @source that's pointing to a folder that is git ignored, is also ignored by the @source even if it's explicitly added.
Internally, we convert @source directives from PublicSourceEntrys to SourceEntrys where we have dedicated enum branches for Auto, Pattern, Ignored and External.
The Auto one accepts a base path, and will be used for auto content detection. However, these paths will make use of all the default auto content detection rules, which includes git ignore rules.
We also have External where we link to something that's "external" to the current repo. We can probably improve this name, but it's external in the sense that it won't show up on GitHub for example, aka ignored. We have some content dirs that we ignore by default, such as the node_modules folder. When you do use @source with node_modules in the path, then we will mark it as an external resource which does not look at the gitignore related rules and allowing it to be included this way.
The idea with this is that, even though the folder is ignored by default, you can still include files from the folder by explicitly using the @source directive.
The issue as seen in #19844 is using vendor/ instead of node_modules/ which is not ignored by default. While we can add vendor/ to this same ignored dirs list, it will result in a breaking change because this folder is often used by the Laravel community to store some resources in.
This PR fixes this problem by not only looking at the content dirs we ignore by default, but also looking at the actual git ignore state of this folder. If it turns out that this is ignored, then we promote the Auto source to an External source.
Test plan
- Added integration tests for this situation
- Ran the fix on the reproduction from #19844. If we run the CLI with the
DEBUG=*environment variable, the log file produces these results:
diff --git a/./tailwindcss-29207.log b/./tailwindcss-30381.log
index bc3017c..921af0e 100644
--- a/./tailwindcss-29207.log
+++ b/./tailwindcss-30381.log
@@ -6,8 +6,9 @@ INFO tailwindcss_oxide::scanner: Source: PublicSourceEntry { base: "/Users/robin
INFO tailwindcss_oxide::scanner: Optimized sources:
INFO tailwindcss_oxide::scanner: Source: Pattern { base: "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/app/design/frontend/theme", pattern: "/**/*.phtml" }
INFO tailwindcss_oxide::scanner: Source: Pattern { base: "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/app/design/frontend/theme", pattern: "/**/*.xml" }
-INFO tailwindcss_oxide::scanner: Source: Auto { base: "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/vendor/acme/theme" }
+INFO tailwindcss_oxide::scanner: Source: External { base: "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/vendor/acme/theme" }
INFO tailwindcss_oxide::scanner: Source: Ignored { base: "/Users/robin/.fnm/node-versions/v26.1.0/installation/bin", pattern: "/node" }
INFO discover_sources: tailwindcss_oxide::scanner: enter
-INFO discover_sources: tailwindcss_oxide::scanner: Reading "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/app/design/frontend/theme/index.phtml"
+INFO tailwindcss_oxide::scanner: Reading "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/app/design/frontend/theme/index.phtml"
+INFO tailwindcss_oxide::scanner: Reading "/Users/robin/github.com/GrimLink/tailwind-gitignore-bug/vendor/acme/theme/module/templates/component.phtml"
INFO discover_sources: tailwindcss_oxide::scanner: exit
We're checking some .gitignore related files, so let's check on each OS [ci-all]