2021-05-03 12:15:13 -05:00
|
|
|
import { promises as fs, readFileSync } from 'fs';
|
2021-05-17 17:52:11 -05:00
|
|
|
import { posix } from 'path';
|
2021-05-03 12:15:13 -05:00
|
|
|
import arg from 'arg';
|
2021-12-13 15:59:08 -05:00
|
|
|
import { globby as glob } from 'globby';
|
2021-05-03 12:15:13 -05:00
|
|
|
import tar from 'tar';
|
|
|
|
|
2021-05-17 17:52:11 -05:00
|
|
|
const { resolve, dirname, sep, join } = posix;
|
|
|
|
|
2021-05-03 12:15:13 -05:00
|
|
|
/** @type {import('arg').Spec} */
|
|
|
|
const spec = {
|
|
|
|
'--tgz': Boolean,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default async function copy() {
|
|
|
|
let { _: patterns, ['--tgz']: isCompress } = arg(spec);
|
|
|
|
patterns = patterns.slice(1);
|
|
|
|
|
|
|
|
if (isCompress) {
|
|
|
|
const files = await glob(patterns, { gitignore: true });
|
|
|
|
const rootDir = resolveRootDir(files);
|
|
|
|
const destDir = rootDir.replace(/^[^/]+/, 'dist');
|
|
|
|
|
|
|
|
const templates = files.reduce((acc, curr) => {
|
|
|
|
const name = curr.replace(rootDir, '').slice(1).split(sep)[0];
|
|
|
|
if (acc[name]) {
|
|
|
|
acc[name].push(resolve(curr));
|
|
|
|
} else {
|
|
|
|
acc[name] = [resolve(curr)];
|
|
|
|
}
|
|
|
|
return acc;
|
|
|
|
}, {});
|
|
|
|
|
|
|
|
let meta = {};
|
|
|
|
return Promise.all(
|
|
|
|
Object.entries(templates).map(([template, files]) => {
|
|
|
|
const cwd = resolve(join(rootDir, template));
|
|
|
|
const dest = join(destDir, `${template}.tgz`);
|
2021-05-03 12:47:51 -05:00
|
|
|
const metafile = files.find((f) => f.endsWith('meta.json'));
|
2021-05-03 12:15:13 -05:00
|
|
|
if (metafile) {
|
2021-05-03 12:47:51 -05:00
|
|
|
files = files.filter((f) => f !== metafile);
|
2021-05-03 12:15:13 -05:00
|
|
|
meta[template] = JSON.parse(readFileSync(metafile).toString());
|
|
|
|
}
|
2021-05-03 12:47:51 -05:00
|
|
|
return fs.mkdir(dirname(dest), { recursive: true }).then(() =>
|
|
|
|
tar.create(
|
|
|
|
{
|
|
|
|
gzip: true,
|
|
|
|
portable: true,
|
|
|
|
file: dest,
|
|
|
|
cwd,
|
|
|
|
},
|
|
|
|
files.map((f) => f.replace(cwd, '').slice(1))
|
|
|
|
)
|
|
|
|
);
|
2021-05-03 12:15:13 -05:00
|
|
|
})
|
|
|
|
).then(() => {
|
|
|
|
if (Object.keys(meta).length > 0) {
|
|
|
|
return fs.writeFile(resolve(destDir, 'meta.json'), JSON.stringify(meta, null, 2));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const files = await glob(patterns);
|
2021-05-03 12:47:51 -05:00
|
|
|
await Promise.all(
|
|
|
|
files.map((file) => {
|
2021-05-03 12:15:13 -05:00
|
|
|
const dest = resolve(file.replace(/^[^/]+/, 'dist'));
|
2021-05-03 12:47:51 -05:00
|
|
|
return fs.mkdir(dirname(dest), { recursive: true }).then(() => fs.copyFile(resolve(file), dest));
|
|
|
|
})
|
|
|
|
);
|
2021-05-03 12:15:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
function resolveRootDir(files) {
|
|
|
|
return files
|
|
|
|
.reduce((acc, curr) => {
|
|
|
|
const currParts = curr.split(sep);
|
|
|
|
if (acc.length === 0) return currParts;
|
|
|
|
const result = [];
|
|
|
|
currParts.forEach((part, i) => {
|
|
|
|
if (acc[i] === part) result.push(part);
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
}, [])
|
|
|
|
.join(sep);
|
2021-04-30 16:33:35 -05:00
|
|
|
}
|