Home

tailwind-ctp-intellisense @master - refs - log -
-
https://git.jolheiser.com/tailwind-ctp-intellisense.git
Tailwind intellisense + Catppuccin
tree log patch
Support TS/ESM config files (#738)
Signature
-----BEGIN PGP SIGNATURE----- wsBcBAABCAAQBQJkGD+CCRBK7hj4Ov3rIwAAbV4IAAE77eE4XwPS9DWYCTd66EnS 5lhbt8PONzO313fmKKX4gL9rrsxN7hb0aJ/kPcL0s5HzJVpT9TiuhJ/DUHMgjgbT m3nwVobab0FxJ0znbgvSFxklJGU+CvUzaaAiGG7jA7D2Eh2HVnlTmJUigEEwBr4B /ZjgY72EeUBsuix4NQg2UZR2+dc9b64XRAGFdTkwsL3DN0nnpiQp64C0ZwYCcQux eTIq6vMWE3qkaLHpg2KKV02kYolVzirHPxKE6+8QlOgZZl7kKCwq8wMU/HdOYSYE jtihFrYEaa+IW/1fXBtwuFf6WQoKMHUsiLRdWQPshZGDQQeNUxS/RikRdrEBRD8= =5pWA -----END PGP SIGNATURE-----
Brad Cornes <hello@bradley.dev>
2 years ago
6 changed files, 378 additions(+), 116 deletions(-)
M package-lock.json -> package-lock.json
diff --git a/package-lock.json b/package-lock.json
index fd9649ccf905281d0d3893d833a4f4a828123c51..b4d68dbff3fa151c9897a1b6fb0a50f3e3b253a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,7 +29,7 @@ 				"culori": "0.20.1",
 				"debounce": "1.2.0",
 				"deepmerge": "4.2.2",
 				"detect-indent": "6.0.0",
-				"detective": "5.2.0",
+				"detective-typescript": "9.0.0",
 				"dlv": "1.1.3",
 				"dset": "3.1.2",
 				"enhanced-resolve-301": "0.0.1",
@@ -4964,6 +4964,18 @@ 					"optional": true
 				}
 			}
 		},
