import path from 'path';
import { GeneratorContext, GeneratorCore } from '@modern-js/codesmith';
import { AppAPI } from '@modern-js/codesmith-api-app';
import { JsonAPI } from '@modern-js/codesmith-api-json';
import { FsAPI } from '@modern-js/codesmith-api-fs';
import {
fs,
isTsProject,
getPackageManager,
getPackageManagerText,
} from '@modern-js/generator-utils';
import { i18n, localeKeys } from './locale';
const handleTemplateFile = async (
context: GeneratorContext,
generator: GeneratorCore,
appApi: AppAPI,
) => {
const fsAPI = new FsAPI(generator);
const isTs = isTsProject(context.materials.default.basePath);
const language = isTs ? 'ts' : 'js';
const { material } = context.current!;
const { projectPath = '' } = context.config;
await fsAPI.renderDir(
material,
'templates/base-template/**/*',
(resourceKey: string) =>
resourceKey
.replace('templates/base-template/', projectPath)
.replace('.handlebars', `.${language}`),
{
nodir: true,
dot: true,
},
);
if (context.config.isSubGenerator) {
await appApi.forgeTemplate(
`templates/init-template/${language}**/*`,
undefined,
(resourceKey: string) =>
resourceKey
.replace(`templates/init-template/${language}/`, projectPath)
.replace('.handlebars', ''),
);
}
if (isTs) {
await appApi.forgeTemplate(
'templates/ts-template/**/*',
undefined,
(resourceKey: string) =>
resourceKey
.replace('templates/ts-template/', projectPath)
.replace('.handlebars', ''),
);
const appDir = context.materials.default.basePath;
const typePath = path.join(
appDir,
projectPath,
'src',
'modern-app-env.d.ts',
);
const appendContent = `///
///
`;
if (fs.existsSync(typePath)) {
const npmrc = fs.readFileSync(typePath, 'utf-8');
fs.writeFileSync(typePath, `${npmrc}\n${appendContent}`, 'utf-8');
} else {
fs.ensureFileSync(typePath);
fs.writeFileSync(typePath, appendContent, 'utf-8');
}
} else {
await appApi.forgeTemplate(
'templates/js-template/**/*',
undefined,
(resourceKey: string) =>
resourceKey
.replace('templates/js-template/', projectPath)
.replace('.handlebars', ''),
);
}
const updateInfo: Record = {
main: './electron/main.js',
'scripts.dev:electron': 'modern dev electron',
'scripts.build:electron': 'modern build electron',
'devDependencies.@modern-js/plugin-electron': '^1.0.0',
'devDependencies.electron': '^13',
'devDependencies.electron-builder': '^22.11.7',
'devDependencies.@babel/runtime': '^7.15.4',
'devDependencies.@babel/register': '^7.15.3',
};
if (context.config.isSubGenerator) {
updateInfo.modernConfig = {};
}
const jsonAPI = new JsonAPI(generator);
await jsonAPI.update(
context.materials.default.get(path.join(projectPath, 'package.json')),
{
query: {},
update: { $set: updateInfo },
},
);
};
export default async (context: GeneratorContext, generator: GeneratorCore) => {
const appApi = new AppAPI(context, generator);
const { locale } = context.config;
i18n.changeLanguage({ locale });
appApi.i18n.changeLanguage({ locale });
if (!(await appApi.checkEnvironment())) {
// eslint-disable-next-line no-process-exit
process.exit(1);
}
generator.logger.debug(`start run @modern-js/electron-generator`);
generator.logger.debug(`context=${JSON.stringify(context)}`);
generator.logger.debug(`context.data=${JSON.stringify(context.data)}`);
await handleTemplateFile(context, generator, appApi);
if (!context.config.isSubGenerator) {
try {
await appApi.runInstall();
} catch (e) {
generator.logger.error(e);
// eslint-disable-next-line no-process-exit
process.exit(1);
}
}
if (!context.config.isSubGenerator) {
const packageManager =
context.config.packageManager || (await getPackageManager(process.cwd()));
appApi.showSuccessInfo(
i18n.t(localeKeys.success, {
packageManager: getPackageManagerText(packageManager),
}),
);
}
generator.logger.debug(`forge @modern-js/electron-generator succeed `);
};