diff --git a/packages/tailwindcss-language-server/package.json b/packages/tailwindcss-language-server/package.json index 40b3e05ac..9fded1e59 100644 --- a/packages/tailwindcss-language-server/package.json +++ b/packages/tailwindcss-language-server/package.json @@ -89,7 +89,7 @@ "rimraf": "3.0.2", "stack-trace": "0.0.10", "tailwindcss": "3.4.18", - "tailwindcss-v4": "npm:tailwindcss@4.1.17", + "tailwindcss-v4": "npm:tailwindcss@4.1.18", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.4", "tsconfig-paths": "^4.2.0", diff --git a/packages/tailwindcss-language-server/src/project-locator.test.ts b/packages/tailwindcss-language-server/src/project-locator.test.ts index 8e53c180e..529987953 100644 --- a/packages/tailwindcss-language-server/src/project-locator.test.ts +++ b/packages/tailwindcss-language-server/src/project-locator.test.ts @@ -455,7 +455,7 @@ testLocator({ }, expected: [ { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/src/a/b/c/index.css', content: [], }, @@ -487,12 +487,12 @@ testLocator({ }, expected: [ { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/index.css', content: [], }, { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/src/vendor/c.css', content: [], }, @@ -519,12 +519,12 @@ testLocator({ }, expected: [ { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/src/app.css', content: [], }, { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/a/foo.css', content: [], }, @@ -554,12 +554,12 @@ testLocator({ }, expected: [ { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/src/app.css', content: [], }, { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/a/foo.css', content: [], }, @@ -581,7 +581,7 @@ testLocator({ }, expected: [ { - version: '4.1.17 (bundled)', + version: '4.1.18 (bundled)', config: '/src/app.css', content: [], }, diff --git a/packages/tailwindcss-language-server/tests/colors/colors.test.js b/packages/tailwindcss-language-server/tests/colors/colors.test.js index 92da0d588..f17e7ab23 100644 --- a/packages/tailwindcss-language-server/tests/colors/colors.test.js +++ b/packages/tailwindcss-language-server/tests/colors/colors.test.js @@ -349,7 +349,7 @@ defineTest({ expect(c.project).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: true, }, }) @@ -388,7 +388,7 @@ defineTest({ expect(c.project).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: true, }, }) diff --git a/packages/tailwindcss-language-server/tests/env/v4.test.js b/packages/tailwindcss-language-server/tests/env/v4.test.js index f054287ac..df4ee18fb 100644 --- a/packages/tailwindcss-language-server/tests/env/v4.test.js +++ b/packages/tailwindcss-language-server/tests/env/v4.test.js @@ -21,7 +21,7 @@ defineTest({ expect(await client.project()).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: true, }, }) @@ -137,7 +137,7 @@ defineTest({ expect(await client.project()).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: true, }, }) @@ -188,7 +188,7 @@ defineTest({ 'package.json': json` { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } `, @@ -205,7 +205,7 @@ defineTest({ expect(await client.project()).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: false, }, }) @@ -243,7 +243,7 @@ defineTest({ 'package.json': json` { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } `, @@ -270,7 +270,7 @@ defineTest({ expect(await client.project()).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: false, }, }) @@ -322,7 +322,7 @@ defineTest({ expect(await client.project()).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: true, }, }) @@ -354,7 +354,7 @@ defineTest({ 'package.json': json` { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } `, @@ -831,7 +831,7 @@ defineTest({ expect(await client.project()).toMatchObject({ tailwind: { - version: '4.1.17', + version: '4.1.18', isDefaultVersion: true, }, }) diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package-lock.json index db44ced8d..a4ae0b1ff 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/basic/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package-lock.json index 74935ce06..e072fed92 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/css-loading-js/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package-lock.json index 3a6f2cc8f..9ce001b72 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/dependencies/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package-lock.json index ce9b94be5..7bae87ca0 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/invalid-import-order/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package-lock.json index 6f89483bb..56ae23459 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/missing-files/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package-lock.json index f46fb487b..73b3521d3 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/multi-config/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package-lock.json index 0580cf520..b1fa0b8e8 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/path-mappings/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package-lock.json index 6d75bfb8a..d679cffdb 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package.json index f1752f593..b3c9f0cce 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/with-prefix/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package-lock.json b/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package-lock.json index 3dd6db074..8835c6b80 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package-lock.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package-lock.json @@ -8,7 +8,7 @@ "packages/*" ], "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } }, "node_modules/@private/admin": { @@ -32,9 +32,9 @@ "link": true }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" }, "packages/admin": { diff --git a/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package.json b/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package.json index 5a5b8df96..09a644428 100644 --- a/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package.json +++ b/packages/tailwindcss-language-server/tests/fixtures/v4/workspaces/package.json @@ -3,6 +3,6 @@ "packages/*" ], "dependencies": { - "tailwindcss": "4.1.17" + "tailwindcss": "4.1.18" } } diff --git a/packages/tailwindcss-language-service/src/completions/file-paths.test.ts b/packages/tailwindcss-language-service/src/completions/file-paths.test.ts index ed5213923..1be97f223 100644 --- a/packages/tailwindcss-language-service/src/completions/file-paths.test.ts +++ b/packages/tailwindcss-language-service/src/completions/file-paths.test.ts @@ -3,7 +3,7 @@ import { findFileDirective } from './file-paths' test('Detecting v3 directives that point to files', async () => { function find(text: string) { - return findFileDirective({ enabled: true, v4: false }, text) + return findFileDirective({ enabled: true, v4: false, features: [] }, text) } await expect(find('@config "./')).resolves.toEqual({ @@ -22,7 +22,7 @@ test('Detecting v3 directives that point to files', async () => { test('Detecting v4 directives that point to files', async () => { function find(text: string) { - return findFileDirective({ enabled: true, v4: true }, text) + return findFileDirective({ enabled: true, v4: true, features: [] }, text) } await expect(find('@config "./')).resolves.toEqual({ @@ -64,7 +64,7 @@ test('Detecting v4 directives that point to files', async () => { test('@source inline is ignored', async () => { function find(text: string) { - return findFileDirective({ enabled: true, v4: true }, text) + return findFileDirective({ enabled: true, v4: true, features: [] }, text) } await expect(find('@source inline("')).resolves.toEqual(null) diff --git a/packages/tailwindcss-language-service/src/css/ast.ts b/packages/tailwindcss-language-service/src/css/ast.ts index ac95d204a..6d206c964 100644 --- a/packages/tailwindcss-language-service/src/css/ast.ts +++ b/packages/tailwindcss-language-service/src/css/ast.ts @@ -1,6 +1,5 @@ -import { parseAtRule } from './parse' import type { SourceLocation } from './source' -import type { VisitContext } from '../util/walk' +import { parseAtRule } from './parse' const AT_SIGN = 0x40 @@ -17,7 +16,7 @@ export type AtRule = { kind: 'at-rule' name: string params: string - nodes: AstNode[] + nodes: AstNode[] | null src?: SourceLocation dst?: SourceLocation @@ -70,7 +69,7 @@ export function styleRule(selector: string, nodes: AstNode[] = []): StyleRule { } } -export function atRule(name: string, params: string = '', nodes: AstNode[] = []): AtRule { +export function atRule(name: string, params: string = '', nodes: AstNode[] | null = []): AtRule { return { kind: 'at-rule', name, @@ -79,12 +78,12 @@ export function atRule(name: string, params: string = '', nodes: AstNode[] = []) } } -export function rule(selector: string, nodes: AstNode[] = []): StyleRule | AtRule { +export function rule(selector: string, nodes: AstNode[] | null = []): StyleRule | AtRule { if (selector.charCodeAt(0) === AT_SIGN) { return parseAtRule(selector, nodes) } - return styleRule(selector, nodes) + return styleRule(selector, nodes ?? []) } export function decl(property: string, value: string | undefined, important = false): Declaration { @@ -117,95 +116,3 @@ export function atRoot(nodes: AstNode[]): AtRoot { nodes, } } - -export function cloneAstNode(node: T): T { - switch (node.kind) { - case 'rule': - return { - kind: node.kind, - selector: node.selector, - nodes: node.nodes.map(cloneAstNode), - src: node.src, - dst: node.dst, - } satisfies StyleRule as T - - case 'at-rule': - return { - kind: node.kind, - name: node.name, - params: node.params, - nodes: node.nodes.map(cloneAstNode), - src: node.src, - dst: node.dst, - } satisfies AtRule as T - - case 'at-root': - return { - kind: node.kind, - nodes: node.nodes.map(cloneAstNode), - src: node.src, - dst: node.dst, - } satisfies AtRoot as T - - case 'context': - return { - kind: node.kind, - context: { ...node.context }, - nodes: node.nodes.map(cloneAstNode), - src: node.src, - dst: node.dst, - } satisfies Context as T - - case 'declaration': - return { - kind: node.kind, - property: node.property, - value: node.value, - important: node.important, - src: node.src, - dst: node.dst, - } satisfies Declaration as T - - case 'comment': - return { - kind: node.kind, - value: node.value, - src: node.src, - dst: node.dst, - } satisfies Comment as T - - default: - node satisfies never - throw new Error(`Unknown node kind: ${(node as any).kind}`) - } -} - -export function cssContext( - ctx: VisitContext, -): VisitContext & { context: Record } { - return { - depth: ctx.depth, - get context() { - let context: Record = {} - for (let child of ctx.path()) { - if (child.kind === 'context') { - Object.assign(context, child.context) - } - } - - // Once computed, we never need to compute this again - Object.defineProperty(this, 'context', { value: context }) - return context - }, - get parent() { - let parent = (this.path().pop() as Extract) ?? null - - // Once computed, we never need to compute this again - Object.defineProperty(this, 'parent', { value: parent }) - return parent - }, - path() { - return ctx.path().filter((n) => n.kind !== 'context') - }, - } -} diff --git a/packages/tailwindcss-language-service/src/css/clone-ast-node.ts b/packages/tailwindcss-language-service/src/css/clone-ast-node.ts index ec62e4825..7d0c4ea82 100644 --- a/packages/tailwindcss-language-service/src/css/clone-ast-node.ts +++ b/packages/tailwindcss-language-service/src/css/clone-ast-node.ts @@ -16,7 +16,7 @@ export function cloneAstNode(node: T): T { kind: node.kind, name: node.name, params: node.params, - nodes: node.nodes.map(cloneAstNode), + nodes: node.nodes?.map(cloneAstNode) ?? null, src: node.src, dst: node.dst, } satisfies AtRule as T diff --git a/packages/tailwindcss-language-service/src/css/css-context.ts b/packages/tailwindcss-language-service/src/css/css-context.ts new file mode 100644 index 000000000..02ca10013 --- /dev/null +++ b/packages/tailwindcss-language-service/src/css/css-context.ts @@ -0,0 +1,32 @@ +import type { VisitContext } from '../util/walk' +import type { AstNode } from './ast' + +export function cssContext( + ctx: VisitContext, +): VisitContext & { context: Record } { + return { + depth: ctx.depth, + get context() { + let context: Record = {} + for (let child of ctx.path()) { + if (child.kind === 'context') { + Object.assign(context, child.context) + } + } + + // Once computed, we never need to compute this again + Object.defineProperty(this, 'context', { value: context }) + return context + }, + get parent() { + let parent = (this.path().pop() as Extract) ?? null + + // Once computed, we never need to compute this again + Object.defineProperty(this, 'parent', { value: parent }) + return parent + }, + path() { + return ctx.path().filter((n) => n.kind !== 'context') + }, + } +} diff --git a/packages/tailwindcss-language-service/src/css/from-postcss-ast.ts b/packages/tailwindcss-language-service/src/css/from-postcss-ast.ts index 9fb26ff7c..04cc59ad8 100644 --- a/packages/tailwindcss-language-service/src/css/from-postcss-ast.ts +++ b/packages/tailwindcss-language-service/src/css/from-postcss-ast.ts @@ -44,9 +44,9 @@ export function fromPostCSSAst(root: postcss.Root): AstNode[] { // AtRule else if (node.type === 'atrule') { - let astNode = atRule(`@${node.name}`, node.params) + let astNode = atRule(`@${node.name}`, node.params, node.nodes ? [] : null) astNode.src = toSource(node) - node.each((child) => transform(child, astNode.nodes)) + node.each((child) => transform(child, astNode.nodes!)) parent.push(astNode) } diff --git a/packages/tailwindcss-language-service/src/css/index.ts b/packages/tailwindcss-language-service/src/css/index.ts index c053e61b6..3612b101d 100644 --- a/packages/tailwindcss-language-service/src/css/index.ts +++ b/packages/tailwindcss-language-service/src/css/index.ts @@ -1,6 +1,7 @@ export * from './ast' export * from './source' export { parse } from './parse' +export { cloneAstNode } from './clone-ast-node' export { fromPostCSSAst } from './from-postcss-ast' export { toPostCSSAst } from './to-postcss-ast' export { toCss } from './to-css' diff --git a/packages/tailwindcss-language-service/src/css/parse.ts b/packages/tailwindcss-language-service/src/css/parse.ts index d0f8ff223..4386f6d63 100644 --- a/packages/tailwindcss-language-service/src/css/parse.ts +++ b/packages/tailwindcss-language-service/src/css/parse.ts @@ -277,6 +277,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { } if (parent) { + parent.nodes ??= [] parent.nodes.push(declaration) } else { ast.push(declaration) @@ -303,6 +304,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { // At-rule is nested inside of a rule, attach it to the parent. if (parent) { + parent.nodes ??= [] parent.nodes.push(node) } @@ -343,6 +345,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { } if (parent) { + parent.nodes ??= [] parent.nodes.push(declaration) } else { ast.push(declaration) @@ -369,6 +372,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { // Attach the rule to the parent in case it's nested. if (parent) { + parent.nodes ??= [] parent.nodes.push(node) } @@ -421,6 +425,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { // At-rule is nested inside of a rule, attach it to the parent. if (parent) { + parent.nodes ??= [] parent.nodes.push(node) } @@ -460,6 +465,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { node.dst = [source, bufferStart, i] } + parent.nodes ??= [] parent.nodes.push(node) } } @@ -548,7 +554,7 @@ export function parse(input: string, opts?: ParseOptions): AstNode[] { return ast } -export function parseAtRule(buffer: string, nodes: AstNode[] = []): AtRule { +export function parseAtRule(buffer: string, nodes: AstNode[] | null = []): AtRule { let name = buffer let params = '' diff --git a/packages/tailwindcss-language-service/src/css/to-css.ts b/packages/tailwindcss-language-service/src/css/to-css.ts index 83e94742e..b2e6c869a 100644 --- a/packages/tailwindcss-language-service/src/css/to-css.ts +++ b/packages/tailwindcss-language-service/src/css/to-css.ts @@ -3,6 +3,7 @@ import { Source } from './source' export function toCss(ast: AstNode[], track?: boolean): string { let pos = 0 + let supportsBodylessAtRules = false let source: Source = { file: null, @@ -84,6 +85,10 @@ export function toCss(ast: AstNode[], track?: boolean): string { // AtRule else if (node.kind === 'at-rule') { + let isBodyless = supportsBodylessAtRules + ? !node.nodes + : !node.nodes || node.nodes.length === 0 + // Print at-rules without nodes with a `;` instead of an empty block. // // E.g.: @@ -91,7 +96,7 @@ export function toCss(ast: AstNode[], track?: boolean): string { // ```css // @layer base, components, utilities; // ``` - if (node.nodes.length === 0) { + if (isBodyless) { let css = `${indent}${node.name} ${node.params};\n` if (track) { diff --git a/packages/tailwindcss-language-service/src/css/to-postcss-ast.ts b/packages/tailwindcss-language-service/src/css/to-postcss-ast.ts index 3495f323c..697aaaad8 100644 --- a/packages/tailwindcss-language-service/src/css/to-postcss-ast.ts +++ b/packages/tailwindcss-language-service/src/css/to-postcss-ast.ts @@ -85,11 +85,15 @@ export function toPostCSSAst(ast: AstNode[], source?: postcss.Source): postcss.R // AtRule else if (node.kind === 'at-rule') { - let astNode = postcss.atRule({ name: node.name.slice(1), params: node.params }) + let astNode = postcss.atRule({ + name: node.name.slice(1), + params: node.params, + nodes: node.nodes ? [] : undefined, + }) updateSource(astNode, node.src) astNode.raws.semicolon = true parent.append(astNode) - for (let child of node.nodes) { + for (let child of node.nodes ?? []) { transform(child, astNode) } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 216c758a7..dc75d0020 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -204,8 +204,8 @@ importers: specifier: 3.4.18 version: 3.4.18 tailwindcss-v4: - specifier: npm:tailwindcss@4.1.17 - version: tailwindcss@4.1.17 + specifier: npm:tailwindcss@4.1.18 + version: tailwindcss@4.1.18 tinyglobby: specifier: ^0.2.12 version: 0.2.12 @@ -2434,8 +2434,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.1.17: - resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -4674,7 +4674,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@4.1.17: {} + tailwindcss@4.1.18: {} tapable@2.2.1: {}