+		"node_modules/@typescript-eslint/types": {
+			"version": "5.55.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+			"integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/typescript-eslint"
+			}
+		},
 		"node_modules/@typescript-eslint/typescript-estree": {
 			"version": "2.34.0",
 			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
@@ -4988,6 +5000,30 @@ 			"peerDependenciesMeta": {
 				"typescript": {
 					"optional": true
 				}
+			}
+		},
+		"node_modules/@typescript-eslint/visitor-keys": {
+			"version": "5.55.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+			"integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+			"dependencies": {
+				"@typescript-eslint/types": "5.55.0",
+				"eslint-visitor-keys": "^3.3.0"
+			},
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/typescript-eslint"
+			}
+		},
+		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+			"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@zkochan/cmd-shim": {
@@ -5422,6 +5458,14 @@ 			"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
 			"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
 			"engines": {
 				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/ast-module-types": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz",
+			"integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==",
+			"engines": {
+				"node": ">=6.0"
 			}
 		},
 		"node_modules/ast-types-flow": {
@@ -7716,20 +7760,113 @@ 			"engines": {
 				"node": ">=8"
 			}
 		},
-		"node_modules/detective": {
-			"version": "5.2.0",
-			"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
-			"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+		"node_modules/detective-typescript": {
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-9.0.0.tgz",
+			"integrity": "sha512-lR78AugfUSBojwlSRZBeEqQ1l8LI7rbxOl1qTUnGLcjZQDjZmrZCb7R46rK8U8B5WzFvJrxa7fEBA8FoD/n5fA==",
 			"dependencies": {
-				"acorn-node": "^1.6.1",
-				"defined": "^1.0.0",
-				"minimist": "^1.1.1"
+				"@typescript-eslint/typescript-estree": "^5.13.0",
+				"ast-module-types": "^3.0.0",
+				"node-source-walk": "^5.0.0",
+				"typescript": "^4.5.5"
 			},
-			"bin": {
-				"detective": "bin/detective.js"
+			"engines": {
+				"node": "^12.20.0 || ^14.14.0 || >=16.0.0"
+			}
+		},
+		"node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": {
+			"version": "5.55.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz",
+			"integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==",
+			"dependencies": {
+				"@typescript-eslint/types": "5.55.0",
+				"@typescript-eslint/visitor-keys": "5.55.0",
+				"debug": "^4.3.4",
+				"globby": "^11.1.0",
+				"is-glob": "^4.0.3",
+				"semver": "^7.3.7",
+				"tsutils": "^3.21.0"
 			},
 			"engines": {
-				"node": ">=0.8.0"
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/typescript-eslint"
+			},
+			"peerDependenciesMeta": {
+				"typescript": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/detective-typescript/node_modules/array-union": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+			"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/detective-typescript/node_modules/dir-glob": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+			"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+			"dependencies": {
+				"path-type": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/detective-typescript/node_modules/fast-glob": {
+			"version": "3.2.12",
+			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+			"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+			"dependencies": {
+				"@nodelib/fs.stat": "^2.0.2",
+				"@nodelib/fs.walk": "^1.2.3",
+				"glob-parent": "^5.1.2",
+				"merge2": "^1.3.0",
+				"micromatch": "^4.0.4"
+			},
+			"engines": {
+				"node": ">=8.6.0"
+			}
+		},
+		"node_modules/detective-typescript/node_modules/globby": {
+			"version": "11.1.0",
+			"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+			"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+			"dependencies": {
+				"array-union": "^2.1.0",
+				"dir-glob": "^3.0.1",
+				"fast-glob": "^3.2.9",
+				"ignore": "^5.2.0",
+				"merge2": "^1.4.1",
+				"slash": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/detective-typescript/node_modules/ignore": {
+			"version": "5.2.4",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+			"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+			"engines": {
+				"node": ">= 4"
+			}
+		},
+		"node_modules/detective-typescript/node_modules/path-type": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+			"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+			"engines": {
+				"node": ">=8"
 			}
 		},
 		"node_modules/dezalgo": {
@@ -15415,6 +15552,17 @@ 		"node_modules/node-releases": {
 			"version": "2.0.10",
 			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
 			"integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
+		},
+		"node_modules/node-source-walk": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-5.0.0.tgz",
+			"integrity": "sha512-58APXoMXpmmU+oVBJFajhTCoD8d/OGtngnVAWzIo2A8yn0IXwBzvIVIsTzoie/SrA37u+1hnpNz2HMWx/VIqlw==",
+			"dependencies": {
+				"@babel/parser": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=12"
+			}
 		},
 		"node_modules/nopt": {
 			"version": "4.0.3",
@@ -25580,6 +25728,11 @@ 				"@typescript-eslint/typescript-estree": "2.34.0",
 				"eslint-visitor-keys": "^1.1.0"
 			}
 		},
+		"@typescript-eslint/types": {
+			"version": "5.55.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+			"integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug=="
+		},
 		"@typescript-eslint/typescript-estree": {
 			"version": "2.34.0",
 			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
@@ -25592,6 +25745,22 @@ 				"is-glob": "^4.0.1",
 				"lodash": "^4.17.15",
 				"semver": "^7.3.2",
 				"tsutils": "^3.17.1"
+			}
+		},
+		"@typescript-eslint/visitor-keys": {
+			"version": "5.55.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+			"integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+			"requires": {
+				"@typescript-eslint/types": "5.55.0",
+				"eslint-visitor-keys": "^3.3.0"
+			},
+			"dependencies": {
+				"eslint-visitor-keys": {
+					"version": "3.3.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+					"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA=="
+				}
 			}
 		},
 		"@zkochan/cmd-shim": {
@@ -25926,6 +26095,11 @@ 		"assign-symbols": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
 			"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+		},
+		"ast-module-types": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz",
+			"integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ=="
 		},
 		"ast-types-flow": {
 			"version": "0.0.7",
@@ -27696,14 +27870,79 @@ 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
 			"integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="
 		},
