@arc-fusion/cli
Version:
CLI for running Arc Fusion on your local machine
83 lines (64 loc) • 2.05 kB
JavaScript
const path = require('path')
const { glob } = require('glob')
const { rename } = require('fs/promises')
const extensions = ['js', 'jsx', 'ts', 'tsx']
const WILDCARD_LEVELS = {
features: 2
}
const isTest = (f) =>
/(\/_+(tests?|snapshots?)_+\/|\.test\.js|\.snap$)/.test(f)
const isNotTest = (f) => !isTest(f)
function arrayGlob (items) {
return items && items.length > 1
? `{${items.join(',')}}`
: items && items.length
? items[0]
: ''
}
const extensionGlob = `.${arrayGlob(extensions)}`
async function getCollection (projectRoot, collection, outputTypes) {
const wildcardLevels = WILDCARD_LEVELS[collection] || 1
const wildcardGlob = `${path.sep}*`.repeat(wildcardLevels)
const baseDir = path.join(projectRoot, 'components', collection)
const genericFiles = await glob(
path.join(baseDir, `${wildcardGlob}${extensionGlob}`),
{ nodir: true }
)
const specificFiles =
outputTypes && outputTypes.length
? await glob(
path.join(
baseDir,
wildcardGlob,
`${arrayGlob(outputTypes)}${extensionGlob}`
),
{ nodir: true }
)
: []
return genericFiles.concat(specificFiles).filter(isNotTest)
}
async function migrate (projectRoot) {
projectRoot = projectRoot || require('../environment').PROJECT_ROOT
const outputTypeFiles = await getCollection(projectRoot, 'output-types')
const outputTypes = outputTypeFiles.map(
(filePath) => path.parse(filePath).name
)
const [chainFiles, featureFiles, layoutFiles] = await Promise.all([
getCollection(projectRoot, 'chains', outputTypes),
getCollection(projectRoot, 'features', outputTypes),
getCollection(projectRoot, 'layouts', outputTypes)
])
const componentFiles = [].concat(
outputTypeFiles,
chainFiles,
featureFiles,
layoutFiles
)
return Promise.all(
componentFiles
.filter((filePath) => !filePath.endsWith('x'))
.map((filePath) => rename(filePath, `${filePath}x`))
)
}
module.exports = migrate