import * as path from 'path' import * as fg from 'fast-glob' import { glob, globSync, GlobOptions, hasMagic } from 'glob' import { REGEX_VAR, REGEX_VAR_ALT } from "@plastichub/core/constants" import { sync as exists } from '@plastichub/fs/exists' export const files = (cwd, glob, options?: any) => fg.sync(glob, { ...{ dot: true, cwd, absolute: true, caseSensitiveMatch: false }, ...options || {} }) as [] export const filesEx = (cwd, glob, options?: GlobOptions) => globSync(glob, { ...{ dot: true, cwd, absolute: true, caseSensitiveMatch: false }, ...options || {} }) as [] import { substitute } from './variables' import { isFile, isFolder, getExtensions } from './fs' import { PATH_INFO } from './types_common' const globBase = require('glob-base') export const forward_slash = (path) => { const isExtendedLengthPath = /^\\\\\?\\/.test(path) const hasNonAscii = /[^\u0000-\u0080]+/.test(path) if (isExtendedLengthPath || hasNonAscii) { return path; } return path.replace(/\\/g, '/') } export const pathInfoEx = (src: string, altToken: boolean = false, globOptions: GlobOptions = {}): PATH_INFO => { const srcParts = path.parse(src) let variables: PATH_INFO = { PATH: src } as PATH_INFO variables.DIR = srcParts.dir variables.NAME = srcParts.name variables.FILE_NAME = srcParts.base variables.FILE_EXT = srcParts.ext.replace('.', '') variables.PATH = src variables.IS_FILE = isFile(src) variables.IS_FOLDER = isFolder(src) variables.IS_EXPRESSION = src.match(altToken ? REGEX_VAR_ALT : REGEX_VAR) != null if (!variables.IS_FOLDER && !variables.IS_FILE) { variables.IS_GLOB = hasMagic(substitute(altToken, srcParts.base, {}, false)) } else { variables.IS_GLOB = false } if (variables.IS_GLOB) { //important: use the forward slash since path.resolve will return backslashes on Windows const glob_base = globBase(src) variables.DIR = path.resolve(glob_base.base) variables.FILE_NAME = glob_base.glob variables.GLOB = glob_base.glob variables.GLOB_EXTENSIONS = getExtensions(glob_base.glob) globOptions = { ...globOptions, cwd: globOptions.cwd ? path.join(globOptions.cwd as string, glob_base.base) : null } variables.FILES = glob.sync(glob_base.glob, globOptions) as [] } else if (variables.IS_FILE && exists(src)) { variables.FILES = [src] } return variables } export const pathInfo = (src: string, altToken: boolean = false, cwd: string = null): PATH_INFO => { const srcParts = path.parse(src) let variables: PATH_INFO = { PATH: src } as PATH_INFO variables.DIR = srcParts.dir variables.NAME = srcParts.name variables.FILE_NAME = srcParts.base variables.FILE_EXT = srcParts.ext.replace('.', '') variables.PATH = src variables.IS_FILE = isFile(src) variables.IS_FOLDER = isFolder(src) variables.IS_EXPRESSION = src.match(altToken ? REGEX_VAR_ALT : REGEX_VAR) != null if (!variables.IS_FOLDER && !variables.IS_FILE) { variables.IS_GLOB = hasMagic(srcParts.base) } else { variables.IS_GLOB = false } if (variables.IS_GLOB) { const glob_base = globBase(src) variables.DIR = path.resolve(glob_base.base) variables.FILE_NAME = glob_base.glob variables.GLOB = glob_base.glob variables.GLOB_EXTENSIONS = getExtensions(glob_base.glob) variables.FILES = fg.sync(glob_base.glob, { dot: true, cwd: path.resolve(cwd || variables.DIR), absolute: true, caseSensitiveMatch: false }) } else if (variables.IS_FILE && exists(src)) { variables.FILES = [src] } return variables }