-		"detective": {
-			"version": "5.2.0",
-			"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
-			"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+		"detective-typescript": {
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-9.0.0.tgz",
+			"integrity": "sha512-lR78AugfUSBojwlSRZBeEqQ1l8LI7rbxOl1qTUnGLcjZQDjZmrZCb7R46rK8U8B5WzFvJrxa7fEBA8FoD/n5fA==",
 			"requires": {
-				"acorn-node": "^1.6.1",
-				"defined": "^1.0.0",
-				"minimist": "^1.1.1"
+				"@typescript-eslint/typescript-estree": "^5.13.0",
+				"ast-module-types": "^3.0.0",
+				"node-source-walk": "^5.0.0",
+				"typescript": "^4.5.5"
+			},
+			"dependencies": {
+				"@typescript-eslint/typescript-estree": {
+					"version": "5.55.0",
+					"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz",
+					"integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==",
+					"requires": {
+						"@typescript-eslint/types": "5.55.0",
+						"@typescript-eslint/visitor-keys": "5.55.0",
+						"debug": "^4.3.4",
+						"globby": "^11.1.0",
+						"is-glob": "^4.0.3",
+						"semver": "^7.3.7",
+						"tsutils": "^3.21.0"
+					}
+				},
+				"array-union": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+					"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+				},
+				"dir-glob": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+					"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+					"requires": {
+						"path-type": "^4.0.0"
+					}
+				},
+				"fast-glob": {
+					"version": "3.2.12",
+					"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+					"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+					"requires": {
+						"@nodelib/fs.stat": "^2.0.2",
+						"@nodelib/fs.walk": "^1.2.3",
+						"glob-parent": "^5.1.2",
+						"merge2": "^1.3.0",
+						"micromatch": "^4.0.4"
+					}
+				},
+				"globby": {
+					"version": "11.1.0",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+					"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+					"requires": {
+						"array-union": "^2.1.0",
+						"dir-glob": "^3.0.1",
+						"fast-glob": "^3.2.9",
+						"ignore": "^5.2.0",
+						"merge2": "^1.4.1",
+						"slash": "^3.0.0"
+					}
+				},
+				"ignore": {
+					"version": "5.2.4",
+					"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+					"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="
+				},
+				"path-type": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+					"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+				}
 			}
 		},
 		"dezalgo": {
@@ -33689,6 +33928,14 @@ 		"node-releases": {
 			"version": "2.0.10",
 			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
 			"integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
+		},
+		"node-source-walk": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-5.0.0.tgz",
+			"integrity": "sha512-58APXoMXpmmU+oVBJFajhTCoD8d/OGtngnVAWzIo2A8yn0IXwBzvIVIsTzoie/SrA37u+1hnpNz2HMWx/VIqlw==",
+			"requires": {
+				"@babel/parser": "^7.0.0"
+			}
 		},
 		"nopt": {
 			"version": "4.0.3",
M packages/tailwindcss-language-server/package.json -> packages/tailwindcss-language-server/package.json
diff --git a/packages/tailwindcss-language-server/package.json b/packages/tailwindcss-language-server/package.json
index 395af488132ee47c13b6f22b4a636a65588f0c69..f32d1b244ef5c97d1f691a5f72a866ebc94647f9 100644
--- a/packages/tailwindcss-language-server/package.json
+++ b/packages/tailwindcss-language-server/package.json
@@ -46,7 +46,7 @@     "color-name": "1.1.4",
     "culori": "0.20.1",
     "debounce": "1.2.0",
     "deepmerge": "4.2.2",
-    "detective": "5.2.0",
+    "detective-typescript": "9.0.0",
     "dlv": "1.1.3",
     "dset": "3.1.2",
     "enhanced-resolve-301": "0.0.1",
M packages/tailwindcss-language-server/src/lib/constants.ts -> packages/tailwindcss-language-server/src/lib/constants.ts
diff --git a/packages/tailwindcss-language-server/src/lib/constants.ts b/packages/tailwindcss-language-server/src/lib/constants.ts
index 7324327c59283b13931a342a761e3242e62b4c35..4f9462c6ea051c5a2cb574fd6ccb18a517baae44 100644
--- a/packages/tailwindcss-language-server/src/lib/constants.ts
+++ b/packages/tailwindcss-language-server/src/lib/constants.ts
@@ -1,3 +1,4 @@
-export const CONFIG_GLOB = '{tailwind,tailwind.config,tailwind.*.config,tailwind.config.*}.{js,cjs}'
+export const CONFIG_GLOB =
+  '{tailwind,tailwind.config,tailwind.*.config,tailwind.config.*}.{js,cjs,ts,mjs}'
 export const PACKAGE_LOCK_GLOB = '{package-lock.json,yarn.lock,pnpm-lock.yaml}'
 export const CSS_GLOB = '*.{css,scss,sass,less,pcss}'
M packages/tailwindcss-language-server/src/server.ts -> packages/tailwindcss-language-server/src/server.ts
diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts
index 54cb88cdda29a59dce7de9efc42c719add747f9b..b51919442b21a1f872e0de02959851f5d7d58ab5 100644
--- a/packages/tailwindcss-language-server/src/server.ts
+++ b/packages/tailwindcss-language-server/src/server.ts
@@ -608,6 +608,7 @@     let postcssVersion: string | undefined
     let pluginVersions: string | undefined
     let browserslist: string[] | undefined
     let resolveConfigFn: (config: any) => any
+    let loadConfigFn: (path: string) => any
     let featureFlags: FeatureFlags = { future: [], experimental: [] }
     let applyComplexClasses: any
 
@@ -674,6 +675,10 @@             throw Error('Failed to load resolveConfig function.')
           }
         }
       }
