initializer-page/src/components/utils/Zip.js (86 lines of code) (raw):

import get from 'lodash.get' const FILE_EXTENSION = { js: 'javascript', md: 'markdown', kt: 'kotlin', kts: 'kotlin', gradle: 'groovy', gitignore: 'git', java: 'java', xml: 'xml', properties: 'properties', groovy: 'groovy', html: 'html', css: 'css', } export const getLanguage = file => { if (!file.includes(`.`)) { return null } const extension = file.split(`.`).pop() return get(FILE_EXTENSION, extension, null) } export const createTree = (files, path, fileName, zip) => { return new Promise(resolve => { const recursive = (pfiles, ppath, pfileName, pzip, pdepth) => { const type = pfiles[ppath].dir ? 'folder' : 'file' const item = { type, filename: pfileName, path: `/${ppath}`, hidden: pdepth === 1 && type === 'folder' ? true : null, } if (type === 'folder') { const children = [] pzip.folder(ppath).forEach((relativePath, file) => { const pathArray = relativePath.split('/') if (pathArray.length === 1 || (file.dir && pathArray.length === 2)) { children.push( recursive( pfiles, ppath + relativePath, relativePath, pzip, pdepth + 1 ) ) } }) item.children = children.sort((a, b) => (a.path > b.path ? 1 : -1)) item.filename = pfileName.substring(0, pfileName.length - 1) } else { item.language = getLanguage(item.filename) if (item.language) { pfiles[ppath].async('string').then(content => { item.content = content }) } } return item } const tree = recursive(files, path, fileName, zip, 0) const selected = tree.children.find( item => ['pom.xml', 'build.gradle', 'build.gradle.kts','settings.gradle','settings.gradle.kts',].indexOf(item.filename) > -1 ) if (selected) { files[selected.path.substring(1)].async('string').then(content => { selected.content = content resolve({ tree, selected }) }) } else { resolve({ tree, selected: null }) } }) } export const findRoot = zip => { const root = Object.keys(zip.files).filter(filename => { const pathArray = filename.split('/') if (zip.files[filename].dir && pathArray.length === 2) { return true } return false })[0] return root.substring(0, root.length - 1) }