import { normalizePath } from '@tailwindcss/node'
import braces from 'braces'
import path from 'node:path'
interface GlobEntry {
base: string
pattern: string
}
export function hoistStaticGlobParts(entry: GlobEntry): GlobEntry[] {
return braces(entry.pattern, { expand: true }).map((pattern) => {
let clone = { ...entry }
let [staticPart, dynamicPart] = splitPattern(pattern)
let absolutePosixPath = normalizePath(entry.base)
if (staticPart !== null) {
clone.base = path.posix.join(absolutePosixPath, staticPart)
} else {
clone.base = absolutePosixPath
}
if (dynamicPart === null) {
clone.pattern = '**/*'
} else {
clone.pattern = dynamicPart
}
let file = path.basename(clone.base)
if (file.includes('.')) {
clone.pattern = file
clone.base = path.dirname(clone.base)
}
return clone
})
}
function splitPattern(pattern: string): [staticPart: string | null, dynamicPart: string | null] {
if (!pattern.includes('*')) {
return [pattern, null]
}
let lastSlashPosition: number | null = null
for (let i = 0; i < pattern.length; i++) {
let c = pattern[i]
if (c === '/') {
lastSlashPosition = i
}
if (c === '*' || c === '!') {
break
}
}
if (lastSlashPosition === null) {
return [null, pattern]
}
let staticPart = pattern.slice(0, lastSlashPosition).trim()
let dynamicPart = pattern.slice(lastSlashPosition + 1).trim()
return [staticPart || null, dynamicPart || null]
}