+
+      try {
+        loadConfigFn = require(resolveFrom(tailwindDir, './loadConfig.js'))
+      } catch {}
 
       if (semver.gte(tailwindcssVersion, '1.4.0') && semver.lte(tailwindcssVersion, '1.99.0')) {
         const browserslistPath = resolveFrom(tailwindDir, 'browserslist')
@@ -810,6 +815,7 @@       tailwindcss: { version: tailwindcssVersion, module: tailwindcss },
       postcss: { version: postcssVersion, module: postcss },
       postcssSelectorParser: { module: postcssSelectorParser },
       resolveConfig: { module: resolveConfigFn },
+      loadConfig: { module: loadConfigFn },
       jit: jitModules,
     }
     state.browserslist = browserslist
@@ -893,7 +899,7 @@     log('Building...')
 
     clearRequireCache()
 
-    const { tailwindcss, postcss, resolveConfig } = state.modules
+    const { tailwindcss, postcss, resolveConfig, loadConfig } = state.modules
     const sepLocation = semver.gte(tailwindcss.version, '0.99.0')
       ? ['separator']
       : ['options', 'separator']
@@ -901,85 +907,91 @@     let presetVariants: any[] = []
     let originalConfig: any
 
     let isV3 = semver.gte(tailwindcss.version, '2.99.0')
+    let hook: Hook
 
