summaryrefslogtreecommitdiff
path: root/node_modules/tailwindcss/src/lib/getModuleDependencies.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/tailwindcss/src/lib/getModuleDependencies.js')
-rw-r--r--node_modules/tailwindcss/src/lib/getModuleDependencies.js79
1 files changed, 79 insertions, 0 deletions
diff --git a/node_modules/tailwindcss/src/lib/getModuleDependencies.js b/node_modules/tailwindcss/src/lib/getModuleDependencies.js
new file mode 100644
index 0000000..e6a38a8
--- /dev/null
+++ b/node_modules/tailwindcss/src/lib/getModuleDependencies.js
@@ -0,0 +1,79 @@
+import fs from 'fs'
+import path from 'path'
+
+let jsExtensions = ['.js', '.cjs', '.mjs']
+
+// Given the current file `a.ts`, we want to make sure that when importing `b` that we resolve
+// `b.ts` before `b.js`
+//
+// E.g.:
+//
+// a.ts
+// b // .ts
+// c // .ts
+// a.js
+// b // .js or .ts
+
+let jsResolutionOrder = ['', '.js', '.cjs', '.mjs', '.ts', '.cts', '.mts', '.jsx', '.tsx']
+let tsResolutionOrder = ['', '.ts', '.cts', '.mts', '.tsx', '.js', '.cjs', '.mjs', '.jsx']
+
+function resolveWithExtension(file, extensions) {
+ // Try to find `./a.ts`, `./a.ts`, ... from `./a`
+ for (let ext of extensions) {
+ let full = `${file}${ext}`
+ if (fs.existsSync(full) && fs.statSync(full).isFile()) {
+ return full
+ }
+ }
+
+ // Try to find `./a/index.js` from `./a`
+ for (let ext of extensions) {
+ let full = `${file}/index${ext}`
+ if (fs.existsSync(full)) {
+ return full
+ }
+ }
+
+ return null
+}
+
+function* _getModuleDependencies(filename, base, seen, ext = path.extname(filename)) {
+ // Try to find the file
+ let absoluteFile = resolveWithExtension(
+ path.resolve(base, filename),
+ jsExtensions.includes(ext) ? jsResolutionOrder : tsResolutionOrder
+ )
+ if (absoluteFile === null) return // File doesn't exist
+
+ // Prevent infinite loops when there are circular dependencies
+ if (seen.has(absoluteFile)) return // Already seen
+ seen.add(absoluteFile)
+
+ // Mark the file as a dependency
+ yield absoluteFile
+
+ // Resolve new base for new imports/requires
+ base = path.dirname(absoluteFile)
+ ext = path.extname(absoluteFile)
+
+ let contents = fs.readFileSync(absoluteFile, 'utf-8')
+
+ // Find imports/requires
+ for (let match of [
+ ...contents.matchAll(/import[\s\S]*?['"](.{3,}?)['"]/gi),
+ ...contents.matchAll(/import[\s\S]*from[\s\S]*?['"](.{3,}?)['"]/gi),
+ ...contents.matchAll(/require\(['"`](.+)['"`]\)/gi),
+ ]) {
+ // Bail out if it's not a relative file
+ if (!match[1].startsWith('.')) continue
+
+ yield* _getModuleDependencies(match[1], base, seen, ext)
+ }
+}
+
+export default function getModuleDependencies(absoluteFilePath) {
+ if (absoluteFilePath === null) return new Set()
+ return new Set(
+ _getModuleDependencies(absoluteFilePath, path.dirname(absoluteFilePath), new Set())
+ )
+}