siegel
Version:
Web application development ecosystem
116 lines (115 loc) • 6.49 kB
JavaScript
//TODO blocked by ts: init global with ts types resolve
//TODO blocked by ts / eslint: zero config with ts / eslint
import { relative, join } from 'path';
import { existsSync, writeFileSync, readFileSync } from 'fs';
import { execSync as shell } from 'child_process';
import { PATHS, LOC_NAMES, IS_SELF_DEVELOPMENT } from '../core/constants.js';
import { isRunDirectly, requireJSON, globalNodeModulesPath, toPosixPath } from '../core/utils/index.js';
const packageJson = requireJSON(PATHS.packageJSON);
const { name: siegelPackageName, scripts: siegelPackageJSONScripts, type: siegelPackageType, engines: siegelPackageEngines, config: packageJsonConfig } = packageJson;
const toJSON = (data) => JSON.stringify(data, null, 4);
function main(isGlobal) {
if (IS_SELF_DEVELOPMENT) {
throw new Error('Attempt to initialize demo_app inside siegel pckg');
}
const INIT_LOC_NAMES = {
DEMO_APP_SERVER_DIR_NAME: 'server',
DEMO_APP_SERVER_EXTENDER: 'app_server.ts',
GITIGNOR_FILENAME: '.gitignore',
TS_GLOBALS: 'global'
};
const userServerPath = join(PATHS.cwd, INIT_LOC_NAMES.DEMO_APP_SERVER_DIR_NAME);
const userServerEntryPath = join(userServerPath, 'index.ts');
const pathToSiegelAbsolute = isGlobal
? `${globalNodeModulesPath()}/${siegelPackageName}`
: PATHS.packageRoot;
let pathToSiegelRelative = relative(PATHS.cwd, pathToSiegelAbsolute);
pathToSiegelRelative[0] != '.' && (pathToSiegelRelative = `./${pathToSiegelRelative}`);
const INIT_PATHS = {
pathToSiegelRelative,
pathToSiegelAbsolute,
siegelDemoAppServerPath: join(PATHS.demoProject, INIT_LOC_NAMES.DEMO_APP_SERVER_DIR_NAME),
siegelDemoAppPathShift: relative(PATHS.demoProject, PATHS.packageRoot),
siegelLibPath: join(pathToSiegelRelative, LOC_NAMES.LIB_OUTPUT_DIRNAME),
userServerEntryPath,
userServerExtenderPath: join(userServerPath, INIT_LOC_NAMES.DEMO_APP_SERVER_EXTENDER),
userServerTSConfigPath: join(userServerPath, LOC_NAMES.TS_JSON),
userTSConfigPath: join(PATHS.cwd, LOC_NAMES.TS_JSON),
userTSGlobal: join(PATHS.cwd, LOC_NAMES.TS_GLOBAL_TYPES),
userESLint: join(PATHS.cwd, LOC_NAMES.ESLINT_CONFIG_JS),
userPackageJson: join(PATHS.cwd, LOC_NAMES.PACKAGE_JSON),
userGitIgnore: join(PATHS.cwd, INIT_LOC_NAMES.GITIGNOR_FILENAME),
cwdRelativeUserServer: relative(PATHS.cwd, userServerEntryPath)
};
function createDemoApp() {
shell(`cp -r ${PATHS.demoProject}/. .`);
const pathToSiegelGlobalTs = toPosixPath(isGlobal ? INIT_PATHS.pathToSiegelAbsolute : INIT_PATHS.pathToSiegelRelative);
writeFileSync(INIT_PATHS.userTSGlobal, `import '${pathToSiegelGlobalTs}/${INIT_LOC_NAMES.TS_GLOBALS}'`);
writeFileSync(INIT_PATHS.userGitIgnore, `${LOC_NAMES.NODE_MODULES}\n${LOC_NAMES.DEMO_APP_OUTPUT_DIR_NAME}`);
}
function modifyDemoAppServerSiegelPaths() {
const replaceStringPart = toPosixPath(relative(INIT_PATHS.siegelDemoAppServerPath, PATHS.src));
const siegelEntryPointPath = isGlobal
? INIT_PATHS.pathToSiegelAbsolute
: siegelPackageName;
([INIT_PATHS.userServerEntryPath, INIT_PATHS.userServerExtenderPath])
.forEach(path => {
const newFileContent = readFileSync(path, 'utf8')
.replace(replaceStringPart, siegelEntryPointPath);
writeFileSync(path, newFileContent);
});
}
function modifyTSConfigs() {
const clientTSConfig = requireJSON(INIT_PATHS.userTSConfigPath);
clientTSConfig.extends = clientTSConfig.extends.replace(INIT_PATHS.siegelDemoAppPathShift, INIT_PATHS.pathToSiegelRelative);
Object.values(clientTSConfig.compilerOptions.paths)
.forEach(aliasValue => {
aliasValue[0] = aliasValue[0].replace(INIT_PATHS.siegelDemoAppPathShift, INIT_PATHS.siegelLibPath);
});
if (INIT_PATHS.siegelDemoAppPathShift) {
const { include } = clientTSConfig;
include[include.length - 1] = include.at(-1)
.replace(`${INIT_PATHS.siegelDemoAppPathShift}/`, '');
}
writeFileSync(INIT_PATHS.userTSConfigPath, toJSON(clientTSConfig));
const serverTSConfig = requireJSON(INIT_PATHS.userServerTSConfigPath);
serverTSConfig.include[serverTSConfig.include.length - 1]
= relative(userServerPath, INIT_PATHS.userTSGlobal);
writeFileSync(INIT_PATHS.userServerTSConfigPath, toJSON(serverTSConfig));
return serverTSConfig.compilerOptions.outDir;
}
function modifyESLintConfig() {
const ESLintConfig = readFileSync(INIT_PATHS.userESLint, 'utf-8');
const ESLintConfigModified = ESLintConfig.replace(INIT_PATHS.siegelDemoAppPathShift, siegelPackageName);
writeFileSync(INIT_PATHS.userESLint, ESLintConfigModified);
}
function modifyPackageJson() {
existsSync(INIT_PATHS.userPackageJson) || shell('npm init -y');
const packageJsonConfigBootArgs = packageJsonConfig.boot.split(' ');
packageJsonConfigBootArgs[packageJsonConfigBootArgs.length - 1] = INIT_PATHS.cwdRelativeUserServer;
const scriptsToRemove = ['prepublishOnly', '__validate', '__transpile', 'start_mini'];
scriptsToRemove.forEach(script => {
delete siegelPackageJSONScripts[script];
});
const servCommandRun = 'npm run serv';
const deployCommand = 'deploy';
const buildNodeCommand = 'build_node';
siegelPackageJSONScripts[deployCommand] = siegelPackageJSONScripts[deployCommand]
.replace(servCommandRun, `npm run ${buildNodeCommand} && ${servCommandRun}`);
siegelPackageJSONScripts[buildNodeCommand] = `npx tsc -p ./${INIT_LOC_NAMES.DEMO_APP_SERVER_DIR_NAME}`;
const targetPackageJSON = requireJSON(INIT_PATHS.userPackageJson);
targetPackageJSON.scripts = siegelPackageJSONScripts;
targetPackageJSON.type = siegelPackageType;
targetPackageJSON.engines = siegelPackageEngines;
packageJsonConfig.boot = packageJsonConfigBootArgs.join(' ');
targetPackageJSON.config = packageJsonConfig;
writeFileSync(INIT_PATHS.userPackageJson, toJSON(targetPackageJSON));
}
createDemoApp();
modifyDemoAppServerSiegelPaths();
modifyESLintConfig();
modifyTSConfigs();
modifyPackageJson();
}
isRunDirectly(import.meta) && main();
export default main;