-    let hook = new Hook(fs.realpathSync(state.configPath), (exports) => {
-      originalConfig = klona(exports)
+    if (loadConfig.module) {
+      originalConfig = await loadConfig.module(state.configPath)
+      state.jit = true
+    } else {
+      hook = new Hook(fs.realpathSync(state.configPath), (exports) => {
+        originalConfig = klona(exports)
 
-      let separator = dlv(exports, sepLocation)
-      if (typeof separator !== 'string') {
-        separator = ':'
-      }
-      dset(exports, sepLocation, `__TWSEP__${separator}__TWSEP__`)
-      exports[isV3 ? 'content' : 'purge'] = []
+        let separator = dlv(exports, sepLocation)
+        if (typeof separator !== 'string') {
+          separator = ':'
+        }
+        dset(exports, sepLocation, `__TWSEP__${separator}__TWSEP__`)
+        exports[isV3 ? 'content' : 'purge'] = []
 
-      let mode = getMode(exports)
-      deleteMode(exports)
+        let mode = getMode(exports)
+        deleteMode(exports)
 
-      let isJit = isV3 || (state.modules.jit && mode === 'jit')
+        let isJit = isV3 || (state.modules.jit && mode === 'jit')
 
-      if (isJit) {
-        state.jit = true
-        exports.variants = []
+        if (isJit) {
+          state.jit = true
+          exports.variants = []
 
-        if (Array.isArray(exports.presets)) {
-          for (let preset of exports.presets) {
-            presetVariants.push(preset.variants)
-            preset.variants = []
+          if (Array.isArray(exports.presets)) {
+            for (let preset of exports.presets) {
+              presetVariants.push(preset.variants)
+              preset.variants = []
+            }
           }
+        } else {
+          state.jit = false
         }
-      } else {
-        state.jit = false
-      }
 
-      if (state.corePlugins) {
-        let corePluginsConfig = {}
-        for (let pluginName of state.corePlugins) {
-          corePluginsConfig[pluginName] = true
+        if (state.corePlugins) {
+          let corePluginsConfig = {}
+          for (let pluginName of state.corePlugins) {
+            corePluginsConfig[pluginName] = true
+          }
+          exports.corePlugins = corePluginsConfig
         }
-        exports.corePlugins = corePluginsConfig
-      }
 
-      // inject JIT `matchUtilities` function
-      if (Array.isArray(exports.plugins)) {
-        exports.plugins = exports.plugins.map((plugin) => {
-          if (plugin.__isOptionsFunction) {
-            plugin = plugin()
-          }
-          if (typeof plugin === 'function') {
-            let newPlugin = (...args) => {
-              if (!args[0].matchUtilities) {
-                args[0].matchUtilities = () => {}
-              }
-              return plugin(...args)
+        // inject JIT `matchUtilities` function
+        if (Array.isArray(exports.plugins)) {
+          exports.plugins = exports.plugins.map((plugin) => {
+            if (plugin.__isOptionsFunction) {
+              plugin = plugin()
             }
-            // @ts-ignore
-            newPlugin.__intellisense_cache_bust = Math.random()
-            return newPlugin
-          }
-          if (plugin.handler) {
-            return {
-              ...plugin,
-              handler: (...args) => {
+            if (typeof plugin === 'function') {
+              let newPlugin = (...args) => {
                 if (!args[0].matchUtilities) {
                   args[0].matchUtilities = () => {}
                 }
-                return plugin.handler(...args)
-              },
-              __intellisense_cache_bust: Math.random(),
+                return plugin(...args)
+              }
+              // @ts-ignore
+              newPlugin.__intellisense_cache_bust = Math.random()
+              return newPlugin
+            }
+            if (plugin.handler) {
+              return {
+                ...plugin,
+                handler: (...args) => {
+                  if (!args[0].matchUtilities) {
+                    args[0].matchUtilities = () => {}
+                  }
+                  return plugin.handler(...args)
+                },
+                __intellisense_cache_bust: Math.random(),
+              }
             }
-          }
-          return plugin
-        })
-      }
+            return plugin
+          })
+        }
 
-      return exports
-    })
+        return exports
+      })
 
-    try {
-      require(state.configPath)
-    } catch (error) {
-      hook.unhook()
-      throw error
+      try {
+        require(state.configPath)
+      } catch (error) {
+        hook.unhook()
+        throw error
+      }
     }
 
     if (!originalConfig) {
@@ -1029,14 +1041,14 @@         delete state.jitContext
         delete state.classList
       }
     } catch (error) {
-      hook.unhook()
+      hook?.unhook()
       throw error
     }
 
     let postcssResult: Result
 
     if (state.classList) {
-      hook.unhook()
+      hook?.unhook()
     } else {
       try {
         postcssResult = await postcss
@@ -1060,7 +1072,7 @@           )
       } catch (error) {
         throw error
       } finally {
-        hook.unhook()
+        hook?.unhook()
       }
     }
 
@@ -1700,6 +1712,13 @@           }
         } catch {}
 
         if (isCssFile && (!semver.gte(twVersion, '3.2.0') || isDefaultVersion)) {
+          continue
+        }
+
+        if (
+          (configPath.endsWith('.ts') || configPath.endsWith('.mjs')) &&
+          !semver.gte(twVersion, '3.3.0')
+        ) {
           continue
         }
 
M packages/tailwindcss-language-server/src/util/getModuleDependencies.ts -> packages/tailwindcss-language-server/src/util/getModuleDependencies.ts
diff --git a/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts b/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts
index 84de7f88c31303f29c41a23b081f0e28dd5938ba..15f45d0a5a53ce5c3c0eb00f67d80d83be4d0d2e 100644
--- a/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts
+++ b/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts
@@ -1,47 +1,41 @@
 import fs from 'fs'
 import path from 'path'
 import resolve from 'resolve'
-import detective from 'detective'
+import detective from 'detective-typescript'
 import normalizePath from 'normalize-path'
 
-export function getModuleDependencies(modulePath: string): string[] {
-  return _getModuleDependencies(modulePath)
-    .map(({ file }) => file)
-    .filter((file) => file !== modulePath)
-    .map((file) => normalizePath(file))
+function createModule(file: string): { file: string; requires: string[] } {
+  let source = fs.readFileSync(file, 'utf-8')
+  return { file, requires: detective(source, { mixedImports: true }) }
 }
 
-function createModule(file) {
-  const source = fs.readFileSync(file, 'utf-8')
-  const requires = detective(source)
+function* _getModuleDependencies(entryFile: string): Generator<string> {
+  yield entryFile
 
-  return { file, requires }
-}
+  let mod = createModule(entryFile)
 
-function _getModuleDependencies(entryFile) {
-  const rootModule = createModule(entryFile)
-  const modules = [rootModule]
+  let ext = path.extname(entryFile)
+  let isTypeScript = ext === '.ts' || ext === '.cts' || ext === '.mts'
+  let extensions = [...(isTypeScript ? ['.ts', '.cts', '.mts'] : []), '.js', '.cjs', '.mjs']
 
   // Iterate over the modules, even when new
   // ones are being added
-  for (const mdl of modules) {
-    mdl.requires
-      .filter((dep) => {
-        // Only track local modules, not node_modules
-        return dep.startsWith('./') || dep.startsWith('../')
-      })
-      .forEach((dep) => {
-        try {
-          const basedir = path.dirname(mdl.file)
-          const depPath = resolve.sync(dep, { basedir })
-          const depModule = createModule(depPath)
+  for (let dep of mod.requires) {
+    // Only track local modules, not node_modules
+    if (!dep.startsWith('./') && !dep.startsWith('../')) {
+      continue
+    }
 
-          modules.push(depModule)
-        } catch (_err) {
-          // eslint-disable-next-line no-empty
-        }
-      })
+    try {
+      let basedir = path.dirname(mod.file)
+      let depPath = resolve.sync(dep, { basedir, extensions })
+      yield* _getModuleDependencies(depPath)
+    } catch {}
   }
+}
 
-  return modules
+export function getModuleDependencies(entryFile: string): string[] {
+  return Array.from(_getModuleDependencies(entryFile))
+    .filter((file) => file !== entryFile)
+    .map((file) => normalizePath(file))
 }
M packages/tailwindcss-language-service/src/util/state.ts -> packages/tailwindcss-language-service/src/util/state.ts
diff --git a/packages/tailwindcss-language-service/src/util/state.ts b/packages/tailwindcss-language-service/src/util/state.ts
index 51677af8015d2f6bafe6c13ec207043c40c1284b..681ae5f360649ca034344f733e9c078d74ee07b8 100644
--- a/packages/tailwindcss-language-service/src/util/state.ts
+++ b/packages/tailwindcss-language-service/src/util/state.ts
@@ -105,6 +105,7 @@     tailwindcss?: { version: string; module: any }
     postcss?: { version: string; module: Postcss }
     postcssSelectorParser?: { module: any }
     resolveConfig?: { module: any }
+    loadConfig?: { module: any }
     jit?: {
       generateRules: { module: any }
       createContext: { module: any }