utquidem
Version:
The meta-framework suite designed from scratch for frontend-focused modern web development.
113 lines (96 loc) • 3.92 kB
text/typescript
import path from 'path';
import { getPackageVersion } from '@modern-js/generator-utils';
import { GeneratorContext, GeneratorCore } from '@modern-js/codesmith';
import { AppAPI } from '@modern-js/codesmith-api-app';
import { JsonAPI } from '@modern-js/codesmith-api-json';
import {
i18n,
DeployTypeSchema,
BooleanConfig,
CDNType,
LambdaType,
} from '@modern-js/generator-common';
const docLinks: Record<string, string> = {
oss: 'https://modernjs.dev/docs/guides/features/server-side/deploy/upload-cdn/oss',
cos: 'https://modernjs.dev/docs/guides/features/server-side/deploy/upload-cdn/cos',
fc: 'https://modernjs.dev/docs/guides/features/server-side/deploy/modern-server/use-lambda/aliyun-fc',
scf: 'https://modernjs.dev/docs/guides/features/server-side/deploy/modern-server/use-lambda/tencent-scf',
host: 'https://modernjs.dev/docs/guides/features/server-side/deploy/static-hosting',
docker:
'https://modernjs.dev/docs/guides/features/server-side/deploy/modern-server/any-container/docker',
webServer:
'https://modernjs.dev/docs/guides/features/server-side/deploy/modern-server/web-server',
};
const handleTemplateFile = async (
context: GeneratorContext,
generator: GeneratorCore,
appApi: AppAPI,
) => {
const jsonAPI = new JsonAPI(generator);
const ans = await appApi.getInputBySchema(DeployTypeSchema, context.config);
const appDir = context.materials.default.basePath;
const { disableModernServer, cdnType, lambdaType } = ans as Record<
string,
string
>;
const updateInfo: Record<string, string> = {
'scripts.deploy': 'modern deploy',
};
const addDep = async (dep: string) => {
const version = await getPackageVersion(dep);
updateInfo[`devDependencies.${dep}`] = version;
};
if (disableModernServer === BooleanConfig.YES) {
await addDep('@modern-js/plugin-static-hosting');
generator.logger.info(
`未使用 Modern.js 内置的服务器, 你可能希望使用静态 Web 服务器部署应用, 相关内容可以查看官网:\n- ${docLinks.host}\n`,
);
}
if (cdnType !== CDNType.NO) {
await addDep(`@modern-js/plugin-cdn-${cdnType}`);
generator.logger.info(
`使用 ${cdnType} 平台上传资源文件, 相关内容可以查看官网:\n- ${docLinks[cdnType]}\n`,
);
} else {
generator.logger.info(
`未选择 CDN 上传平台, 你可能希望直接使用内置的 Web Server 托管静态资源, 相关内容可以查看官网:\n- ${docLinks.webServer}\n`,
);
}
if (lambdaType && lambdaType !== LambdaType.NO) {
await addDep(`@modern-js/plugin-lambda-${lambdaType}`);
generator.logger.info(
`使用 ${lambdaType} 部署应用, 相关内容可以查看官网:\n- ${docLinks[lambdaType]}\n`,
);
} else {
generator.logger.info(
`未选择云函数部署应用, 你可能希望使用其他容器部署应用, 相关内容可以查看官网: \n- ${docLinks.docker}\n`,
);
}
await jsonAPI.update(
context.materials.default.get(path.join(appDir, '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/cloud-deploy-generator`);
generator.logger.debug(`context=${JSON.stringify(context)}`);
generator.logger.debug(`context.data=${JSON.stringify(context.data)}`);
await handleTemplateFile(context, generator, appApi);
await appApi.runInstall();
generator.logger.debug(`forge @modern-js/cloud-deploy-generator succeed `);
};