mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2026-10-28 09:46:23 +08:00
main
6877
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
8cc0551b12 |
Add changelog entry for #20591 (#20594)
Adds the changelog entry for https://github.com/tailwindlabs/tailwindcss/pull/20591. The entry was missing because the fork of that PR did not allow maintainer edits. <sub>Sent by an AI assistant on behalf of @RobinMalfait.</sub> |
||
|
|
a982d5b20b |
Decode single-digit hexadecimal CSS escapes (#20591)
## Summary
`unescape` treats every two-character match as a simple character
escape, including a backslash followed by a single hexadecimal digit.
For example, `\a` becomes the letter `a` instead of U+000A, and `\0`
becomes `0` instead of U+FFFD.
Distinguish hexadecimal escapes from simple escapes using separate
capture groups. This preserves the existing handling of one-to-six hex
digits, optional trailing whitespace, and invalid code points.
This also fixes theme variable normalization: `@theme { --color-\0: red;
}` currently registers `--color-0`, while the CSS reference
`var(--color-\0)` refers to a different identifier. Add a compilation
regression test alongside the helper tests.
Reference: [CSS Syntax — consume an escaped code
point](https://www.w3.org/TR/css-syntax-3/#consume-escaped-code-point).
## Test plan
- With the original implementation, the nine new single-digit helper
cases and the new compilation case fail.
- `pnpm exec vitest run --project tailwindcss
packages/tailwindcss/src/utils/escape.test.ts` — 19 passed.
- `pnpm exec vitest run --project tailwindcss
packages/tailwindcss/src/index.test.ts -t 'single-digit hexadecimal'` —
1 passed.
- Prettier check on all three changed files — passed.
- `pnpm exec vitest run --project tailwindcss` — 5,158 passed, 3 failed,
1 skipped. The same three snapshot failures were verified on unmodified
upstream `f7f47f8`: CSS mixins, rounded utilities, and theme string
indexing.
- Full Rust/build verification has not been run; the partial workspace
typecheck limitation noted during setup remains.
|
||
|
|
fda34f8876 |
Canonicalization: only ignore --tw-{property} next to the related property (#20593)
This PR fixes an issue where `canonicalizeCandidates` with `collapse:
true` can drop a utility that sets a `--tw-*` variable, which loses CSS.
When we compute the signature of a utility, we ignore a
`--tw-{property}` declaration if `{property}` exists with the same value
(since https://github.com/tailwindlabs/tailwindcss/pull/19156). This way
`[font-weight:400]` can become `font-normal`, even though `font-normal`
also sets `--tw-font-weight: 400`.
But the check did not compare the property names. It ignored a `--tw-*`
declaration when _any_ other property had the same value. With this
custom utility:
```css
@utility link {
margin-top: 16px;
--tw-translate-x: 16px;
}
```
The signature of `link` was the same as the one of `mt-4`, so `link
mt-4` became `mt-4`. The output CSS then has no `--tw-translate-x:
16px`, and an element with `link mt-4 translate-y-2` moves 0 instead of
16px on the x axis.
The check now only matches the related property: `{property}` for
`--tw-{property}`. A few core utilities set a variable with another
name, so these map explicitly:
- `--tw-leading` → `line-height`
- `--tw-tracking` → `letter-spacing`
- `--tw-duration` → `transition-duration`
- `--tw-ease` → `transition-timing-function`
I found these with a scan of all utilities in `getClassList()` with the
default theme, for each `--tw-*` declaration that has a sibling with the
same value. All other matches in core use the same name
(`--tw-font-weight`, `--tw-border-style`, `--tw-outline-style`,
`--tw-content`). The scan also found `--tw-space-x-reverse: 0` next to
`margin-inline-*: 0` for `space-x-0`, which is not related, and which is
now part of the signature.
If a new core utility sets a `--tw-*` variable next to a property with
another name and it is not in this list, it only canonicalizes less. It
does not drop CSS.
## Test plan
- Added a regression test to `canonicalize-candidates.test.ts`. On
`main`, `link mt-4` becomes `mt-4`. With this change, it stays `link
mt-4`.
- The existing tests that need the check still pass, without a change to
their expectations (e.g. `[font-weight:400]` → `font-normal`,
`[line-height:0]` → `leading-0`, `text-sm leading-7` → `text-sm/7`).
- All tests in `packages/tailwindcss` pass, and `pnpm run build` passes.
<sub>Sent by an AI assistant on behalf of @RobinMalfait.</sub>
|
||
|
|
f7f47f8e98 |
Rebuild @tailwindcss/turbopack and @tailwindcss/webpack when the input CSS changes (#20582)
This PR fixes an issue where `next dev` with the `@tailwindcss/turbopack` loader keeps serving the CSS of the previous edit after you edit the CSS file. Only a restart of the dev server shows the latest version. Fixes https://github.com/tailwindlabs/tailwindcss/issues/20581 The loader caches a compiler for each CSS file. It only does a full rebuild when the mtime of the input file (or of one of its dependencies) changes. After a save, Turbopack can run the loader two times: 1. With the previous version of the CSS file. The file on disk already has the new mtime, so we did a full rebuild from the old source, and stored the new mtime. 2. With the new version of the CSS file. The mtime did not change since the first call, so we did an incremental build with the stale compiler of the first call. The loader registers the folders that it scans as context dependencies, and the CSS file is in one of them (e.g. `app/`). So one save invalidates the loader in two ways, and the first run can still get the previous content of the file. `@tailwindcss/postcss` had the same problem with Turbopack (https://github.com/tailwindlabs/tailwindcss/pull/17554), and it compares the input CSS with the input CSS of the last build since https://github.com/tailwindlabs/tailwindcss/pull/20310. The loader now does the same: it stores the source on the cache entry, and does a full rebuild when the source changes. `@tailwindcss/turbopack` is a copy of `@tailwindcss/webpack`, so the webpack loader gets the same fix. With webpack, the problem shows up when a loader that runs before ours changes the CSS, but not the input file. For example, `sass-loader` inlines a partial, and you edit that partial. The matrix of the integration tests in CI had no `turbopack` entry, so the tests in `integrations/turbopack` never ran in CI. This PR adds it. ## Test plan - Added an integration test to `integrations/turbopack/loader.test.ts`. It edits `app/globals.css` three times during `next dev`, and checks that the served CSS has each edit. On `main` (with Next.js 16.4.1), the served CSS still has `.custom-1` after the first edit. With this change, it passes. - Added an integration test to `integrations/webpack/loader.test.ts`, with a loader before `@tailwindcss/webpack` that inlines `src/partial.css`. In watch mode, it edits that partial. On `main`, the output keeps `.partial-1`. With this change, it passes. - Called the built loaders directly, like Turbopack does: first with the previous source after the file changed on disk, then with the new source. On `main`, the second call returns the CSS of the previous version. With this change, each call returns the CSS of the source that it gets. - `pnpm run build` passes, and all tests in `integrations/turbopack/loader.test.ts` and `integrations/webpack/loader.test.ts` pass. <sub>Sent by an AI assistant on behalf of @RobinMalfait.</sub> |
||
|
|
d580998627 |
Bump Bun to 1.4 so macOS standalone binaries get a valid code signature (#20578)
## Summary Fixes #20544. `bun build --compile` in Bun 1.3.14 writes the ad-hoc Mach-O signature with the hash of the last 4 KiB page taken over a zero-padded page, not the real bytes. `codesign --verify` reports an invalid signature, and macOS 27 checks that page at launch and kills `tailwindcss-macos-arm64`. Bun 1.4.1 and later sign the real bytes. This bumps `bun` and `@types/bun` in `@tailwindcss/standalone` from `^1.3.14` to `^1.4.1`. The lockfile now resolves Bun 1.4.3. The fix reaches users with the next release, because the binaries are built at release time. ## Test plan I built the standalone binaries before and after the bump on Linux (`cd packages/@tailwindcss-standalone && pnpm build`) and hashed every 4096-byte page of `dist/tailwindcss-macos-arm64` against its `LC_CODE_SIGNATURE` CodeDirectory: | | Bun | bad pages | last page hash matches the zero-padded page | |---|---|---|---| | `main` | 1.3.14 | `[(17905, 2736)]` | yes | | this PR | 1.4.3 | none | no | I could not run the binary on macOS 27, so the launch kill itself is not tested here. Also checked with the bump: `pnpm install --frozen-lockfile` passes, the build finishes for all 7 targets, and the `tailwindcss-linux-x64` binary builds `@import "tailwindcss"` and generates `.flex`, `.p-4` and `hover:underline` for a small HTML file. `dist/tailwindcss-macos-arm64` grows from 73.9 MB to 81.3 MB. I did not run `integrations/cli/standalone.test.ts`, because it needs `pnpm pack` tarballs of every package, including the WASM build. I am new to open source, and this pull request was made with AI assistance. --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
1f18d20aa6 |
Handle vendor-prefixed selector functions in custom variants (#20486)
Fixes #20483. ## What changed - parse `:-moz-any()` and `:-webkit-any()` arguments as selector lists, matching their standard `:is()` counterpart - allow nesting replacement to substitute `&` inside these legacy selector functions - cover both vendor-prefixed parser forms and the reported `@custom-variant firefox (:-moz-any(&))` compilation path ## Why The selector parser treated unknown function arguments as opaque values. After the nesting changes in #20124, that meant the `&` inside `:-moz-any(&)` could not be replaced and the custom variant was emitted as a descendant selector instead. These two vendor-prefixed functions are legacy aliases for selector-list matching, so handling them alongside `:is()` keeps the change narrowly scoped. ## Validation - reproduced the regression on current `main`: `.firefox\\:underline :-moz-any(:scope)` - confirmed the new assertions fail when only the parser change is reverted - `vitest run packages/tailwindcss/src/index.test.ts packages/tailwindcss/src/selector-parser.test.ts` — 299 tests passed - Prettier check passed for all changed files - `tailwindcss` production build passed, including ESM, CJS, and declaration output --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
955d37ac91 |
Fix out of memory error in the canonicalize tests on macOS CI (#20579)
This PR fixes the `macOS` job of CI on `main`, which fails with `JavaScript heap out of memory` in `packages/tailwindcss/src/canonicalize-candidates.test.ts`. It failed in both attempts of the run for https://github.com/tailwindlabs/tailwindcss/commit/92172d387827f1160ebe7415d80c542933c0e9d7, and earlier for https://github.com/tailwindlabs/tailwindcss/pull/20540. The test file cached every design system that it built in a module-level map for the whole run. Each design system uses ~30MB of memory, so the heap grows with each test that has its own CSS input. After a forced GC, the heap at the end of the file was: | Commit | Design systems | Heap | | --- | --- | --- | | https://github.com/tailwindlabs/tailwindcss/pull/20417 | 57 | 1886 MB | | https://github.com/tailwindlabs/tailwindcss/pull/20563 | 61 | 1982 MB | | `main` | 64 | 2137 MB | The macOS runners have a default heap limit of ~2GB, so the file now crosses it. The memory of one design system did not change in recent commits, only the number of design systems. Now, the file keeps only the 32 most recently used design systems. The strategies of the file (`default`, `with-variant`, `important`) cycle through the same ~30 inputs, so a smaller cache evicts each design system right before it is used again. That makes the file ~70% slower (124 builds instead of 64). With 32, the file builds 66 design systems. ## Test plan - `NODE_OPTIONS=--max-old-space-size=2048 vitest run src/canonicalize-candidates.test.ts` runs out of memory on `main`, and passes with this change. It also passes with a limit of 1280 MB. - The duration of the file stays the same (~13s locally). - `vitest run --project tailwindcss` passes. [ci-all] <sub>Sent by an AI assistant on behalf of @RobinMalfait.</sub> |
||
|
|
92172d3878 |
Canonicalization: avoid exponential collapse when a utility sets many properties (#20558)
## Summary Fixes #20557. `canonicalizeCandidates(…, { collapse: true })` took time that doubled with every class in a group of linked candidates. `collapseGroup` links two candidates when their `otherUtilities` sets (possible replacements) share an entry, and then tries every combination (2^n − n − 1) of each linked group, computing a signature for each. A static utility that sets many properties ends up in the `otherUtilities` of every candidate that sets one of those properties. For example `sr-only` and `not-sr-only` link `relative`, `mt-1`, `w-64`, `overflow-x-auto`, `whitespace-nowrap`, … and a project `@utility` used as a component class does the same, even when the class list doesn't use it. But such a replacement can never be picked. Its signature can only equal the signature of a combination if every property it sets is also set by a candidate in that combination, and each of those candidates has the replacement in its own `otherUtilities`. `sr-only` also sets `clip-path` and `border-width`, which none of those candidates set, so no combination can ever match it. This PR changes two things: 1. Before linking, drop every replacement whose properties aren't covered by the candidates that list it. This only uses the property lookups that are already computed, and it only removes replacements that can't match, so the replacements that do get used stay the same. With the impossible ones gone, the giant linked groups split up into the small groups you'd expect (e.g. `overflow-x-*` + `overflow-y-*` → `overflow-*`), so the number of combinations stays small. 2. In the combination loop, skip the (expensive) signature computation for a combination when the intersection of its possible replacements is empty. Results with the reproduction from the issue (Node 20, same design system per row; times are for one `canonicalizeCandidates` call): | Case | Classes | Before | After | | --- | --: | --: | --: | | A: default theme | 10 | 102 ms | 19 ms | | | 12 | 369 ms | 22 ms | | | 14 | 1,374 ms | 20 ms | | B: default theme + `pill` `@utility` | 12 | 348 ms | 19 ms | | | 14 | 1,709 ms | 24 ms | | | 15 | 3,487 ms | 29 ms | | | 16 | 7,278 ms | 26 ms | The output was the same before and after for every row, including `text-sm leading-5` → `text-sm/5`, which the issue mentions breaking when the lookup was restricted to matching values instead. One limit: if a class list really does cover every property of a big utility, its candidates are still linked through it, and that group is still enumerated as before. That's the existing behaviour, and it's much rarer than the cases above. ## Test plan - Added a regression test with 23 classes linked through `sr-only`, `not-sr-only` and a `pill` `@utility`. It checks the collapsed output (`text-sm leading-5` → `text-sm/5`, everything else untouched) and that it finishes in under 5 s. It takes ~0.8 s on this branch. Without the fix I stopped it after more than 3 minutes. - `pnpm vitest run packages/tailwindcss/src`: 43 files, 5017 tests passing (this includes all 1805 existing canonicalization tests, whose outputs are unchanged). - `prettier --check` on the changed files; `tsc` reports no errors for the changed files. --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
374d191b16 |
Reject arbitrary values with unbalanced parens or brackets (#20577)
<!-- 👋 Hey, thanks for your interest in contributing to Tailwind! **Please ask first before starting work on any significant new features.** It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create a discussion to first discuss any significant new features. For more info, check out the contributing guide: https://github.com/tailwindlabs/tailwindcss/blob/main/.github/CONTRIBUTING.md --> ## Summary Candidates with an unclosed `(` or `[` inside an arbitray value are accepted and generated invalid css: ```css `w-[calc(20px]` -> `width: calc()20px;` `w-[(]` -> `width: ();` ``` Tailwind play with the bug reproduced: https://play.tailwindcss.com/vQyd5Lh4bz <img width="781" height="1015" alt="Captura de Tela 2026-10-14 às 19 43 48" src="https://github.com/user-attachments/assets/26039daf-000a-44f0-8fbd-3f4c1e28115c" /> Why this was happening: 1. `isValidArbitrary` documents that unbalanced values are not allowed, but it never checked that every `(` and `[` was closed, and it ignored a mismatched closer such as `(]`. 2. the parser validated the value after `decodeArbitraryValue`, and the value parser turns `calc(20px` into `calc()20px`, so the validator only saw a balanced string. This pr: - Makes `isValidArbitrary` return `false` for a mismatched closing char and for any unclosed `(` or `[` at the end of the value, a mismatched `}` is still tolerated, since `{` is not tracked on the stack, e.g. `var(--a, {})` - validates the raw value before decoding, via a small `decodeValidArbitraryValue` helper at all places where an arbitrary value is parsed, like arbitrary properties, utility values, modifiers , arbitrary variants and functional variants suck `[...]` and `(...)` this change is also making the js parser agree with the rust scanner, which already rejects unbalanced brackets (check `arbitrary_value_machine.rs`), this bug is reachable wherever the js parser receives strings directly, such tailwind play or `compile().build([...])` ## Test plan - added test to `candidate.test.ts` covering unbalanced values for utility values, arbitrary properties, modifiers, arbitrary variants and functional variants, they fail on `main` and pass with the change made here - Some existent tests contained unbalanced inputs taht only passed because the value parser repaired or dropped the bad paren `pnpm vitest run src/candidate.test.ts` `pnpm vitest run src/index.test.ts` --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
9c92dfdbc4 |
Drop nested rules that put a combinator after a pseudo-element (#20575)
This PR fixes an issue where a utility with a nested rule, used with a
pseudo-element variant, results in a selector that can never match
anything.
```css
@utility bg-* {
& > * {
--nearest-bg: --value(--color-*);
}
}
```
With `selection:bg-red-500`, the nested rule was flattened to:
```css
.selection\:bg-red-500::selection > * {
--nearest-bg: var(--color-red-500);
}
```
A pseudo-element can only be followed by pseudo-classes, so this never
matches. Lightning CSS drops these rules, but warns about each of them
on every build:
```
Pseudo-elements like '::before' or '::after' can't be followed by selectors like 'Delim('>')'
```
The same happens for `backdrop:` and `marker:`. For `marker:` the
`::-webkit-details-marker > *` rule was even kept in the output.
When we flatten nested rules in `handleNesting`, we now drop each
selector that puts a combinator after a pseudo-element (e.g.
`::selection`, `::part(…)`, vendor-prefixed ones like
`::-webkit-details-marker`, and the legacy `:before`, `:after`,
`:first-line` and `:first-letter`). This also covers `:is(…)` and
`:where(…)` when all of their arguments are dead, which means that
built-in utilities like `selection:space-x-4` no longer emit an empty
`:where()` rule after optimization.
If none of the selectors are left, then the declarations of the rule are
dropped. Rules nested inside of it are still processed, because they can
still match (e.g. `:is(&, .fallback)`). This also applies to rules
inside hoistable at-rules such as `@media` and `@scope`. An `@scope` is
only dropped when its `<scope-start>` selector can never match. Empty
`@layer` rules are kept (without the dead selector), because they can
establish the layer order.
Things that are intentionally left alone:
- Pseudo-classes after a pseudo-element (e.g. `.a::before:hover`).
- Combinators before a pseudo-element (e.g. `.a > ::before`).
- Top-level selectors written by the user (e.g. `.a::selection > * { …
}`).
- Unknown pseudo-elements, such as framework specific deep combinators
like `::ng-deep` (Angular) and `::v-deep` (Vue 2). Another compiler
rewrites them later on.
- `before:` and `after:`. The parent rule has declarations (`content:
var(--tw-content)`), so the nested rule stays nested as `& > *`.
Browsers and Lightning CSS already drop it without a warning.
I also moved the `isPseudoElement` helper from
`canonicalize-candidates.ts` to `selector-parser.ts` so both places can
use it.
Fixes: https://github.com/tailwindlabs/tailwindcss/issues/20571
Closes #20573
## Test plan
1. Added tests to `ast.test.ts` for dropped selectors, partially dropped
selector lists, selectors that must be kept, unknown pseudo-elements,
and nested rules, `@scope` and `@layer` rules inside a dropped rule.
2. Added a test to `utilities.test.ts` for the issue's utility with
`selection:`, `backdrop:` and `hover:`.
3. Existing tests still pass.
4. Built the issue's example and ran it through Lightning CSS: no
warnings anymore.
|
||
|
|
e8f8b19c4c |
Rewrite url(…)s of stylesheets inlined before @tailwindcss/postcss in optimized builds (#20576)
## Summary Fixes https://github.com/tailwindlabs/tailwindcss/issues/20570 Vite adds its own `postcss-import` before the PostCSS plugins of the user. Thus, when `@tailwindcss/postcss` runs, the `@import`-ed stylesheets are already inlined. Their relative `url(…)`s are still relative to their own file. At the end, Vite resolves each `url(…)` against the `source.input.file` of its declaration. Without optimization, we keep the `source` of each node (since https://github.com/tailwindlabs/tailwindcss/pull/17775), so this works. With optimization, we parse the output of Lightning CSS again, and every node gets the input file as its `source`. `optimize` is on by default when `NODE_ENV` is `production`, and `vite build` sets it. Vite then looks for the asset next to the input file, does not find it, and keeps the URL as it is: ``` ./fonts/ExampleSans.woff2 referenced in ./fonts/ExampleSans.woff2 didn't resolve at build time, it will remain unchanged to be resolved at runtime ``` This is the problem that https://github.com/tailwindlabs/tailwindcss/issues/16636 and https://github.com/tailwindlabs/tailwindcss/issues/16700 reported. https://github.com/tailwindlabs/tailwindcss/pull/16965 fixed URL rewriting only for the stylesheets that we inline ourselves. `transformAssetUrls` (https://github.com/tailwindlabs/tailwindcss/pull/18321) has no effect here. ## Solution When we optimize, we now rewrite the relative `url(…)`s of declarations that come from another file, so that they are relative to the input file. This is the same rewrite that we do for the stylesheets that we inline ourselves. After the rewrite, the URLs match the `source` that the optimized nodes get. - We rewrite the AST that we get from PostCSS, before we compile it. The stylesheets that we load ourselves are not in that AST yet, so we do not rewrite their URLs two times. - Without optimization, nothing changes, because the nodes keep their `source`. - `transformAssetUrls: false` disables the rewrite. To share the code, `rewriteUrls` in `@tailwindcss/node` now uses a new `rewriteUrlsInAst` function. A callback gives it the base folder of each declaration. This also changes optimized builds of other setups that run `postcss-import` before `@tailwindcss/postcss`, like `postcss-cli`. Their URLs are now relative to the input file, like the URLs of the stylesheets that we inline ourselves. ## Test plan - Added unit tests in `packages/@tailwindcss-postcss/src/index.test.ts`. They run `postcss-import` before the plugin with `optimize` on, with `optimize` off, and with `transformAssetUrls: false`. The test with `optimize` on fails on `main`. - Added an integration test in `integrations/postcss/url-rewriting.test.ts`. It runs `vite build` with `@tailwindcss/postcss` in a PostCSS config. Without this change, Vite emits no fonts and the test fails. With this change, it passes. - `pnpm vitest run`: 5598 passed. - `pnpm vitest --root=./integrations run` on `postcss/url-rewriting`, `vite/url-rewriting`, `postcss/index`, `postcss/source`, `postcss/plugins`, `postcss/config`, `postcss/core-as-postcss-plugin` and `postcss/multi-root`: all passed. I did not run `postcss/next.test.ts`. - Built a Vite 8.2.0 project with a font CSS file in a package and one in a local folder. With `optimize: true`, the fonts are now emitted to `dist/assets` and the URLs are rewritten, the same as with `optimize: false`. |
||
|
|
d76d566cc2 |
Don't collapse utilities into a utility with other theme variables (#20574)
This PR fixes an issue where `canonicalizeCandidates(…, { collapse: true
})` replaces a group of utilities with a utility that uses a different
theme variable. The two variables only have the same value by default.
Given this theme:
```css
@theme {
--spacing-card: 1rem;
--spacing-other: 1rem;
}
```
| Input | Before | After |
| ------------------ | --------- | ----------------------------- |
| `mt-card mb-card` | `my-4` | `my-card` |
| `w-card h-card` | `size-4` | `size-card` |
| `mt-card mb-other` | `my-4` | `mt-card mb-other` |
| `w-card h-other` | `size-4` | `w-card h-other` |
| `mt-card mb-4` | `my-4` | `mt-card mb-4` |
| `p-card px-other` | `p-card` | `p-card px-other` |
The results on the left render differently once one of the variables
changes, e.g. in `.dark`, in a media query, or in a class.
## The cause
Signatures inline theme variables to their default value. This is
correct for single candidates (e.g. `text-[var(--color-red-500)]` →
`text-red-500`). But `var(--spacing-card)` and `calc(var(--spacing) *
4)` then both become `1rem`, so the collapse step can't see which
variable a utility uses.
## The fix
A new cache compiles a utility the same way as its signature, and
records the theme variables that are inlined in each declaration. The
collapse step only uses this after the signature of a replacement
already matches. Then each declaration of the replacement must use the
same theme variables as the candidates it replaces.
A declaration without theme variables can still become one with theme
variables. This is the same as for single candidates (`mt-[16px]` →
`mt-4`), and it keeps existing results like:
- `[width:16px] [height:16px]` → `size-4`
- `[font-size:14px] [line-height:1.625]` → `text-sm/relaxed`
- `mt-[1px] mb-[1px]` → `my-px`
- `text-sm leading-5` → `text-sm/5`
No existing test expectation changes.
## Performance
The theme variables are only computed for a replacement whose signature
already matches, and they are cached. With 10 class lists and the full
default theme, the extra compiles take about 0.35ms of about 28ms on the
first call (about 1%). Repeated calls do no extra work.
## Test plan
- Added a regression test for the cases in the table above
- All existing tests in `packages/tailwindcss` pass
|
||
|
|
d4b5c6348b |
Prefer an existing candidate when collapsing utilities (#20540)
## Summary Fixes #20539 When collapsing `text-foreground text-primary`, canonicalization returned `text-card-checked-border` if that token had the same default value as `--color-primary`. Signatures are computed from the default theme, so both utilities look identical, but `.dark` can override `--color-primary` and not the other one, so the replacement changes the dark mode color. `collapseGroup` took the first utility from `potentialReplacements` whose signature matched the combined signature of the combo. It now tries the candidates of the combo itself first. If one of them already produces the same result as the whole combo (here `text-primary`, the one that wins the cascade), it's kept and the others are dropped. Other utilities are only used when none of the originals match, so existing collapses like `h-4 w-4` → `size-4` are unchanged. ## Test plan - Added a regression test in `canonicalize-candidates.test.ts` with the theme from the issue. It fails on `main` (`text-card-checked-border`) and passes with the change (`text-primary`). - `pnpm vitest run src/canonicalize-candidates.test.ts` in `packages/tailwindcss`: 1806 passed. - Whole `packages/tailwindcss` suite: 5015 passed, 1 failed (`variants.test.ts > variants with the same root are sorted deterministically`), which fails the same way on `main` on my machine. --------- Co-authored-by: 911RS <911RS@users.noreply.github.com> Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
2ce6652f1c |
Don't let quotes in Pug regex literals hide the end of an attribute list (#20572)
This is a follow-up to https://github.com/tailwindlabs/tailwindcss/pull/20547. That PR tracks strings inside Pug attribute lists, so that brackets in values like `a(title="a (b")` are ignored. But a quote that isn't a string delimiter, like the `"` in a regex such as `input(pattern=/"/.source)`, opened a string that never closed. That string hid the `)` of the attribute list. The list stayed open, so dots in class shorthands on later lines were not turned into spaces, and classes like `underline` in `span.underline.font-bold` were not extracted. ```pug input(pattern=/"/.source) span.underline.font-bold km ``` ## Solution Only template literals can span lines in JavaScript. So when a `'` or `"` string reaches the end of its line without a closing quote, it was not a string. In that case, we go back to just after the quote and scan the rest of the line again, with quotes as plain text. Each line is scanned at most twice, so this stays linear. Detecting regex literals directly needs a JavaScript tokenizer, because a `/` can also be a division. This approach also covers other unpaired quotes, like `// don't cache` in a `script.` block. The regression is not released yet, so there is no changelog entry: the existing entry of https://github.com/tailwindlabs/tailwindcss/pull/20547 covers it. ## Test plan Added cases to `test_unbalanced_brackets_in_quoted_attribute_values` in `pug.rs`. They fail without this change. ``` cargo test -p tailwindcss-oxide ``` |
||
|
|
2cf0e87e9a |
Underline the correct occurrence of an unsupported type in --value(…) (#20554)
<!-- 👋 Hey, thanks for your interest in contributing to Tailwind! **Please ask first before starting work on any significant new features.** It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create a discussion to first discuss any significant new features. For more info, check out the contributing guide: https://github.com/tailwindlabs/tailwindcss/blob/main/.github/CONTRIBUTING.md --> ## Summary When an unsupported bare value data type is repeated in `--value(…)`, every warning underlines the first occurrence: ```css @utility paint-* { paint: --value(color, [color], color); } ``` Before, both warnings pointed at the first `color`: ``` --value(color,[color],color) ^^^^^ ``` This happened because the offset was found by replacing every word matching the type with a sentinel in a cloned node and then calling `indexOf` on the printed result, which always returns the first match. Now the offset is computed from the node's position instead: thame, plus the `(`, plus the printed length of the arguments before it. Each warning points at its own occurrence: ``` --value(color,[color],color) ^^^^^ --value(color,[color],color) ^^^^^ ``` ## Test plan Added a test in `packages/tailwindcss/src/utilities.test.ts`. It spies on `console.warn` and checks that the two warnings underline the first and the last color respectively. ``` cd packages/tailwindcss pnpm vitest run src/utilities.test.ts -t "repeated unsupported data type" ``` ## Evidences https://stackblitz.com/edit/github-yq34h5eo?file=input.css before fix: <img width="1464" height="942" alt="Captura de Tela 2026-10-08 às 15 18 19" src="https://github.com/user-attachments/assets/4eb5b0ab-47e2-4183-9f7c-2d8de6d370ea" /> after fix: <img width="1464" height="942" alt="Captura de Tela 2026-10-08 às 15 19 29" src="https://github.com/user-attachments/assets/1659e799-6a93-465a-a5db-63304c583d8d" /> --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
820851896e |
Don't let unbalanced brackets in Pug text leak into the next line (#20547)
## Summary Fixes #20545 The Pug pre-processor keeps one bracket stack for the whole file. A text or comment line with an unbalanced bracket, like `| (`, pushes a `(` that is never popped, and from then on dots are no longer turned into spaces. So `span.underline.font-bold` on the next line stays one invalid candidate and those classes never get CSS. This resets the bracket stack at the end of a line, unless we're inside a Pug attribute list (a `(` directly after a tag, class, id or mixin name), since those can span multiple lines. Inside an attribute list the behavior is the same as before. ## Test plan Added unit tests in `pug.rs` for the cases from the issue (piped text, a `//-` comment, inline text after a tag) plus a multi-line attribute list to make sure that still works. The new test fails without the change. ``` cargo test -p tailwindcss-oxide ``` All 122 unit tests and 71 scanner tests pass. --------- Co-authored-by: Cestercian <183791452+cestercian@users.noreply.github.com> Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
1a38f848f0 |
Write plugin logs to stderr in canonicalize (#20561)
## Summary `tailwindcss canonicalize` writes its results to stdout, but the design system is loaded in the same process, so anything a plugin logs with `console.log` while it loads (e.g. the daisyUI banner) ends up in front of the results. That breaks `--format json` and shifts every line in `--stream` mode. This points `console.log`, `console.info` and `console.debug` at `console.error` for the `canonicalize` command, so stdout only carries the results and plugin output goes to stderr. Fixes #20560 ## Test plan Added an integration test with a plugin that calls `console.log`, it fails on `main` and passes with this change. Also checked by hand with the reproduction from the issue: ``` $ tailwindcss canonicalize --css app.css "p-4 px-2 py-2" 2>/dev/null p-2 $ printf 'p-4 px-2 py-2\nw-4 h-4\n' | tailwindcss canonicalize --css app.css --stream 2>/dev/null p-2 size-4 ``` --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
9833b487a8 |
Recognize missing viewport and font-relative length units (#20516)
## Summary `isLength` in `packages/tailwindcss/src/utils/infer-data-type.ts` checks arbitrary values against a fixed list of units. That list was carried over from v3 and is missing several CSS length units: the small, large, and dynamic viewport units `svi`, `svb`, `svmin`, `svmax`, `lvi`, `lvb`, `lvmin`, `lvmax`, `dvi`, `dvb`, `dvmin`, `dvmax`, and the font-relative units `cap`, `ic`, `rex`, `rch`, `rcap`, `ric`. Because these values are not detected as lengths, utilities that choose a property based on the value type fall back to the color branch. For example `text-[10dvmin]` generates `color: 10dvmin` instead of `font-size: 10dvmin` (while `text-[10dvw]` already works), and `border-[1dvmin]` generates `border-color: 1dvmin`. Today the only workaround is an explicit type hint like `text-[length:10dvmin]`. This adds the missing units, all of which are `<length>` units defined in CSS Values and Units Level 4, to the list. Values that were already detected are unaffected. ## Test plan - Added a test to `packages/tailwindcss/src/utilities.test.ts` that compiles `text-[1<unit>]` for each of the 18 new units and compares the full generated rule. It fails without the change (the rules are emitted as `color: 1<unit>`) and passes with it. - `vitest run src/utilities.test.ts -t "viewport and font-relative"` (in `packages/tailwindcss`) - `vitest run` (in `packages/tailwindcss`): 42 files, 5016 tests passed - `prettier --check` on the changed files --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
931db16192 |
Use margin-trim: block in the @property fallback detection (#20569)
Fixes #20568. ## Summary The `@property` fallback is gated on `not (margin-trim: inline)`. The CSSWG removed the inline values (w3c/csswg-drafts#13731), and Safari Technology Preview now rejects them, so the fallback resets override utilities there. This switches to `margin-trim: block`. That value is still in the grammar and shipped with `@property` in [Safari 16.4](https://webkit.org/blog/13966/webkit-features-in-safari-16-4/), so the branch still matches only older Safari. Firefox's branch is unchanged. I did not use `at-rule(@property)`: browsers without `at-rule()` support would evaluate `not at-rule(…)` as true. ## Test plan - `pnpm vitest run packages/tailwindcss/src/index.test.ts -t 'fallback detection'`: fails on `main`, passes here. - `pnpm vitest run packages/tailwindcss`: 5107 passed, 1 skipped; snapshots updated for the new string. - Not run locally: the `@tailwindcss/postcss` tests and the integration tests (no oxide native build here). Prepared with AI assistance (Claude), reviewed and tested before submission. --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
dfddfcd5de |
Remove --unsafe-perm from the FreeBSD build (#20565)
The `Build x86_64-unknown-freebsd (OXIDE)` job of the Release workflow fails on `main` since #20550 ([latest failure](https://github.com/tailwindlabs/tailwindcss/actions/runs/38272664961)): ``` npm error code EUNKNOWNCONFIG npm error Unknown cli flag: npm error - --unsafe-perm ``` The FreeBSD package repository now installs `npm-12.0.2`, which rejects unknown CLI flags. `--unsafe-perm` has been a no-op since npm 7, so this PR removes it from `release.yml` and `prepare-release.yml`. ## Test plan The Release workflow only runs on `main`, so the next push to `main` verifies the fix. |
||
|
|
1db58586b2 |
Fix canonicalization of theme(…) alpha with more than 2 decimals (#20563)
## Summary This PR fixes two problems with how an inline `theme(…)` alpha is canonicalized to a candidate modifier. ### Alphas with more than 2 decimals When canonicalizing an arbitrary property that uses an inline `theme(…)` with a fractional alpha that has more than 2 decimals, the opacity changed by a factor of 100. For example, `[color:theme(colors.red.500/.12345)]` became `text-red-500/1234.5`. An arbitrary modifier without a unit is treated as a number and multiplied by 100, so the result had an opacity of `1234.5%` instead of `12.345%`. This PR uses an arbitrary percentage instead, so `[color:theme(colors.red.500/.12345)]` now becomes `text-red-500/[12.345%]`. While working on this, I also noticed floating point noise: `.29 * 100` is `28.999999999999996`, which would also have produced an arbitrary modifier. The value is now rounded first, so `[color:theme(colors.red.500/.29)]` becomes `text-red-500/29`. ### Custom `--opacity-*` theme values A named modifier like `/50` reads from the `--opacity-*` theme values first. So if a theme already defines `--opacity-50: 10%`, then `[color:theme(colors.red.500/50%)]` became `text-red-500/50`, which is a 10% opacity instead of 50%. The same happened for `.12` → `/12` and `.29` → `/29`. Now the named modifier is only used when there is no `--opacity-*` theme value for it, or when that value results in the same opacity (e.g. `--opacity-75: 0.75` or `--opacity-75: 75%`). Otherwise, an arbitrary percentage is used: | Theme | Input | Output | |---|---|---| | no `--opacity-50` | `[color:theme(colors.red.500/50%)]` | `text-red-500/50` | | `--opacity-50: 10%` | `[color:theme(colors.red.500/50%)]` | `text-red-500/[50%]` | | `--opacity-75: 0.75` | `[color:theme(colors.red.500/75%)]` | `text-red-500/75` | ## Test plan - Updated the existing `.12345` case and added a `.29` case in `canonicalize-candidates.test.ts`. - Added cases with conflicting, matching and missing `--opacity-*` theme values, for both `@theme` and `@theme inline`. The conflicting cases fail on `main`. ``` pnpm vitest run packages/tailwindcss/src/canonicalize-candidates.test.ts ``` |
||
|
|
ffb47984e7 |
Fix the intersection polyfill in canonicalizeCandidates (#20562)
## Summary The `intersection` helper in `canonicalize-candidates.ts` falls back to a polyfill when `Set.prototype.intersection` is missing (Node.js < 22). The polyfill copied the first set and never removed any item, so it returned the first set instead of the intersection. The collapse step gave different results on those Node.js versions. The polyfill now keeps only the items of the first set that are also in the second set. The function is exported so the polyfill path can be tested directly. ## Test plan Added unit tests for the polyfill path (the native method is stubbed out). ``` cd packages/tailwindcss pnpm vitest run src/canonicalize-candidates.test.ts ``` |
||
|
|
c56200d0c4 |
Fix the Nuxt dev mode integration test (#20564)
## Summary The `vite/nuxt.test.ts > dev mode` integration test fails on `main` on Linux, macOS and Windows since Vite 6.4.4 (released on 2026-10-06). The SSR render of `/` crashes, so the page has no styles: ``` [GET] "http://[::1]:3000/__nuxt_vite_node__/module//node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/node.mjs": 403 Forbidden ``` Nuxt 3.16.0 serves vite-node modules over HTTP. For each module id, it calls Vite's `isFileServingAllowed(config, id)`. These ids are root-relative URLs, like `/node_modules/.pnpm/...`. Before Vite 6.4.4, the import analysis plugin added these URLs to `safeModulePaths`, so the check passed. Vite 6.4.4 adds the resolved file paths instead (https://github.com/vitejs/vite/pull/23656), so the check now rejects the root-relative ids. All Nuxt versions before 3.18.0 do this check. Nuxt 3.18.0 and later serve vite-node modules over an IPC socket without it. This PR moves the test to Nuxt 3.21.11, the latest 3.x release. It runs on Vite 7.3.7, which has the same `safeModulePaths` change. It also removes the `nitropack: 2.11.0` pin. Nuxt 3.21 gets Nitro through `@nuxt/nitro-server` (`nitropack@^2.13.4`), so nothing used the pinned copy. ## Test plan Locally on macOS, with `pnpm vitest --root=./integrations run vite/nuxt.test.ts`: - Nuxt 3.16.0 and Vite 6.4.4: `dev mode` fails with the same 403 as CI. - Nuxt 3.16.0 with a `vite: 6.4.3` override: both tests pass. This confirms the cause. - Nuxt 3.21.11: both tests pass in 3 of 3 runs, with and without the `nitropack` pin. CI checks Linux and Windows. [ci-all] |
||
|
|
392fb6d648 |
Canonicalization: keep & when moving a pseudo-element into * or ** (#20550)
## Summary Fixes #20549. `[&_::before]:flex` was canonicalized to `**:[::before]:flex`. An arbitrary variant without `&` compiles to `&:is(…)`, and pseudo-elements can't go inside `:is()`, so the canonical class generated an invalid selector. When the `*`/`**` fallback moves a pseudo-element (anything starting with `::`, plus the legacy `:before`, `:after`, `:first-line` and `:first-letter`) into its own arbitrary variant, it now keeps the `&`, so `[&_::before]:flex` becomes `**:[&::before]:flex` and `[&>::before]:flex` becomes `*:[&::before]:flex`. Pseudo-classes still canonicalize to `**:[:hover]` as before. ## Test plan Added `[&_::before]:flex`, `[&_>_::before]:flex`, `[&_:before]:flex` and `[&_>_:before]:flex` cases next to the existing `:--custom` ones in `canonicalize-candidates.test.ts`. They fail on `main` (`**:[::before]:flex`) and pass with this change. ``` cd packages/tailwindcss pnpm vitest run src/canonicalize-candidates.test.ts ``` --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
de2255ba3f |
Release loader callbacks after compilation (#20531)
## Summary Cached compilers retain the module and stylesheet loader callbacks after compilation. Callbacks supplied by build tools can capture completed build state, keeping it alive during later builds. Capture the `from` and `polyfills` values used by subsequent builds and isolate config and plugin loading from the compatibility theme resolver's scope. This allows the loader callbacks and their captured state to be collected after compilation. ## Test plan The regression keeps the compiler alive across garbage collection, verifies that both loader callbacks can be collected, and confirms that a subsequent utility build still works. - `corepack pnpm test:integrations postcss/compiler-lifetime.test.ts` (Node.js 24.19.0) - `corepack pnpm run test` (Node.js 24.19.0) - `corepack pnpm build` (Node.js 22.23.3) The complete integration suite remains unverified locally because several framework fixtures require filesystem and network capabilities unavailable in the sandbox. Lint stopped on generated files and embedded templates; the scoped type check reports the same diagnostics on the unchanged base. --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> |
||
|
|
fa81d697fe |
Improve style invalidation performance of group-* and peer-* variants (#20513)
# For humans, by @RobinMalfait
## TL;DR
Some people ran into performance issues with the current `group-*`
variant because of the `*` inside of the selector. Take the
`group-focus-visible:flex` class for example, this generates:
```css
.group-focus-visible\:flex:is(:where(.group):focus-visible *) {
display: flex;
}
```
This slightly rewrites the selector by maintaining the same
functionality, but increasing performance because the browser has to do
fewer style recalculations.
That same class now produces:
```css
:is(:where(.group):focus-visible .group-focus-visible\\:flex) {
display: flex;
}
```
# For AI, generated by AI
This PR changes the selectors generated for `group-*` and `peer-*`
variants so browsers do less style recalculation when a group or peer
changes state (e.g. on focus or hover). Which elements match, and with
what specificity, stays the same, except for one deliberately accepted
edge case involving `@namespace` (see below).
```css
/* Before */
.group-focus\:flex:is(:where(.group):focus *) { display: flex; }
.peer-focus\:flex:is(:where(.peer):focus ~ *) { display: flex; }
/* After */
:is(:where(.group):focus .group-focus\:flex) { display: flex; }
:is(:where(.peer):focus ~ .peer-focus\:flex) { display: flex; }
```
## Why
In the old form, the subject inside `:is(…)` is `*`. When `.group`
changes state, Chromium has to recalculate styles for **every**
descendant of the group (or every following sibling of the peer), not
just the elements that use the utility. With the target itself in that
position, the browser can narrow invalidation down to elements matching
the target.
## Performance
Synthetic benchmark: toggle focus on a group/peer, flush style after
each change, and measure only a non-layout property (`outline-color`) to
isolate invalidation. Apple M5 Pro, macOS arm64.
**Elements recalculated per focus/blur** (Chromium 151,
`UpdateLayoutTree` `elementCount`, including the focused element):
| Scenario | Before | After |
| ------------------------------------------- | -----: | ------: |
| Group: 100 targets among 10,000 descendants | 10,001 | **101** |
| Peer: 20 targets among 2,000 siblings | 2,001 | **21** |
**Median time per focus/blur** (sparse: 1% of elements carry the
utility):
| Engine | Group: before → after | Peer: before → after |
| ------------ | ------------------------- | ------------------------- |
| Chromium 151 | 2.169 → **0.130 ms** (~17×) | 0.635 → **0.192 ms**
(~3.3×) |
| Firefox 153 | 0.500 → 0.350 ms | 0.650 → 0.600 ms |
| WebKit 26.5 | 0.750 → 0.750 ms | 0.450 → 0.450 ms |
**Dense case** (every element carries the utility): no meaningful
difference in any engine, because every element needs recalculation
anyway. Firefox's dense group case was ~5% slower (2.775 → 2.925 ms).
Everything else was within noise.
| Engine | Group dense: before → after | Peer dense: before → after |
| ------------ | --------------------------- |
-------------------------- |
| Chromium 151 | 4.027 → 3.971 ms | 18.095 → 18.121 ms |
| Firefox 153 | 2.775 → 2.925 ms | 43.900 → 44.025 ms |
| WebKit 26.5 | 7.550 → 7.425 ms | 35.325 → 35.100 ms |
These are micro-benchmarks of style updates, not page-load or frame-rate
numbers. The real-world gain depends on DOM size and how many elements
inside a group/peer use the variant. The biggest win is the common case:
a large group containing only a handful of `group-*` targets.
## Do the selectors behave the same?
Yes. For a group condition `G` and a target `&`:
- **Before:** matches `&` and has an ancestor matching `G`
- **After:** has an ancestor matching `G` and matches `&`
`peer-*` follows the same reasoning with `~`. Details:
- **Specificity is unchanged.** `:is()` takes the specificity of its
argument, so before was `spec(&) + spec(G)` and after is `spec(G) +
spec(&)`.
- **`&` is used, not the utility class**, so `@apply`, `@variant`,
`*:group-*`, `[&_p]:group-*`, and other variants that change the target
keep working. Complex parents such as `.foo .bar { @apply
peer-focus:flex }` keep `:is(…)` semantics during nesting: `:is(P ~
:is(.foo .bar))`.
- **`&` appears only once**, so stacked variants grow the selector
linearly. A unit test with 12 stacked variants guards against
exponential growth.
- **The selectors are also shorter:** 6 bytes of wrapping instead of 7.
- **The outer `:is(…)`** keeps compound variants such as `has-group-*`,
`not-group-*`, and `in-group-*` equivalent. For example, `has-group-*`
can still match when the group sits outside the element carrying the
utility.
**Accepted edge case:** if a stylesheet declares a default `@namespace`,
the old trailing `*` limited matches to elements in that namespace.
Inside compound variants such as `group-group-*` or `has-group-*`, the
new selector no longer does, so an SVG element (e.g. inside
`foreignObject`) can now count as the inner group. Appending `:is(*)` to
the target would restore the old behavior with no performance cost, but
it makes every selector longer for a combination (`@namespace` + mixed
namespaces + compound group variants) that is very unlikely in practice.
We can add it back if anyone runs into this.
There's one known browser quirk this PR doesn't change: Chromium doesn't
invalidate `has-group-*` when the focused group is an ancestor *outside*
the element. That happens with both the old and new selectors.
## Test plan
- [x] Updated unit test snapshots for the new selector shape
- [x] New unit test that bounds selector size with 12 stacked variants
- [x] New browser tests in `packages/tailwindcss/tests/ui.spec.ts`, run
in Chromium, Firefox, and WebKit. They cover `group-*`/`peer-*` focus
and blur, `@apply` inside a complex selector, specificity, stacked
groups in either order, and compound `group-peer-*`/`peer-group-*`. The
pre-PR selectors pass all of them too, so behavior is unchanged
- [x] `pnpm run test` and `pnpm run test:ui` pass
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
||
|
|
9798a8ab5b |
fix: correct two comment typos (#20507)
Fixes two typos in code comments (no behavior affected): - `packages/@tailwindcss-cli/src/commands/build/index.ts`: `Succesfully` -> `Successfully` - `packages/tailwindcss/src/candidate.ts`: `preceeded` -> `preceded` Co-authored-by: Dextheking1 <4175097+Dextheking1@users.noreply.github.com> |
||
|
|
722acdfebf |
Don't treat \ as an escape inside CSS comments (#20508)
<!-- 👋 Hey, thanks for your interest in contributing to Tailwind! **Please ask first before starting work on any significant new features.** It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create a discussion to first discuss any significant new features. For more info, check out the contributing guide: https://github.com/tailwindlabs/tailwindcss/blob/main/.github/CONTRIBUTING.md --> ## Summary <!-- Provide a summary of the issue and the changes you're making. How does your change solve the problem? --> The CSS parser treated `\` inside comments as an escape and skipped the character after it. Because of that, a comment ending in `\*/` was never closed, and the CSS that followed was swallowed or turned into a broken rule: ```css /* C:\temp\*/ .a { color: red } ``` Before this change the `.a` rule disappeared entirely, and `/* \*/ .a { color: red }` produced the selector `* \*/ .a`. The same thing happened to comments inside declaration values, where the comment ran on until the next `*/` it could find, pulling following declarations into the value. Per [CSS Syntax Level 3 §4.3.2](https://www.w3.org/TR/css-syntax-3/#consume-comment), a comment ends at the first `*/` and escapes aren't processed inside comments. This removes the backslash handling from both comment-scanning loops in `css-parser.ts` (top-level and inside declaration values). The existing test `/*Hello, \*\/ world!*/` keeps passing, since that input contains no `*/` before the final one. ## Test plan <!-- Explain how you tested your changes. Include the exact commands that you used to verify the change works and include screenshots/screen recordings of the update behavior in the browser if applicable. --> Added two tests to `packages/tailwindcss/src/css-parser.test.ts` (both run with Unix and Windows line endings): - a top-level comment ending in `\*/` followed by a rule - a comment ending in `\*/` inside a custom property value, followed by another declaration Both fail without the change to `css-parser.ts` and pass with it. ```sh pnpm vitest run packages/tailwindcss/src/css-parser.test.ts pnpm vitest run --project tailwindcss pnpm run lint ``` --------- Co-authored-by: Robin Malfait <robin.malfait@shopify.com> Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
86f3daf912 |
Sort breakpoint variants with decimal values numerically (#20512)
## Summary `compareBreakpoints` compared values in the same unit with `parseInt`, which drops the fractional part, so `40.25rem` and `40.5rem` were treated as equal. As a result `min-[40.5rem]:*` could be emitted before `min-[40.25rem]:*` (the same happened for `@min-*` container queries), which means the smaller breakpoint wins in the cascade. This switches the comparison to `parseFloat` so decimal values are ordered numerically; values that were already sorted correctly are unaffected. ## Test plan - Added a test to `packages/tailwindcss/src/variants.test.ts` that sorts `min-[40.25rem]`, `min-[40.5rem]`, `max-[40.25rem]` and `max-[40.5rem]`. It fails without the change (the `min-[40.5rem]` rule is emitted before `min-[40.25rem]`) and passes with it. - `vitest run src/variants.test.ts -t "decimal values"` (in `packages/tailwindcss`) - `vitest run` (in `packages/tailwindcss`): 42 files, 5009 tests passed - `prettier --check` on the changed files |
||
|
|
41d9cae8e5 |
Reject candidates with multiple modifiers (#20466)
<!-- 👋 Hey, thanks for your interest in contributing to Tailwind! **Please ask first before starting work on any significant new features.** It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create a discussion to first discuss any significant new features. For more info, check out the contributing guide: https://github.com/tailwindlabs/tailwindcss/blob/main/.github/CONTRIBUTING.md --> ## Summary <!-- Provide a summary of the issue and the changes you're making. How does your change solve the problem? --> `segment()` preserves empty top-level segments, but the candidate and variant parsers currently use the truthiness of the third segment to detect additional modifiers. As a result, inputs such as `bg-red-500/50/`, `bg-red-500/50//foo`, `group-hover/foo/:flex`, and `group-hover/foo//bar:flex` can be parsed as valid candidates even though they contain multiple slash modifier segments. This change checks the number of segments instead of the value of the third segment. Single modifiers such as `bg-red-500/50` and `group-hover/foo:flex` continue to parse normally, while all additional top-level `/` segments are rejected. ## Test plan <!-- Explain how you tested your changes. Include the exact commands that you used to verify the change works and include screenshots/screen recordings of the update behavior in the browser if applicable. --> - `pnpm exec vitest run packages/tailwindcss/src/candidate.test.ts --hideSkippedTests` - `pnpm exec vitest run packages/tailwindcss/src --hideSkippedTests` - `pnpm exec prettier --check packages/tailwindcss/src/candidate.ts packages/tailwindcss/src/candidate.test.ts` `pnpm --filter=tailwindcss lint` was also attempted, but currently fails on existing cross-package dependency and Bun type errors unrelated to this change. --------- Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
f723e834ad |
Don't warn about Angular's ::ng-deep and :host-context() when optimizing CSS (#20434)
Fixes #20433. The warning filter in `optimize.ts` already ignores `:deep()`, `:slotted()` and `:global()`. Angular's two deep selectors are the same kind of thing — non-standard pseudo-selectors that the framework's compiler resolves before the CSS reaches a browser — but they aren't covered, so every Angular component stylesheet using them prints a warning block per occurrence. ``` Found 2 warnings while optimizing generated CSS: Issue #1: │ :host ::ng-deep .some-child, :host ┆ ^-- 'ng-deep' is not recognized as a valid pseudo-element. Did you mean ':ng-deep' (pseudo-class) or is this a typo? ``` Angular strips both during view-encapsulation shimming — `::ng-deep` via `_shadowDeepSelectors = /(?:>>>)|(?:\/deep\/)|(?:::ng-deep)/g`, and `:host-context()` in the same pass — so neither ever reaches a browser. Worth noting that `/deep/` and `>>>`, Angular's two other spellings of the deep selector, already pass silently because `nonStandard.deepSelectorCombinator` is enabled. `::ng-deep` is the only one that warns, and it's the spelling the Angular docs use — so in practice every Angular codebase hits this. On the workspace where I ran into it (7 Angular apps), a production build printed 425 `ng-deep` warnings and 2 `host-context` ones. ## Test plan There's no automated coverage here because the warning path is behind `process.env.NODE_ENV !== 'test'`, so a spy sees nothing under Vitest regardless of the filter — the same reason #20277 shipped without one. Instead I ran the file before and after the change against Lightning CSS 1.33.0 directly, counting emitted warning blocks: | Input | Before | After | | --- | --- | --- | | `:host ::ng-deep .a, :host ::ng-deep .b { … }` | 1 | 0 | | `:host-context(.dark) .a { … }` | 1 | 0 | | `:deep(.a) { … }` | 0 | 0 | | `.a::totally-not-real { … }` — genuine typo | 1 | **1** | Generated CSS is byte-identical before and after; only the warning is suppressed. Genuine unknown pseudo-selectors still warn, so the typo hint the message exists for is preserved. Happy to restructure this if you'd prefer the predicate extracted so it can be unit-tested, or to split `ng-deep` and `host-context` into their own block rather than extending the existing regex. A minimal reproduction of the original issue is at https://gist.github.com/weilinzung/ace42ceb95c2f47b6747cc1f34f162bd. --------- Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
9f451eead8 |
Cold start performance improvements (#20427)
<!-- 👋 Hey, thanks for your interest in contributing to Tailwind! **Please ask first before starting work on any significant new features.** It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create a discussion to first discuss any significant new features. For more info, check out the contributing guide: https://github.com/tailwindlabs/tailwindcss/blob/main/.github/CONTRIBUTING.md --> ## Summary Hi guys, thanks for you great work! I work on performance improvements on https://github.com/schoero/eslint-plugin-better-tailwindcss project. Part of issues can be fixed on the tailwind side only. This is a first fix, I have a bigger one in mind, it would require a small additional public API method - out of scope of this PR. Please let me know what you think. ## Finding `getVariantOrder()` re-sorts all parsed variants with the (expensive) variant comparator on every call, and it is called by every compileCandidates() invocation — per build pass, per @apply substitution, and hundreds of times during candidate canonicalization via the variant signature caches. Since parsedVariants is append-only, the computed order only changes when a new variant is parsed, so we can cache the result and invalidate on parsedVariants.size. This makes cold canonicalization (IntelliSense, lint plugins) faster and removes repeated sorting from @apply substitution and incremental rebuilds. ## Test plan Tested at https://github.com/smnbbrv/better-tailwindcss-bench . The relevant part is the `epbt-now / tw-patched` **plugin cost** (ms, cold run net of parse baseline) | codebase | epbt-now / tw-now | epbt-patched / tw-now | epbt-now / tw-patched | epbt-patched / tw-patched | | ---------- | ----------------: | --------------------: | --------------------: | ------------------------: | | mixed | 6292 | 3965 (-37%) | 5395 (-14%) | 3595 (-43%) | | repetitive | 5279 | 2425 (-54%) | 4819 (-9%) | 2124 (-60%) | | unique | 6096 | 5458 (-10%) | 5507 (-10%) | 5295 (-13%) | |
||
|
|
90f8ff41c8 |
Don't space out and/or/not inside function calls in supports-[…] variants (#20420)
## Summary The `supports-[…]` variant works around a Chrome bug where `@supports (a)or(b)` is invalid by spacing out the `and`, `or`, and `not` keywords. However, the replacement is applied to the entire value, including the inside of function calls, where these words can be part of a selector. For example, `supports-[selector(a:not(.foo))]:flex` generates: ```css @supports selector(a: not (.foo)) ``` The selector `a: not (.foo)` is unparsable, so a condition that is true in every browser silently becomes false and the utility never applies. The same happens to class names like `.and` or `.or` inside `selector(…)`. This PR only spaces out the keywords at the condition level: parens preceded by an identifier (other than the keywords themselves) start a function call, and everything inside is left as-is. The Chrome workaround still applies to the condition itself, e.g. `supports-[(display:grid)or(display:flex)]` still becomes `@supports (display: grid) or (display: flex)`. ## Test plan - Added a test covering `selector(a:not(.foo))`, class names `.and`/`.or` inside `selector(…)`, the Chrome `(a)or(b)` workaround, and a top-level `not(…)` condition. - `pnpm vitest run packages/tailwindcss/src/variants.test.ts` — 102 passed. --------- Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
7a7f386648 |
Don't emit utilities that resolve a theme value when an unsupported modifier is used (#20419)
## Summary Modifiers on functional utilities that resolve a named theme value are silently dropped instead of invalidating the candidate. For example, with the default theme: - `rounded-sm/[5]` emits the same CSS as `rounded-sm` (the `[5]` is ignored) - `shadow-sm/foo`, `inset-shadow-sm/foo`, `text-shadow/foo`, and `drop-shadow/foo` emit the full shadow CSS with the invalid `foo` modifier ignored This is inconsistent with how every sibling code path behaves: `rounded/foo`, `rounded-[4px]/foo`, `rounded-sm/5`, and `drop-shadow-xl/foo` all correctly produce no output, because those paths check `candidate.modifier`. This PR adds the missing guards: - In the generic `functionalUtility` handler, a candidate whose named value resolves from the theme now rejects modifiers (except fractions like `w-1/2`, where the modifier is part of the resolved value). - The `shadow`, `inset-shadow`, and `text-shadow` utilities now apply the same `if (candidate.modifier && !alpha) return` guard in their default-value, arbitrary-value, and named-size branches that `drop-shadow` already applies, and `drop-shadow` gets it in its default-value branch too. Existing tests asserting candidates like `drop-shadow/foo` produce no output were passing for the wrong reason: they run without a theme, so the theme lookup fails before the modifier is ever considered. The new tests provide a theme so the invalid modifier is what invalidates the candidate. ## Test plan - Added assertions to the `rounded`, `filter`, `shadow`, `inset-shadow`, and `text-shadow` tests that compile candidates with invalid modifiers against a theme that defines the relevant values, and expect no output. All of them fail without the fix. - `pnpm vitest run packages/tailwindcss/src/utilities.test.ts` — 398 passed. --------- Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
021b7fe6f2 |
Canonicalization: prevent inlining CSS-wide keywords (#20417)
This PR fixes an issue where canonicalization suggestions in
intellisense result in 'weird' suggestions.
```
The class text-foreground/60 can be written as text-default-soft-hover
```
If we look at the CSS provided by the issue, this doesn't immediately
make sense:
```css
@theme {
--color-foreground: var(--foreground);
--color-default-soft-hover: color-mix(in oklab, var(--default) 60%, transparent);
}
:root {
--foreground: oklch(0.2103 0.0059 285.89); /* near-black */
--default: oklch(94% 0.001 286.375); /* light gray */
}
```
But it turns out that when you use Uniwind (React Native) with HeroUI,
that the setup looks more like this:
```css
@import 'tailwindcss';
@theme {
--foreground: unset;
--default: unset;
}
@theme inline {
--color-foreground: var(--foreground);
--color-default-soft-hover: color-mix(in oklab, var(--default) 60%, transparent);
}
```
During the canonicalization step, we inline all the `@theme` values, the
reason for this is that `text-[#fff]` can be turned into `text-white`
even though they look slightly different:
```css
.text-\[\#fff\] {
color: #fff;
}
.text-white {
color: var(--color-white, #fff);
}
```
But when we inline them, it looks like this:
```css
.text-\[\#fff\] {
color: #fff;
}
.text-white {
color: #fff;
}
```
Internally, we use signatures to make sure that they are safe to be
subtituted with eachother. In this case, the signatures will look like
this:
```css
.x {
color: #fff;
}
.x {
color: #fff;
}
```
If we now look at the signatures of the original issue, you would see:
```css
/* text-foreground/60 */
.x {
color: color-mix(in_oklab,unset_60%,transparent);
}
/* text-default-soft-hover */
.x {
color: color-mix(in_oklab,unset_60%,transparent);
}
```
That's because the `@theme` variables were inlined, resulting in the
exact same signature, thus we consider them the same.
This PR makes sure to never inline [CSS-wide
keywords](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/Data_types#css-wide_keywords)
(such as `unset`) and therefore keeping the CSS variable reference:
```css
/* text-foreground/60 */
.x {
color: color-mix(in_oklab,var(--foreground)_60%,transparent);
}
/* text-default-soft-hover */
.x {
color: color-mix(in_oklab,var(--default)_60%,transparent);
}
```
Fixes:
https://github.com/tailwindlabs/tailwindcss-intellisense/issues/1610
## Test plan
1. Existing tests pass
2. Added a regression test
Checked manually in the regression repo
Before:
<img width="1358" height="421" alt="image"
src="https://github.com/user-attachments/assets/8ab3de97-17e4-4e11-b335-bb37218ff2ee"
/>
After:
<img width="1177" height="247" alt="image"
src="https://github.com/user-attachments/assets/cbbfcf04-3ed3-4fa7-a3eb-ef607239f4ad"
/>
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
|
||
|
|
f7f58f0806 |
Move debug logs in .tailwindcss folder (#20416)
Instead of writing debug logs (triggered by using `DEBUG=*`) in the root of the project as `tailwindcss-<pid>.log`, we will write them to `.tailwindcss/logs/scanner-<timestamp>-<pid>.log` instead. The reasoning for this is that we won't pollute the root of the project. Another reason is that if you don't ignore `.log` files via `.gitignore`, it could be that you end up in a loop if you use `DEBUG=* vite` because a new `.log` file might trigger a new build. We noticed this while looking at https://github.com/tailwindlabs/tailwindcss/discussions/20382. The `.tailwindcss` folder will come with a `.gitignore` file that ignores everything (`*`). ## Test plan 1. Nothing really changed here, all tests should pass Testing this in a local project, it looks like this: <img width="483" height="165" alt="file-35bfc43606c556f2380a161c7595d103" src="https://github.com/user-attachments/assets/629519c8-8f2b-46ee-8046-9ba3749f319a" /> |
||
|
|
de9e71c599 | fix referenced link | ||
|
|
00ef99df3d |
Do not force full page reloads when using @tailwindcss/vite (#20414)
This PR removes all of the custom HMR handling we had in the `@tailwindcss/vite` plugin. When Vite 7.1 was introduced, Vite stopped performing a full page reload for unknown files and instead started performing normal `hmr` updates. This resulted in this issue: https://github.com/tailwindlabs/tailwindcss/issues/19637 At the time, it felt like something we could easily re-add: if a file is not covered by Vite, we can perform a `full-reload`. This meant that a `.php` file would trigger a full page reload as expected. The reason the `.php` file triggered Vite in the first place is because those files were scanned by us (`@tailwindcss/vite`) so it made sense. However, this then resulted in a plethora of issues, and it feels a bit like a game of whac-a-mole. - https://github.com/tailwindlabs/tailwindcss/issues/19744 - https://github.com/tailwindlabs/tailwindcss/issues/19903 - https://github.com/tailwindlabs/tailwindcss/issues/20320 - https://github.com/tailwindlabs/tailwindcss/issues/20378 - https://github.com/tailwindlabs/tailwindcss/issues/20411 Fixes: #19744 Fixes: #19903 Fixes: #20320 Fixes: #20378 Fixes: #20411 We kept updating the logic by safelisting certain extensions, checking different servers and/or environments, handling the fact that `server` in the callback could be absent in `experimental.bundledDev` mode, etc. etc. Now, when investigating the last issue (https://github.com/tailwindlabs/tailwindcss/issues/20411), I can trigger full reloads by changing `.json`, `.yaml` or `.svg` files. This makes sense since they aren't handled by default. So thinking about this more, I think it's just not Tailwind's responsibility to tell Vite to reload the browser or not. Yes, we use the `addWatchFile` API, so files are being watched because of us. However, our only goal is to update the `.css` file (and HMR that). This means that we can just drop all the custom HMR handling we have in `@tailwindcss/vite`. This also means that https://github.com/tailwindlabs/tailwindcss/issues/19637 would regress and won't trigger full page reloads. But this can be easily handled by a plugin responsible for this behavior: - https://github.com/ElMassimo/vite-plugin-full-reload ## Test plan 1. All tests pass 2. Manually tested and changing unknown files don't result in a full page reload |
||
|
|
b9286a7346 |
fix: Drop invalid UTF-8 scanner candidates (#20389)
## Summary Replace the three unchecked scanner conversions in `crates/oxide/src/scanner/mod.rs` with checked conversions that omit only extracted slices that are not valid UTF-8. Apply the check in the shared `extract` pipeline so initial scans, incremental `scan_content` calls, and CSS-variable extraction cannot insert invalid strings into scanner state, and apply the same policy to both branches of `get_candidates_with_positions` while preserving byte offsets and the legacy `-[]` restoration. Keep the extractor's byte-oriented CSS identifier classification unchanged: accepting non-ASCII bytes during extraction is useful for valid multibyte code points, while the conversion boundary is the authoritative place to enforce the `String` contract. The scanner currently converts extracted byte slices with unchecked UTF-8 constructors at the shared extraction boundary and both candidate-with-position branches. A source file containing a stray continuation byte can therefore produce an invalid `String`, violating Rust's string invariant and allowing corrupted candidates to persist in a long-lived scanner. The thread provides a deterministic reproduction using invalid bytes inside an arbitrary value, so the problem no longer depends on reproducing the originally reported Turbopack race. Valid candidates found alongside malformed byte sequences must continue to be returned normally. Fixes #20368 ## Test plan Not applicable to this change. AI was used for assistance. --------- Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
84bea42b6c |
Visualize scanner related tests (#20412)
This PR improves the scanner related tests a bit. Right now all the
scanner tests (a lot of them) are somewhat hard to reason about and to
figure out whether these are actually correct or not.
With this PR, the existing are extended with a visualization of the file
system tree, but with indicators to know whether or not a file was
scanned or not. If a `.gitignore` is present, it's content is also shown
to make it easier to see why some files are included or not included.
One of the outputs look like this:
```
.
├── ✗ .gitignore
│ src/ignored-by-gitignore.html
└── ✓ src
├── ✗ ignore-by-extension.bin
├── ✓ ignored-by-gitignore.html
├── ✗ ignored-by-source-not.html
├── ✓ keep-me.html
└── ✓ new-file.html
```
I'm sure we can cleanup a lot of these tests, simplify, deduplicate, but
I didn't want to do that as part of this PR. This PR is purely adding
this visualization.
This uses the [insta.rs](https://insta.rs) library for (inline) snapshot
tests. If at some point the snapshots change, then you get a nice UI:
<img width="958" height="670" alt="image"
src="https://github.com/user-attachments/assets/652cf48f-e1b1-4fe5-a42a-29c5a888063a"
/>
## Test plan
1. All tests should pass [ci-all]
2. Nothing in the code itself changed, so nothing should break
---
<sub>Stack created with <a
href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>
|
||
|
|
606438c6c3 |
rebase ignore crate from 0.4.24 to 0.4.33 (#20409)
This PR updates the vendored `ignore/` crate to make use of the upstream improvements. We can't fully use the native `ignore` crate yet because of the missing functionality that we added ourselves. Our own changes are still marked as `CHANGED:` ## Test plan 1. All tests should still pass [ci-all] --- <sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub> |
||
|
|
8ac18c7e72 |
test: fix 'with with' typo in css parser tests (#20410)
<!-- 👋 Hey, thanks for your interest in contributing to Tailwind! **Please ask first before starting work on any significant new features.** It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create a discussion to first discuss any significant new features. For more info, check out the contributing guide: https://github.com/tailwindlabs/tailwindcss/blob/main/.github/CONTRIBUTING.md --> ## Summary <!-- Provide a summary of the issue and the changes you're making. How does your change solve the problem? --> ## Test plan <!-- Explain how you tested your changes. Include the exact commands that you used to verify the change works and include screenshots/screen recordings of the update behavior in the browser if applicable. --> |
||
|
|
b86a6e0a0d |
Fix slow Vite rebuilds in projects with large gitignored directories (#20408)
Preface: For full transparency, I used AI (Claude) to help dig into this issue we're having and write some of the explanation below. Our local Laravel application (with Docker) takes between 2-6s seconds (re)building `app.css` after each Blade file update. After checking with Claude, there seems to be some potential unnecessary traversing of big (gitignored) directories, specifically `vendor` and `storage`. As far as I understand it, two scans happen in tailwindcss: - a first scan, the content scan. This one reads the project files (auto-detect). It respects .gitignore, so it correctly skips vendor/ and storage/. - a second scan, the glob resolution (resolve_globs() in the oxide crate). It builds watch patterns that the Vite plugin registers, so a file save can trigger a CSS rebuild. It walks the project again, but this walk does not respect .gitignore. It only skips a hardcoded list of directory names from `ignored-content-dirs.txt` (node_modules, .git, venv, ...). vendor/ and storage/ are not on that list, so it descends into them and stats every file. These directories can never produce a watch pattern, because the content scan never visited them. That work is perhaps wasted? Maybe why this went unnoticed: on a native filesystem a stat takes about 1µs, so 57k of them is around 0.06s. A Docker bind mount multiplies that by roughly 100. And the big directory in a typical JS project is `node_modules`, which the name list already catches; `vendor/` is the PHP ecosystem's `node_modules`, and it is not on that list. (#19616 / #19632 fixed the same problem for `scanner.files`; the CLI never reads `scanner.globs`, so it was never affected.) The fix: the second walk now skips any directory the scan never visited, the same pruning the first walk (line 73) already does. Measured on our local project: `get_globs()` after `scan()` went from 9.9s to somewhere between 0.2 and 1.0s across runs, with identical output (35 globs). A template save now reloads in about 0.3s instead of 4. ## Test plan - `cargo test` in `crates/oxide`: 66 tests pass, including the glob assertions for nested and gitignored directories in `tests/scanner.rs`. - Compared the sorted `get_globs()` output before and after on the project above: identical. I've also set up a repo that reproduces the issue in a fresh Laravel app: https://github.com/marickvantuil/tailwind-scan-reproduce The results: | Environment | vendor/ | scan | get_globs | syscalls under vendor/ | | --- | --- | --- | --- | --- | | GitHub Actions (native FS) | present | 5.0 ms | 48.8 ms | 11,410 | | GitHub Actions (native FS) | absent | 4.5 ms | 0.9 ms | n/a | | macOS, Docker bind mount | present | 15.8 ms | 599.4 ms | 11,410 | | macOS, Docker bind mount | absent | 16.5 ms | 6.5 ms | n/a | --------- Co-authored-by: Marick van Tuil <marick@dolphiq.nl> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
16e94cbf7f |
Make createCompatConfig theme mappings safe to spread when a namespace returns a string (#20399)
When building the legacy config compat layer, namespace mappings like
`fontSize` → `text`, `boxShadow` → `shadow`, `animation` → `animate`,
etc. spread the result of `theme(namespace, {})` directly:
```ts
...(theme('text', {}) ?? {})
```
Some of these namespaces can return a **string** (e.g. `theme('text',
{})` → `'1rem'`). Spreading a string produces char-indexed keys (`{ '0':
'1', '1': 'r', ... }`) instead of a `{ DEFAULT: ... }` entry, silently
corrupting the compat config output.
This PR adds a small `spreadTheme` helper that normalizes the return
value before spreading:
- `string` → `{ DEFAULT: value }`
- plain object → `{ ...value }`
- anything else → `{}`
and updates all namespace mappings to use it. Includes unit tests for
the helper plus integration tests for the affected namespaces and the
string-return regression cases.
---------
Co-authored-by: Robin Malfait <malfait.robin@gmail.com>
|
||
|
|
46df7ee2fc |
Don't scan ignored folders using .gitignore safelist setup (#20397)
This PR fixes an issue where a folder containing a `.gitignore` that uses a whitelist setup results in too many folders being scanned: ```gitignore # .gitignore /* !/app ``` We want to make sure that we respect the `.gitignore` file, but we also need to make sure that `@source` directives 'win' from `.gitignore` files. For example: ```css @import 'tailwindcss'; @source "./node_modules/my-package/*.js"; ``` In this case, `node_modules` is likely ignored via `.gitignore`, but you _do_ want to include the files from the `my-package` folder, essentially overriding the `.gitignore` rules. To do this, we internally mark this folder as an `External` folder such that it gets read, because that's what we want. The current bug has a pattern like `/*` and then safelist/whitelist patterns to include certain folders. The problem with the `/*` pattern is that this convert the _current_ folder to an `External` folder. This is wrong. The current folder cannot be ignored by the current `.gitignore` file itself. You can ignore files and folders _inside_ the current folder, but not the folder itself. The current folder can only be ignored by parent `.gitignore` rules. Originally discussed in: https://github.com/tailwindlabs/tailwindcss/discussions/20382 Fixes: #20385 ## Test plan 1. Added regression tests 2. Added integration tests Manually tested, and logging the scanned files does result in some interesting results: <details> <summary>Before</summary> ``` Reading ".git/COMMIT_EDITMSG" Reading ".git/HEAD" Reading ".git/MERGE_RR" Reading ".git/config" Reading ".git/description" Reading ".git/hooks/applypatch-msg.sample" Reading ".git/hooks/commit-msg.sample" Reading ".git/hooks/fsmonitor-watchman.sample" Reading ".git/hooks/post-update.sample" Reading ".git/hooks/pre-applypatch.sample" Reading ".git/hooks/pre-commit.sample" Reading ".git/hooks/pre-merge-commit.sample" Reading ".git/hooks/pre-push.sample" Reading ".git/hooks/pre-rebase.sample" Reading ".git/hooks/pre-receive.sample" Reading ".git/hooks/prepare-commit-msg.sample" Reading ".git/hooks/push-to-checkout.sample" Reading ".git/hooks/sendemail-validate.sample" Reading ".git/hooks/update.sample" Reading ".git/index" Reading ".git/info/exclude" Reading ".git/logs/HEAD" Reading ".git/logs/refs/heads/main" Reading ".git/objects/02/2fe3aa1b28300c0146acdff4eb3240cd2a861b" Reading ".git/objects/17/45509b3ec34de9d8ddd6708c9d73f191c63c48" Reading ".git/objects/1e/d83f044a80cfec0843a0d68fa859c101e4e02f" Reading ".git/objects/60/76888f3ae7ecd2712c236933314e1c420e52f2" Reading ".git/objects/76/e5d55dc7d51e47bff78b27e39a13110e17c072" Reading ".git/objects/89/7b4529b9a3db489cc00e2cff4bbd1a2f09fb50" Reading ".git/objects/8c/781ce3374b53455c284bef51bffbee5ca88969" Reading ".git/objects/b2/ceaa157eef0b2a8d0231a1396b17684da71de7" Reading ".git/objects/da/7ef6439d0779bae07668b42d77dcbce2f84111" Reading ".git/refs/heads/main" Reading ".gitattributes" Reading ".gitignore" Reading "app/index.html" Reading "build/index.html" Reading "node_modules/.modules.yaml" Reading "node_modules/.package-map.json" Reading "node_modules/.pnpm-workspace-state-v1.json" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/LICENSE" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/README.md" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/package.json" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/src/strings.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/LICENSE" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/README.md" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/package.json" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/binary-search.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/by-source.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/resolve.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/sort.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/src/types.ts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sort.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sort.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/types.d.cts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/types.d.mts" Reading "node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/LICENSE" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/README.md" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/package.json" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/src/set-array.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/src/types.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/types.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/types.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/LICENSE" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/README.md" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/dist/remapping.mjs" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/dist/remapping.mjs.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/dist/remapping.umd.js" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/dist/remapping.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/package.json" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/src/build-source-map-tree.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/src/remapping.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/src/source-map-tree.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/src/source-map.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/src/types.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/remapping.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/remapping.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/remapping.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/remapping.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map-tree.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map-tree.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map-tree.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map-tree.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/source-map.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/types.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/types.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/types.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping/types/types.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/LICENSE" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/README.md" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/package.json" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/binary-search.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/by-source.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/resolve.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/sort.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/src/types.ts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sort.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sort.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/types.d.cts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/types.d.mts" Reading "node_modules/.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/LICENSE" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/README.md" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts" Reading "node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/package.json" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/LICENSE" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/README.md" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/resolve-uri/package.json" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/LICENSE" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/README.md" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/package.json" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/src/strings.ts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts" Reading "node_modules/.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map" Reading "node_modules/.pnpm/@parcel+watcher-darwin-arm64@2.6.0/node_modules/@parcel/watcher-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/@parcel+watcher-darwin-arm64@2.6.0/node_modules/@parcel/watcher-darwin-arm64/README.md" Reading "node_modules/.pnpm/@parcel+watcher-darwin-arm64@2.6.0/node_modules/@parcel/watcher-darwin-arm64/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher-darwin-arm64/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher-darwin-arm64/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/LICENSE" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/binding.gyp" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/index.d.ts" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/index.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/index.js.flow" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/scripts/build-from-source.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Backend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Backend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Debounce.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Debounce.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/DirTree.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/DirTree.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Event.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Glob.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Glob.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/PromiseRunner.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Signal.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Watcher.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/Watcher.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/binding.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/kqueue/KqueueBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/kqueue/KqueueBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/linux/InotifyBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/linux/InotifyBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/macos/FSEventsBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/macos/FSEventsBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/shared/BruteForceBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/shared/BruteForceBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/unix/fts.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/unix/legacy.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/wasm/WasmBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/wasm/WasmBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/wasm/include.h" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/watchman/BSER.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/watchman/BSER.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/watchman/IPC.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/watchman/WatchmanBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/watchman/WatchmanBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/windows/WindowsBackend.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/windows/WindowsBackend.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/windows/win_utils.cc" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/src/windows/win_utils.hh" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/@parcel/watcher/wrapper.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/LICENSE" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/index.d.ts" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/lib/detect-libc.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/lib/elf.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/lib/filesystem.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/lib/process.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/detect-libc/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/is-glob/LICENSE" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/is-glob/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/is-glob/index.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/is-glob/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/LICENSE.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/common.gypi" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/except.gypi" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/index.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/napi-inl.deprecated.h" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/napi-inl.h" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/napi.h" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/node_addon_api.gyp" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/node_api.gyp" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/noexcept.gypi" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/nothing.c" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/package-support.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/tools/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/tools/check-napi.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/tools/clang-format.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/tools/conversion.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/node-addon-api/tools/eslint-format.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/LICENSE" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/README.md" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/index.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/lib/constants.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/lib/parse.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/lib/picomatch.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/lib/scan.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/lib/utils.js" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/package.json" Reading "node_modules/.pnpm/@parcel+watcher@2.6.0/node_modules/picomatch/posix.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/LICENSE" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/README.md" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/clone.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/graceful-fs.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/legacy-streams.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/package.json" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/graceful-fs/polyfills.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/LICENSE" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/README.md" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/AsyncParallelBailHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/AsyncParallelHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/AsyncSeriesBailHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/AsyncSeriesHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/AsyncSeriesLoopHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/Hook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/HookCodeFactory.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/HookMap.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/MultiHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/SyncBailHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/SyncHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/SyncLoopHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/SyncWaterfallHook.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/index.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/lib/util-browser.js" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/package.json" Reading "node_modules/.pnpm/enhanced-resolve@5.24.5/node_modules/tapable/tapable.d.ts" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/LICENSE" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/README.md" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/clone.js" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/graceful-fs.js" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/legacy-streams.js" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/package.json" Reading "node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/polyfills.js" Reading "node_modules/.pnpm/is-extglob@2.1.1/node_modules/is-extglob/LICENSE" Reading "node_modules/.pnpm/is-extglob@2.1.1/node_modules/is-extglob/README.md" Reading "node_modules/.pnpm/is-extglob@2.1.1/node_modules/is-extglob/index.js" Reading "node_modules/.pnpm/is-extglob@2.1.1/node_modules/is-extglob/package.json" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-extglob/LICENSE" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-extglob/README.md" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-extglob/index.js" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-extglob/package.json" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-glob/LICENSE" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-glob/README.md" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-glob/index.js" Reading "node_modules/.pnpm/is-glob@4.0.3/node_modules/is-glob/package.json" Reading "node_modules/.pnpm/lightningcss-darwin-arm64@1.33.0/node_modules/lightningcss-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/lightningcss-darwin-arm64@1.33.0/node_modules/lightningcss-darwin-arm64/README.md" Reading "node_modules/.pnpm/lightningcss-darwin-arm64@1.33.0/node_modules/lightningcss-darwin-arm64/package.json" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/LICENSE" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/README.md" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/index.d.ts" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/lib/detect-libc.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/lib/elf.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/lib/filesystem.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/lib/process.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/detect-libc/package.json" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss-darwin-arm64/README.md" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss-darwin-arm64/package.json" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/LICENSE" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/README.md" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/ast.d.ts" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/ast.js.flow" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/browserslistToTargets.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/composeVisitors.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/flags.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/index.d.ts" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/index.js" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/index.js.flow" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/index.mjs" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/targets.d.ts" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/node/targets.js.flow" Reading "node_modules/.pnpm/lightningcss@1.33.0/node_modules/lightningcss/package.json" Reading "node_modules/.pnpm/lock.yaml" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/LICENSE" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/README.md" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/package.json" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/src/strings.ts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/magic-string/LICENSE" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/magic-string/README.md" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/magic-string/dist/index.d.mts" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/magic-string/dist/index.mjs" Reading "node_modules/.pnpm/magic-string@1.1.0/node_modules/magic-string/package.json" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/LICENSE" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/README.md" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/package.json" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/src/set-array.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/src/types.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/types.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/types.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/LICENSE" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/README.md" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/dist/remapping.mjs" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/dist/remapping.mjs.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/dist/remapping.umd.js" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/dist/remapping.umd.js.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/package.json" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/src/build-source-map-tree.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/src/remapping.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/src/source-map-tree.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/src/source-map.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/src/types.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/remapping.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/remapping.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/remapping.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/remapping.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map-tree.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map-tree.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map-tree.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map-tree.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/source-map.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/types.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/types.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/types.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/remapping/types/types.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/LICENSE" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/README.md" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/resolve-uri/package.json" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/LICENSE" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/README.md" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/package.json" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/src/strings.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/LICENSE" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/README.md" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/package.json" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/binary-search.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/by-source.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/resolve.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/sort.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/src/types.ts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sort.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sort.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/types.d.cts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/types.d.mts" Reading "node_modules/.pnpm/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map" Reading "node_modules/.pnpm/node_modules/@parcel/watcher-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/node_modules/@parcel/watcher-darwin-arm64/README.md" Reading "node_modules/.pnpm/node_modules/@parcel/watcher-darwin-arm64/package.json" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/LICENSE" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/README.md" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/binding.gyp" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/index.d.ts" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/index.js" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/index.js.flow" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/package.json" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/scripts/build-from-source.js" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Backend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Backend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Debounce.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Debounce.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/DirTree.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/DirTree.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Event.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Glob.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Glob.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/PromiseRunner.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Signal.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Watcher.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/Watcher.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/binding.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/kqueue/KqueueBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/kqueue/KqueueBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/linux/InotifyBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/linux/InotifyBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/macos/FSEventsBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/macos/FSEventsBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/shared/BruteForceBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/shared/BruteForceBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/unix/fts.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/unix/legacy.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/wasm/WasmBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/wasm/WasmBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/wasm/include.h" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/watchman/BSER.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/watchman/BSER.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/watchman/IPC.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/watchman/WatchmanBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/watchman/WatchmanBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/windows/WindowsBackend.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/windows/WindowsBackend.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/windows/win_utils.cc" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/src/windows/win_utils.hh" Reading "node_modules/.pnpm/node_modules/@parcel/watcher/wrapper.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/LICENSE" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/esm-cache.loader.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/esm-cache.loader.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/index.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/index.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/index.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/require-cache.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/dist/require-cache.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/node/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-darwin-arm64/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-darwin-arm64/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/LICENSE" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.cjs.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.cjs.min.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.cjs.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.esm-bundler.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.min.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.min.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/dist/emnapi-core.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/LICENSE" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.cjs.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.cjs.min.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.cjs.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.esm-bundler.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.iife.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.iife.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.min.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.min.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/dist/emnapi.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/LICENSE" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.cjs.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.cjs.min.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.cjs.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.esm-bundler.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.min.d.mts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.min.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/dist/wasi-threads.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/dist/emnapi-plugins.cjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/dist/emnapi-plugins.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/dist/fs-proxy.cjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/dist/fs.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/fs-proxy.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/runtime.cjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/runtime.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/tsdoc-metadata.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/wasm-util.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/wasm-util.esm-bundler.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/wasm-util.esm.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/wasm-util.esm.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/wasm-util.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/dist/wasm-util.min.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/asyncify.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/jspi.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/load.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/memory.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/error.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/fd.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/fs.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/path.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/preview1.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/rights.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/types.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/wasi/util.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/cjs/webassembly.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/asyncify.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/index.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/jspi.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/load.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/memory.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/error.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/fd.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/fs.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/index.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/path.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/preview1.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/rights.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/types.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/wasi/util.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/lib/mjs/webassembly.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/CopyrightNotice.txt" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/LICENSE.txt" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/README.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/SECURITY.md" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/modules/index.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/modules/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/modules/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/tslib.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/tslib.es6.html" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/tslib.es6.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/tslib.es6.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/tslib.html" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib/tslib.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/package.json" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/tailwindcss-oxide.wasi-browser.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/tailwindcss-oxide.wasi.cjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/wasi-worker-browser.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide-wasm32-wasi/wasi-worker.mjs" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide/LICENSE" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide/index.d.ts" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide/index.js" Reading "node_modules/.pnpm/node_modules/@tailwindcss/oxide/package.json" Reading "node_modules/.pnpm/node_modules/detect-libc/LICENSE" Reading "node_modules/.pnpm/node_modules/detect-libc/README.md" Reading "node_modules/.pnpm/node_modules/detect-libc/index.d.ts" Reading "node_modules/.pnpm/node_modules/detect-libc/lib/detect-libc.js" Reading "node_modules/.pnpm/node_modules/detect-libc/lib/elf.js" Reading "node_modules/.pnpm/node_modules/detect-libc/lib/filesystem.js" Reading "node_modules/.pnpm/node_modules/detect-libc/lib/process.js" Reading "node_modules/.pnpm/node_modules/detect-libc/package.json" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/LICENSE" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/README.md" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/AliasFieldPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/AliasPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/AliasUtils.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/AppendPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/CloneBasenamePlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ConditionalPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/DescriptionFileUtils.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/DirectoryExistsPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ExportsFieldPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/FileExistsPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ImportsFieldPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/JoinRequestPartPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/JoinRequestPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/LogInfoPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/MainFieldPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ModulesInHierachicDirectoriesPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ModulesInHierarchicalDirectoriesPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ModulesInRootPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ModulesUtils.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/NextPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ParsePlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/PnpPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/Resolver.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ResolverFactory.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/RestrictionsPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/ResultPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/RootsPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/SelfReferencePlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/SymlinkPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/SyncAsyncFileSystemDecorator.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/TryNextPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/TsconfigPathsPlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/UseFilePlugin.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/createInnerContext.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/forEachBail.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/getInnerRequest.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/getPaths.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/index.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/entrypoints.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/fileURLToPath.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/fs.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/graceful-fs-browser.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/identifier.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/memoize.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/module-browser.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/path-browser.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/path.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/process-browser.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/strip-json-comments.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/lib/util/url-browser.js" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/package.json" Reading "node_modules/.pnpm/node_modules/enhanced-resolve/types.d.ts" Reading "node_modules/.pnpm/node_modules/graceful-fs/LICENSE" Reading "node_modules/.pnpm/node_modules/graceful-fs/README.md" Reading "node_modules/.pnpm/node_modules/graceful-fs/clone.js" Reading "node_modules/.pnpm/node_modules/graceful-fs/graceful-fs.js" Reading "node_modules/.pnpm/node_modules/graceful-fs/legacy-streams.js" Reading "node_modules/.pnpm/node_modules/graceful-fs/package.json" Reading "node_modules/.pnpm/node_modules/graceful-fs/polyfills.js" Reading "node_modules/.pnpm/node_modules/is-extglob/LICENSE" Reading "node_modules/.pnpm/node_modules/is-extglob/README.md" Reading "node_modules/.pnpm/node_modules/is-extglob/index.js" Reading "node_modules/.pnpm/node_modules/is-extglob/package.json" Reading "node_modules/.pnpm/node_modules/is-glob/LICENSE" Reading "node_modules/.pnpm/node_modules/is-glob/README.md" Reading "node_modules/.pnpm/node_modules/is-glob/index.js" Reading "node_modules/.pnpm/node_modules/is-glob/package.json" Reading "node_modules/.pnpm/node_modules/jiti/LICENSE" Reading "node_modules/.pnpm/node_modules/jiti/README.md" Reading "node_modules/.pnpm/node_modules/jiti/dist/babel.cjs" Reading "node_modules/.pnpm/node_modules/jiti/dist/jiti.cjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti-cli.mjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti-hooks.mjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti-native.mjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti-register.d.mts" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti-register.mjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti-static.mjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti.cjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti.d.cts" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti.d.mts" Reading "node_modules/.pnpm/node_modules/jiti/lib/jiti.mjs" Reading "node_modules/.pnpm/node_modules/jiti/lib/types.d.ts" Reading "node_modules/.pnpm/node_modules/jiti/package.json" Reading "node_modules/.pnpm/node_modules/lightningcss-darwin-arm64/LICENSE" Reading "node_modules/.pnpm/node_modules/lightningcss-darwin-arm64/README.md" Reading "node_modules/.pnpm/node_modules/lightningcss-darwin-arm64/package.json" Reading "node_modules/.pnpm/node_modules/lightningcss/LICENSE" Reading "node_modules/.pnpm/node_modules/lightningcss/README.md" Reading "node_modules/.pnpm/node_modules/lightningcss/node/ast.d.ts" Reading "node_modules/.pnpm/node_modules/lightningcss/node/ast.js.flow" Reading "node_modules/.pnpm/node_modules/lightningcss/node/browserslistToTargets.js" Reading "node_modules/.pnpm/node_modules/lightningcss/node/composeVisitors.js" Reading "node_modules/.pnpm/node_modules/lightningcss/node/flags.js" Reading "node_modules/.pnpm/node_modules/lightningcss/node/index.d.ts" Reading "node_modules/.pnpm/node_modules/lightningcss/node/index.js" Reading "node_modules/.pnpm/node_modules/lightningcss/node/index.js.flow" Reading "node_modules/.pnpm/node_modules/lightningcss/node/index.mjs" Reading "node_modules/.pnpm/node_modules/lightningcss/node/targets.d.ts" Reading "node_modules/.pnpm/node_modules/lightningcss/node/targets.js.flow" Reading "node_modules/.pnpm/node_modules/lightningcss/package.json" Reading "node_modules/.pnpm/node_modules/magic-string/LICENSE" Reading "node_modules/.pnpm/node_modules/magic-string/README.md" Reading "node_modules/.pnpm/node_modules/magic-string/dist/index.d.mts" Reading "node_modules/.pnpm/node_modules/magic-string/dist/index.mjs" Reading "node_modules/.pnpm/node_modules/magic-string/package.json" Reading "node_modules/.pnpm/node_modules/mri/index.d.ts" Reading "node_modules/.pnpm/node_modules/mri/lib/index.js" Reading "node_modules/.pnpm/node_modules/mri/lib/index.mjs" Reading "node_modules/.pnpm/node_modules/mri/license.md" Reading "node_modules/.pnpm/node_modules/mri/package.json" Reading "node_modules/.pnpm/node_modules/mri/readme.md" Reading "node_modules/.pnpm/node_modules/node-addon-api/LICENSE.md" Reading "node_modules/.pnpm/node_modules/node-addon-api/README.md" Reading "node_modules/.pnpm/node_modules/node-addon-api/common.gypi" Reading "node_modules/.pnpm/node_modules/node-addon-api/except.gypi" Reading "node_modules/.pnpm/node_modules/node-addon-api/index.js" Reading "node_modules/.pnpm/node_modules/node-addon-api/napi-inl.deprecated.h" Reading "node_modules/.pnpm/node_modules/node-addon-api/napi-inl.h" Reading "node_modules/.pnpm/node_modules/node-addon-api/napi.h" Reading "node_modules/.pnpm/node_modules/node-addon-api/node_addon_api.gyp" Reading "node_modules/.pnpm/node_modules/node-addon-api/node_api.gyp" Reading "node_modules/.pnpm/node_modules/node-addon-api/noexcept.gypi" Reading "node_modules/.pnpm/node_modules/node-addon-api/nothing.c" Reading "node_modules/.pnpm/node_modules/node-addon-api/package-support.json" Reading "node_modules/.pnpm/node_modules/node-addon-api/package.json" Reading "node_modules/.pnpm/node_modules/node-addon-api/tools/README.md" Reading "node_modules/.pnpm/node_modules/node-addon-api/tools/check-napi.js" Reading "node_modules/.pnpm/node_modules/node-addon-api/tools/clang-format.js" Reading "node_modules/.pnpm/node_modules/node-addon-api/tools/conversion.js" Reading "node_modules/.pnpm/node_modules/node-addon-api/tools/eslint-format.js" Reading "node_modules/.pnpm/node_modules/picocolors/LICENSE" Reading "node_modules/.pnpm/node_modules/picocolors/README.md" Reading "node_modules/.pnpm/node_modules/picocolors/package.json" Reading "node_modules/.pnpm/node_modules/picocolors/picocolors.browser.js" Reading "node_modules/.pnpm/node_modules/picocolors/picocolors.d.ts" Reading "node_modules/.pnpm/node_modules/picocolors/picocolors.js" Reading "node_modules/.pnpm/node_modules/picocolors/types.d.ts" Reading "node_modules/.pnpm/node_modules/picomatch/LICENSE" Reading "node_modules/.pnpm/node_modules/picomatch/README.md" Reading "node_modules/.pnpm/node_modules/picomatch/index.js" Reading "node_modules/.pnpm/node_modules/picomatch/lib/constants.js" Reading "node_modules/.pnpm/node_modules/picomatch/lib/parse.js" Reading "node_modules/.pnpm/node_modules/picomatch/lib/picomatch.js" Reading "node_modules/.pnpm/node_modules/picomatch/lib/scan.js" Reading "node_modules/.pnpm/node_modules/picomatch/lib/utils.js" Reading "node_modules/.pnpm/node_modules/picomatch/package.json" Reading "node_modules/.pnpm/node_modules/picomatch/posix.js" Reading "node_modules/.pnpm/node_modules/source-map-js/LICENSE" Reading "node_modules/.pnpm/node_modules/source-map-js/README.md" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/array-set.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/base64-vlq.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/base64.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/binary-search.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/mapping-list.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/quick-sort.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/source-map-consumer.d.ts" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/source-map-consumer.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/source-map-generator.d.ts" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/source-map-generator.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/source-node.d.ts" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/source-node.js" Reading "node_modules/.pnpm/node_modules/source-map-js/lib/util.js" Reading "node_modules/.pnpm/node_modules/source-map-js/package.json" Reading "node_modules/.pnpm/node_modules/source-map-js/source-map.d.ts" Reading "node_modules/.pnpm/node_modules/source-map-js/source-map.js" Reading "node_modules/.pnpm/node_modules/tapable/LICENSE" Reading "node_modules/.pnpm/node_modules/tapable/README.md" Reading "node_modules/.pnpm/node_modules/tapable/lib/AsyncParallelBailHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/AsyncParallelHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/AsyncSeriesBailHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/AsyncSeriesHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/AsyncSeriesLoopHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/Hook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/HookCodeFactory.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/HookMap.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/MultiHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/SyncBailHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/SyncHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/SyncLoopHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/SyncWaterfallHook.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/index.js" Reading "node_modules/.pnpm/node_modules/tapable/lib/util-browser.js" Reading "node_modules/.pnpm/node_modules/tapable/package.json" Reading "node_modules/.pnpm/node_modules/tapable/tapable.d.ts" Reading "node_modules/@tailwindcss/cli/LICENSE" Reading "node_modules/@tailwindcss/cli/README.md" Reading "node_modules/@tailwindcss/cli/dist/index.mjs" Reading "node_modules/@tailwindcss/cli/package.json" Reading "node_modules/my-ui-lib/index.html" Reading "node_modules/tailwindcss/LICENSE" Reading "node_modules/tailwindcss/README.md" Reading "node_modules/tailwindcss/dist/chunk-5JIJA4QV.mjs" Reading "node_modules/tailwindcss/dist/chunk-C2OYBFIH.mjs" Reading "node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs" Reading "node_modules/tailwindcss/dist/colors-C__qRT83.d.ts" Reading "node_modules/tailwindcss/dist/colors.d.mts" Reading "node_modules/tailwindcss/dist/colors.d.ts" Reading "node_modules/tailwindcss/dist/colors.js" Reading "node_modules/tailwindcss/dist/colors.mjs" Reading "node_modules/tailwindcss/dist/default-theme.d.mts" Reading "node_modules/tailwindcss/dist/default-theme.d.ts" Reading "node_modules/tailwindcss/dist/default-theme.js" Reading "node_modules/tailwindcss/dist/default-theme.mjs" Reading "node_modules/tailwindcss/dist/flatten-color-palette.d.mts" Reading "node_modules/tailwindcss/dist/flatten-color-palette.d.ts" Reading "node_modules/tailwindcss/dist/flatten-color-palette.js" Reading "node_modules/tailwindcss/dist/flatten-color-palette.mjs" Reading "node_modules/tailwindcss/dist/lib.d.mts" Reading "node_modules/tailwindcss/dist/lib.d.ts" Reading "node_modules/tailwindcss/dist/lib.js" Reading "node_modules/tailwindcss/dist/lib.mjs" Reading "node_modules/tailwindcss/dist/plugin.d.mts" Reading "node_modules/tailwindcss/dist/plugin.d.ts" Reading "node_modules/tailwindcss/dist/plugin.js" Reading "node_modules/tailwindcss/dist/plugin.mjs" Reading "node_modules/tailwindcss/dist/resolve-config-B4yBzhca.d.ts" Reading "node_modules/tailwindcss/dist/resolve-config-QUZ9b-Gn.d.mts" Reading "node_modules/tailwindcss/dist/types-DWdTiksJ.d.mts" Reading "node_modules/tailwindcss/package.json" Reading "package.json" Reading "pnpm-lock.yaml" Reading "pnpm-workspace.yaml" Reading "public/index.html" Reading "tailwindcss-10742.log" ``` </details> <details> <summary>After</summary> ``` Reading "./app/index.html" Reading "./package.json" Reading "./public/index.html" ``` </details> |
||
|
|
e566a926e7 |
--default(…) should emit values as-is (#20392)
This PR fixes an issue where the `--default(…)` function that can be
used as part of `@utility` definitions goes through the same
pre-processing treatment as `--value(…)` and `--modifier(…)`.
Instead the `--default(…)` value should be emitted as-is.
The pre-processing treatment that's in place today is just to normalize
the value(s) that could be formatted in a strange way if you are dealing
with older Prettier / Biome versions.
Some of the transformations we do ahead of time:
- `--value(--spacing)` -> `--value(--spacing-*)`
- `--value(--spacing- *)` -> `--value(--spacing-*)`
- `--value(--text- * --line-height)` -> `--value(--text-*--line-height)`
- `--value(--text --line-height)` -> `--value(--text-*--line-height)`
- `--value(--text-\\* --line-height)` ->
`--value(--text-*--line-height)`
- `--value([ *])` -> `--value([*])`
One of these steps is getting rid of the spaces, that means that if your
`--default(…)` uses spaces, then we will get rid of it.
```css
@theme inline {
--text-box-trim-start: trim-start;
--text-box-trim-end: trim-end;
--text-box-trim-both: trim-both;
--text-box-edge-cap: cap alphabetic;
--text-box-edge-cap-text: cap text;
--text-box-edge-ex: ex alphabetic;
--text-box-edge-ex-text: ex text;
--text-box-edge-text: text alphabetic;
--text-box-edge-text-text: text text;
}
@utility trim-* {
text-box: --value('normal', 'inherit', 'initial', 'revert', 'revert-layer', 'unset');
text-box: --value(--text-box-trim-*) --modifier(--text-box-edge-*, --default(box alphabetic));
}
```
When you try to use this:
```html
<div className="trim-both" />
```
Then we get the following CSS out:
```css
.trim-both {
text-box: trim-both boxalphabetic;
}
```
This PR fixes that, and now the proper CSS will be emitted:
```css
.trim-both {
text-box: trim-both box alphabetic;
}
```
Fixes: #20391
## Test plan
1. Added an regression test to make sure that `--default(…)` values are
emitted as-is.
|
||
|
|
b8a5f85889 |
Detect classes in Ruby percent literals using angle brackets or custom delimiters (#20387)
## Summary Fixes #20386. Ruby lets you close a `%w`/`%W` literal with any non-alphanumeric character, but the pre-processor only recognized `[`, `(`, `{`, `#` and a space. So `%w<bg-green-400>` and `%w|bg-blue-400|` were skipped and the classes inside them never made it into the output. The boundary lookup now maps `<` to `>` alongside the other paired delimiters, and falls back to treating any other non-alphanumeric, non-whitespace character as its own closing delimiter. ## Test plan Added pre-processor and extraction cases for `%w<…>`, `%w|…|`, `%w:…:` and `%w!…!` in `crates/oxide/src/extractor/pre_processors/ruby.rs`. They fail on `main` and pass with this change. ``` cargo test -p tailwindcss-oxide ``` --------- Co-authored-by: Robin Malfait <malfait.robin@gmail.com> |
||
|
|
3524b45310 |
Attempt to fix flaky integration test (#20384)
One of the integration tests is flaky on CI. This is an attempt to "fix" it. It has probably something to do with the availability of the resources provided by GitHub because locally this works flawlessly for 100 runs straight. ## Test plan - Once we get 5 consecutive positive runs we van merge it. - No actual code was changed, only the flaky integration test itself. <img width="336" height="445" alt="image" src="https://github.com/user-attachments/assets/bec81687-62f5-4df3-8109-d0aaa4ffbd8a" /> |
||
|
|
b5ab20473b | improve flaky integration test | ||
|
|
9dae5163db | update changelog |