cs-init
Version:
311 lines (282 loc) • 12.4 kB
JavaScript
const fs = require('fs');
const path = require('path');
const rootDir = process.env.INIT_CWD || process.cwd();
const packageJsonStr = fs.readFileSync(path.resolve(__dirname, 'package.json'), 'utf8');
const packageJson = JSON.parse(packageJsonStr);
packageJson.scripts = {
"dev": "webpack serve",
"build": "webpack",
};
// create package.json
const packageJsonPath = path.join(rootDir, 'package.json');
if (!fs.existsSync(packageJsonPath)) {
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
// fs.writeFileSync(packageJsonPath, packageJsonStr);
console.log('package.json created:', packageJsonPath);
} else {
console.log('package.json already exists:', packageJsonPath);
}
// create webpack-config.js
const webpackConfigPath = path.join(rootDir, 'webpack.config.js');
const webpackConfigContent = `
const fs = require('fs');
const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");
const fileNames = fs.readdirSync('./src').reduce((acc, name) => {
return { ...acc, [name.replace('.scss', '')]: './src/' + name };
}, {});
module.exports = () => {
const isDev = !!process.env.WEBPACK_SERVE || !!process.env.npm_config_debug;
return {
mode: isDev ? 'development' : 'production',
entry: fileNames,
watch: isDev,
watchOptions: {
ignored: '**/node_modules',
},
output: {
filename: '[name]',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\\.s?css$/, // besser mit \\
use: [
isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
'css-loader',
'sass-loader'
],
},
],
},
performance: {
hints: false,
maxEntrypointSize: 512000,
maxAssetSize: 512000
},
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: !isDev,
},
},
}),
new CssMinimizerPlugin(),
],
usedExports: true,
},
plugins: [
// MiniCssExtractPlugin nur aktiv, wenn in Production (build)
...(!isDev ? [
new MiniCssExtractPlugin({
filename: '[name].css',
})
] : []),
{
apply: (compiler) => {
compiler.hooks.done.tap('CleanDistPlugin', (stats) => {
if (isDev) return;
const distPath = path.resolve(compiler.options.output.path);
fs.readdir(distPath, (err, files) => {
if (err) throw err;
for (const file of files) {
if (file.indexOf('.') === -1) {
fs.unlink(path.join(distPath, file), (err) => {
if (err) throw err;
});
}
}
});
});
}
}
],
devServer: {
allowedHosts: "all",
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
"Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
},
static: [
{
directory: path.join(__dirname, 'assets'),
publicPath: '/assets',
},
{
directory: path.join(__dirname, 'dist'),
},
],
hot: false,
client: false,
compress: true,
port: 8080,
server: {
type: 'https',
options: {
key: fs.readFileSync('./certs/server.key'),
cert: fs.readFileSync('./certs/server.crt')
}
}
}
}
};
`;
if (!fs.existsSync(webpackConfigPath)) {
fs.writeFileSync(webpackConfigPath, webpackConfigContent.trim());
console.log('webpack.config.js created:', webpackConfigPath);
} else {
console.log('webpack.config.js already exists:', webpackConfigPath);
}
// create self signed default cert
const certsPath = path.join(rootDir, '/certs');
if (!fs.existsSync(certsPath)) {
fs.mkdirSync(certsPath);
}
const crtContent = `-----BEGIN CERTIFICATE-----
MIIFkzCCA3ugAwIBAgIUeqjkPB9fgYqmYnkSZ6OhGkb/sUEwDQYJKoZIhvcNAQEL
BQAwWTELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MB4X
DTI0MDczMTIyNDMzNVoXDTM0MDcyOTIyNDMzNVowWTELMAkGA1UEBhMCREUxEzAR
BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAyTm4W/FjiuLauPtcYjjhZJa0ikAuKloKLCARE/6A06rIZgLy8wCO
08N0m5w8qS/mxgRNK0Ku9NydMu5xkPLWWeb3f1qDM+1dLuyDNKNlrw6gGSNGT38n
7drfZjlEopI/U6BaKMOUCuzrk5BJTFy/nHXEq6aXKEA4M87xU3lrAMOVGo8/tFTm
2MKDuQRbwjK1xNdeGXI/rl8ceJZ8IcTKxm9LOl9KWyf8cCCZ18Rm35pOCVC6tme2
0fPy8voCDzkwdxfzn0Nr3dtBEIjxAqmDi5xv4PtmT5BLL0WJSbyoXQbbauqr3Eb/
PObhbEltU8NrF278NYldGsBKpup9qQ9/HjBcNlM8AaRrUoXjW7JEqZgxIfpSnQ+x
cW9Gx2NA+sJDDo6bIZT7rrOZeQieMUlciq4WwxLtgqFPzUWZNicXb9BxQCJTKBol
7ewQUjT9rKhmZO6g2Ym4XugDQhjT3DkpZHlQv61cBh3ACO+Zj5H0lWwZiOpqVxLc
fPW49KKKAOfAulSIQEr8e3iogMycpZx7rH4WgEKcWPU5OCTlPzauriXtjpqF4+KZ
dxyZZOtZHLE/mmuCpqruqsqb8tIcXd1CJcLkbBiBsaiFyC91k18sdUf5XPYW2xpx
7EMicHg1l8LUBAtLuWItoIlXyuwObnb2II/Q2q9Ue+u6KexR9pWMdc0CAwEAAaNT
MFEwHQYDVR0OBBYEFD+kI8uboR+BL7I9L5fYSOmLIhcwMB8GA1UdIwQYMBaAFD+k
I8uboR+BL7I9L5fYSOmLIhcwMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggIBAEivYDRRhl9TaICqRFq81tT0LnizQE60Zsk2OVKxSCtYNvqjYMXGvEXc
GOkFfiYd+UqxCjTfoSqCcWI03fR6cGNJYcW3DDE3OZIRi/956PNk7AfGKGvUM2Sr
ZDUYCMBzs+fK8EuAtZa5Q4UiuYqMatAroQZaM5j/x4+ML8GZ8lR/VsabavcEtdcF
rRn/wRWAgZAa7arz4NNA1UO3cu6kGJ9gSrFT6ErduI2fL3tbFP/P6lBON/ToHqCS
ZewXArl1J1UeMregpt9xitdyI8UOv3LXuKcQzUsvsjLUwRRXkv3vJ0wuqz12If5G
B/o+RQzpqw0/VrD84rI5wHyuiVW/dxWG6WHY3mhkgBiZoWYl+qs7mS7/3il88xcA
Iw1wXxzR+gaAEmDT5HWx6sdMbnxGErxmAFSQjBMsW6TmOTJmLuup/9O+zAREMPG3
QXRm3M0tghL6UDHCGeh7uvYCGG8QZPJhlcsVYYYCNk4YPmP6uTi5aR8DN4Vv8ht+
sQ1zqlMRGvGg8A3cP0O9qOGhCBu1V2Ctfdf+dkUs4BnokIe17f6jPdCG/+M6SL5G
0RRroUdjFeLeX9MtUlBtSLbEf8OUd1WxLJ8QETF+ljba4xDEB4ZB5ORbxl4xhK43
FZkeyIpuYJ3SUpdW30E3yNev6Obm8FWGoMtvGb57+5859HzmKnsL
-----END CERTIFICATE-----
`;
const certPath = path.join(certsPath, 'server.crt');
if (!fs.existsSync(certPath)) {
fs.writeFileSync(certPath, crtContent);
console.log('server.crt created:', certPath);
} else {
console.log('server.crt already exists:', certPath);
}
const keyContent = `-----BEGIN PRIVATE KEY-----
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
lTbrEOqph+jxzn/+CCw+x9JdlpWBHSI=
-----END PRIVATE KEY-----
`;
const keyPath = path.join(certsPath, 'server.key');
if (!fs.existsSync(keyPath)) {
fs.writeFileSync(keyPath, keyContent);
console.log('server.key created:', keyPath);
} else {
console.log('server.key already exists:', keyPath);
}
// create src
const srcDir = path.join(rootDir, 'src');
if (!fs.existsSync(srcDir)) {
fs.mkdirSync(srcDir);
console.log('Directory created:', srcDir);
} else {
console.log('Directory already exists:', srcDir);
}
// create default variation-01.js
const variation01JsContent = `
import './variation-01.scss';
import { waitFor, qs } from 'codeschmiede-toolkit';
(() => {
console.log('V1');
waitFor('body', (body) => {
if(!body) return;
});
})();
`;
const srcScript = path.join(srcDir, 'variation-01.js');
if (!fs.existsSync(srcScript)) {
fs.writeFileSync(srcScript, variation01JsContent);
console.log('variation-01.js created:', srcScript);
} else {
console.log('variation-01.js already exists:', srcScript);
}
// create default variation-01.scss
const srcStyle = path.join(srcDir, 'variation-01.scss');
if (!fs.existsSync(srcStyle)) {
fs.writeFileSync(srcStyle, '');
console.log('variation-01.scss created:', srcStyle);
} else {
console.log('variation-01.scss already exists:', srcStyle);
}
// create assets
const assetsDir = path.join(rootDir, 'assets');
if (!fs.existsSync(assetsDir)) {
fs.mkdirSync(assetsDir);
console.log('Directory created:', assetsDir);
} else {
console.log('Directory already exists:', assetsDir);
}