>(\`${langUrl}\`)
+}
+
+const withI18n = (Component: ComponentType
): FC
=> (props: P) => {
+ const [messages, setMessages] = useState>({})
+ const locale = 'en'
+
+ useEffect(() => {
+ fetchTranslations(locale).then((response) => {
+ setMessages(response.data)
+ })
+ }, [])
+
+ return (
+ {}}
+ >
+
+
+ )
+}
+
+export default withI18n
+`
+}
+
+module.exports = {
+ getSourceCode,
+};
\ No newline at end of file
diff --git a/recipes/_ts/basic/snippets/tsconfig.json b/recipes/_ts/basic/snippets/tsconfig.json
new file mode 100644
index 0000000..c74eb4b
--- /dev/null
+++ b/recipes/_ts/basic/snippets/tsconfig.json
@@ -0,0 +1,15 @@
+{
+ "compilerOptions": {
+ "baseUrl": "./src",
+ "paths": {
+ "@/ui/*": ["ui/*"],
+ "@components/*": ["components/*"],
+ "@/constants/*": ["constants/*"],
+ "@/hooks/*": ["hooks/*"],
+ "@/i18n/*": ["i18n/*"],
+ "@/modules/*": ["modules/*"],
+ "@/utils/*": ["utils/*"]
+ }
+ },
+ "include": ["src"]
+}
diff --git a/recipes/_ts/basic/snippets/webpack.config.js b/recipes/_ts/basic/snippets/webpack.config.js
new file mode 100644
index 0000000..bdbec2e
--- /dev/null
+++ b/recipes/_ts/basic/snippets/webpack.config.js
@@ -0,0 +1,102 @@
+function getWebPackConfig(appName, { sourceDir, buildDir, portNumber }) {
+ return `
+const webpack = require("webpack");
+const path = require("path");
+const PACKAGE = require("./package.json");
+
+// WebPack Plugins
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+const CopyPlugin = require("copy-webpack-plugin");
+
+module.exports = {
+ entry: "./${sourceDir.main}/index.tsx",
+
+ module: {
+ rules: [
+ {
+ test: /\\.(ts|tsx)$/,
+ exclude: /node_modules/,
+ use: ["babel-loader"],
+ },
+ {
+ test: /\\.js$/,
+ exclude: /node_modules/,
+ use: ["babel-loader"],
+ },
+ {
+ test: /\\.svg$/,
+ use: ["@svgr/webpack", "file-loader"],
+ },
+ {
+ test: /\\.(png|jpg|jpeg|gif)$/i,
+ use: [
+ {
+ loader: "file-loader",
+ },
+ ],
+ },
+ ],
+ },
+
+ resolve: {
+ extensions: [".*", ".js", ".ts", ".tsx"],
+ alias: {
+ "@": path.resolve(__dirname, "src"),
+ },
+ },
+
+ output: {
+ path: path.resolve(__dirname, "${buildDir}"),
+ filename: "${appName}.js",
+ chunkFilename: "[name].js",
+ },
+
+ plugins: [
+ new webpack.HotModuleReplacementPlugin(),
+ new webpack.EnvironmentPlugin({
+ VERSION: PACKAGE.version,
+ }),
+ new HtmlWebpackPlugin({
+ inject: true,
+ template: path.resolve(__dirname, "${sourceDir.main}/${sourceDir.static}/index.html"),
+ APP_ROOT_ID: "${appName}",
+ APP_VERSION: PACKAGE.version,
+ }),
+ new CopyPlugin({
+ patterns: [
+ {
+ from: "./${sourceDir.main}/${sourceDir.static}/${sourceDir.images}",
+ to: "images",
+ },
+ {
+ from: "./${sourceDir.main}/${sourceDir.static}/${sourceDir.locales}/en.json",
+ to: "${sourceDir.locales}/en.json",
+ },
+ ],
+ }),
+ ],
+
+ devServer: {
+ open: true,
+ historyApiFallback: true,
+ static: {
+ directory: path.resolve(__dirname, "${sourceDir.main}/${sourceDir.static}"),
+ },
+ hot: true,
+ port: ${portNumber},
+ proxy: [
+ {
+ context: ["/api"], // list of paths to proxy
+ target: "http://YOUR_API_URL:9000",
+ changeOrigin: true,
+ secure: false, // optional: allows self-signed certificates
+ },
+ ],
+ },
+};
+`;
+}
+
+module.exports = {
+ getWebPackConfig,
+};
diff --git a/recipes/install.js b/recipes/install.js
index dd99256..a5b15bc 100644
--- a/recipes/install.js
+++ b/recipes/install.js
@@ -12,6 +12,10 @@ const slimSnippet = require("./slim/snippets");
const slimTypeScriptConfig = require("./_ts/slim/config");
const slimTypeScriptSnippet = require("./_ts/slim/snippets");
+// basic Typescript Version
+const basicTypeScriptConfig = require("./_ts/basic/config");
+const basicTypeScriptSnippet = require("./_ts/basic/snippets");
+
// Basic Javascript
const basicConfig = require(`./basic/config`);
const basicSnippet = require(`./basic/snippets`);
@@ -31,7 +35,7 @@ const {
getTwixtUIScripts
} = require("./utils");
-const install = function(directory, appName = '') {
+const install = function (directory, appName = '') {
CFonts.say("React Chef", {
type: 5,
font: "block", // define the font face
@@ -60,15 +64,17 @@ const install = function(directory, appName = '') {
const defaultProjectType = 'slim';
const twixtUIProjectType = 'twixtui';
const slimTypescriptProjectType = 'slim typescript';
+ const basicTypescriptProjectType = 'basic typescript';
let projectType = defaultProjectType;
const isSlimProject = (type) => type === defaultProjectType;
const isTwixtUIProject = (type) => type === twixtUIProjectType;
const isSlimTypeScriptProject = (type) => type === slimTypescriptProjectType;
- const isTypeScriptProject = (type) => isSlimTypeScriptProject(type);
+ const isBasicTypeScriptProject = (type) => type === basicTypescriptProjectType;
+ const isTypeScriptProject = (type) => isSlimTypeScriptProject(type) || isBasicTypeScriptProject(type);
tryAccess(baseDirPath)
.then(() => undefined, function onPathExist() {
- if(!directory){
+ if (!directory) {
error(
`Choose different App name. ${appName} is already exist in ${process.cwd()}`
);
@@ -81,7 +87,7 @@ const install = function(directory, appName = '') {
type: "list",
name: "projectType",
message: "choose your project type",
- choices: ["Slim", "Slim TypeScript", "Basic", "TwixtUI"],
+ choices: ["Slim", "Slim TypeScript", "Basic", "Basic TypeScript", "TwixtUI",],
default: "Slim",
},
]);
@@ -89,7 +95,7 @@ const install = function(directory, appName = '') {
.then((mainAnswer) => {
projectType = mainAnswer.projectType.toLowerCase();
log(`projectType: ${projectType}`);
- if(isSlimTypeScriptProject(projectType)){
+ if (isSlimTypeScriptProject(projectType)) {
log(`Slim Typescript - projectType: ${projectType}`);
getConfig = slimTypeScriptConfig.getConfig;
getModulesList = slimTypeScriptConfig.getModulesList;
@@ -98,7 +104,16 @@ const install = function(directory, appName = '') {
getWebPackConfig = slimTypeScriptSnippet.getWebPackConfig;
getDynamicSourceCode = slimTypeScriptSnippet.getDynamicSourceCode;
baseConfig = getConfig();
- } else if(isTwixtUIProject(projectType)){
+ } else if (isBasicTypeScriptProject(projectType)) {
+ log(`Basic TypeScript - projectType: ${projectType}`);
+ getConfig = basicTypeScriptConfig.getConfig;
+ getModulesList = basicTypeScriptConfig.getModulesList;
+ getDevModulesList = basicTypeScriptConfig.getDevModulesList;
+ getFileContent = basicTypeScriptSnippet.getFileContent;
+ getWebPackConfig = basicTypeScriptSnippet.getWebPackConfig;
+ getDynamicSourceCode = basicTypeScriptSnippet.getDynamicSourceCode;
+ baseConfig = getConfig();
+ } else if (isTwixtUIProject(projectType)) {
log(`TwixtUI - projectType: ${projectType}`);
getConfig = twixtUIConfig.getConfig;
getModulesList = twixtUIConfig.getModulesList;
@@ -132,7 +147,7 @@ const install = function(directory, appName = '') {
},
];
- if(baseConfig.canAdd.buildDir){
+ if (baseConfig.canAdd.buildDir) {
projectQuestions.push({
type: "input",
name: "buildDir",
@@ -181,7 +196,7 @@ const install = function(directory, appName = '') {
return inquirer.prompt(projectQuestions);
})
.then((answers) => {
- if(!directory) {
+ if (!directory) {
shell.mkdir(baseDirPath);
shell.cd(appName);
} else {
@@ -193,6 +208,7 @@ const install = function(directory, appName = '') {
})
.then((answers) => {
const isTypeScriptProjectType = isTypeScriptProject(projectType);
+ const isBasicTypeScriptProjectType = isBasicTypeScriptProject(projectType);
const fileExtension = isTypeScriptProjectType ? 'ts' : 'js';
const componentExtension = isTypeScriptProjectType ? 'tsx' : 'js';
if (baseConfig.canAdd.gitIgnore) {
@@ -207,7 +223,7 @@ const install = function(directory, appName = '') {
const tsConfigFileName = `tsconfig.json`;
createFile(tsConfigFileName, getFileContent(tsConfigFileName));
}
-
+
createFile(
'webpack.config.js',
getWebPackConfig(appName, {
@@ -233,20 +249,29 @@ const install = function(directory, appName = '') {
shell.mkdir(baseConfig.sourceDir.main);
shell.cd(baseConfig.sourceDir.main);
+
+ let projectTypeName;
+ if (isBasicTypeScriptProjectType) {
+ projectTypeName = 'basic';
+ } else if (isSlimTypeScriptProject(projectType)) {
+ projectTypeName = 'slim';
+ } else {
+ projectTypeName = projectType;
+ }
+
const sourceSubBase = isTypeScriptProjectType ? '_ts/' : '';
- const projectTypeName = isSlimTypeScriptProject(projectType) ? 'slim' : projectType;
const sourceSnippetDir = `${__dirname}/${sourceSubBase}${projectTypeName}/snippets/sources`;
const indexSourceFileName = `index.js`;
- const indexFileNameToCreateWithPath = !isTwixtUIProject(projectType) ? `index.${componentExtension}`: getTwixtUIIndexPath(projectType);
+ const indexFileNameToCreateWithPath = !isTwixtUIProject(projectType) ? `index.${componentExtension}` : getTwixtUIIndexPath(projectType);
createFile(indexFileNameToCreateWithPath, getDynamicSourceCode(indexSourceFileName, appName, baseConfig));
const appSourceFileName = `App.js`;
- const appFileNameToCreateWithPath = !isTwixtUIProject(projectType)? `App.${componentExtension}` : getTwixtUIHomePath(projectType);
+ const appFileNameToCreateWithPath = !isTwixtUIProject(projectType) ? `App.${componentExtension}` : getTwixtUIHomePath(projectType);
createFile(appFileNameToCreateWithPath, getDynamicSourceCode(appSourceFileName, appName, baseConfig));
if (baseConfig.canAdd.routes) {
- const RoutesFile = "Routes.js";
+ const RoutesFile = `Routes.${componentExtension}`;
createFile(
RoutesFile,
getDynamicSourceCode(RoutesFile, appName, baseConfig)
@@ -289,7 +314,7 @@ const install = function(directory, appName = '') {
shell.cp("-Rf", `${sourceSnippetDir}/i18n`, ".");
shell.cd(baseConfig.sourceDir.i18n);
- const withI18n = `withI18n.js`;
+ const withI18n = `withI18n.${componentExtension}`;
createFile(withI18n, getDynamicSourceCode(withI18n, appName, baseConfig));
shell.cd("..");
}
@@ -301,14 +326,14 @@ const install = function(directory, appName = '') {
shell.cd(
`${baseConfig.sourceDir.containers}/${baseConfig.modules.signIn}`
);
- const signInModule = "SignIn.js";
+ const signInModule = `SignIn.${componentExtension}`;
createFile(
signInModule,
getDynamicSourceCode(signInModule, appName, baseConfig)
);
shell.cd(`../${baseConfig.modules.dashboard}`);
- const dashboardModule = "Dashboard.js";
+ const dashboardModule = `Dashboard.${componentExtension}`;
createFile(
dashboardModule,
getDynamicSourceCode(dashboardModule, appName, baseConfig)
@@ -326,7 +351,7 @@ const install = function(directory, appName = '') {
shell.cd(
`${baseConfig.sourceDir.components}/${baseConfig.sourceDir.businessLogic}/Loader/${pageLoader}`
);
- const pageLoaderBlock = `${pageLoader}.js`;
+ const pageLoaderBlock = `${pageLoader}.${componentExtension}`;
createFile(
pageLoaderBlock,
getDynamicSourceCode(pageLoaderBlock, appName, baseConfig)
@@ -334,7 +359,7 @@ const install = function(directory, appName = '') {
const sidebar = "Sidebar";
shell.cd(`../../Region/${sidebar}`);
- const sidebarBlock = `${sidebar}.js`;
+ const sidebarBlock = `${sidebar}.${componentExtension}`;
createFile(
sidebarBlock,
getDynamicSourceCode(sidebarBlock, appName, baseConfig)
@@ -342,7 +367,7 @@ const install = function(directory, appName = '') {
const topBar = "TopBar";
shell.cd(`../../Region/${topBar}`);
- const topBarBlock = `${topBar}.js`;
+ const topBarBlock = `${topBar}.${componentExtension}`;
createFile(
topBarBlock,
getDynamicSourceCode(topBarBlock, appName, baseConfig)
@@ -376,16 +401,16 @@ const install = function(directory, appName = '') {
build: "webpack --mode production --progress",
...(answers.eslint
? {
- lint: "eslint src --ext .js",
- }
+ lint: "eslint src --ext .js",
+ }
: {}),
...(answers.prettier
? {
- prettier: "prettier --write src",
- }
+ prettier: "prettier --write src",
+ }
: {}),
clean: "rm -rf node_modules",
- ...(isTwixtUIProject(projectType) ? getTwixtUIScripts(): {})
+ ...(isTwixtUIProject(projectType) ? getTwixtUIScripts() : {})
};
delete packageFileObject.main;
shell.rm("package.json");
diff --git a/recipes/moduleMatrix.js b/recipes/moduleMatrix.js
index 87473eb..6b7bcfe 100644
--- a/recipes/moduleMatrix.js
+++ b/recipes/moduleMatrix.js
@@ -24,6 +24,7 @@ module.exports = {
babel,
slimDev: [...webpack, ...webpackPlugins, ...webpackLoaders, ...babel],
slimTypescriptDev: [...typeScriptTooling, ...webpack, ...webpackPlugins, ...webpackLoaders, ...babelWithTypeScript],
+ basicTypescriptDev: [...typeScriptTooling, ...webpack, ...webpackPlugins, ...webpackLoaders, ...babelWithTypeScript],
twixtUIDev: [...webpack, ...webpackPlugins, ...webpackLoaders, ...wepPackStyleLoaders, ...babel],
husky: 'npm i -D husky',
eslint: 'npx install-peerdeps --dev eslint-config-airbnb',