code-workshop-kit
Version:
The future of remote code workshops & training
135 lines • 5.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.scaffoldFiles = exports.scaffold = exports.copyTemplates = void 0;
const core_js_1 = require("@open-wc/create/dist/core.js");
const chalk_1 = __importDefault(require("chalk"));
const command_line_args_1 = __importDefault(require("command-line-args"));
const esm_1 = __importDefault(require("esm"));
const fs_1 = __importDefault(require("fs"));
const glob_1 = __importDefault(require("glob"));
const path_1 = __importDefault(require("path"));
// Fork from @open-wc/create to allow functions that return strings inside data obj. If we add this to @open-wc/create both forks can be deleted here.
function processTemplate(_fileContent, data) {
let fileContent = _fileContent;
if (data) {
Object.keys(data).forEach((key) => {
let replacement = '';
if (typeof data[key] === 'function') {
replacement = data[key]();
}
else {
replacement = data[key];
}
fileContent = fileContent.replace(new RegExp(`<%= ${key} %>`, 'g'), replacement);
});
}
return fileContent;
}
// Fork from @open-wc/create
function copyTemplates(fromGlob, toDir = process.cwd(), data) {
return new Promise((resolve) => {
glob_1.default(fromGlob, { dot: true }, (err, files) => {
const copiedFiles = [];
files.forEach((filePath) => {
if (!fs_1.default.lstatSync(filePath).isDirectory()) {
const fileContent = core_js_1.readFileFromPath(filePath);
if (fileContent !== false) {
const processed = processTemplate(fileContent, data);
// find path write to (force / also on windows)
const replace = path_1.default.join(fromGlob.replace(/\*/g, '')).replace(/\\(?! )/g, '/');
const toPath = filePath.replace(replace, `${toDir}/`);
// write file to path?
copiedFiles.push({ toPath, processed });
}
}
});
resolve(copiedFiles);
});
});
}
exports.copyTemplates = copyTemplates;
const scaffold = async (_opts) => {
const opts = {
force: false,
logStartup: true,
dir: '/',
..._opts,
};
const logger = (str) => {
if (opts.logStartup !== false) {
// eslint-disable-next-line no-console
console.log(str);
}
};
logger(chalk_1.default.bold('code-workshop-kit scaffold started...'));
logger('');
if (opts.dir && opts.dir.startsWith('/')) {
// eslint-disable-next-line no-param-reassign
opts.dir = `.${opts.dir}`;
}
const pathToWorkshop = path_1.default.resolve(process.cwd(), opts.dir, 'cwk.config.js');
const pathToOutputDir = path_1.default.resolve(pathToWorkshop, '../', 'participants');
const pathToInputDir = path_1.default.resolve(pathToWorkshop, '../', 'template');
if (opts.workshop || fs_1.default.existsSync(pathToWorkshop)) {
let workshop;
if (opts.workshop) {
({ workshop } = opts);
}
else {
// We know we are in NodeJS so force module typecast to NodeModule
const esmRequire = esm_1.default(module);
workshop = esmRequire(pathToWorkshop).default;
}
const { participants = [], templateData } = workshop;
participants.forEach((name) => {
logger(`${chalk_1.default.white('Scaffolding for:')} ${chalk_1.default.cyanBright(name)}`);
copyTemplates(path_1.default.resolve(process.cwd(), `${pathToInputDir}/**/*`), path_1.default.resolve(process.cwd(), `${pathToOutputDir}/${name}`), {
participantName: name,
...templateData,
}).then((files) => {
files.forEach((file) => {
core_js_1.writeFileToPathOnDisk(file.toPath, file.processed, {
override: opts.force,
ask: false,
});
});
});
});
}
else {
throw new Error(`Error: Cannot find cwk.config.js at ${pathToWorkshop}`);
}
if (opts.logStartup !== false) {
logger('');
}
};
exports.scaffold = scaffold;
const scaffoldFiles = (opts = {}) => {
let cliConfig = {};
if (opts.argv) {
const scaffoldDefinitions = [
{
name: 'force',
alias: 'f',
type: Boolean,
description: 'If set, it will (re-)scaffold for the participants and overwrite the current files without warning',
},
{
name: 'dir',
alias: 'd',
type: String,
description: 'If set, will search for cwk.config.js in this directory',
},
];
cliConfig = command_line_args_1.default(scaffoldDefinitions, { argv: opts.argv });
}
exports.scaffold({
...opts,
...cliConfig,
});
};
exports.scaffoldFiles = scaffoldFiles;
//# sourceMappingURL=scaffold-files.js.map