Skip to content

Commit 61a4df5

Browse files
authored
Merge pull request #16 from strapi-community/development
Development
2 parents e221c84 + c694ead commit 61a4df5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+2454
-2127
lines changed

.eslintrc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"es2021": true,
55
"node": true
66
},
7-
"extends": "eslint:recommended",
7+
"extends": ["eslint:recommended", "plugin:import/recommended"],
88
"parserOptions": {
99
"ecmaVersion": "latest"
1010
},

README.md

+21-9
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,30 @@ _Note_ that **RESET** will delete the `everything` from heroku related to the pr
5454

5555
- Easy deploy of your project to some cloud platforms
5656

57+
## 🌤 Cloud Support
58+
59+
Default - Create enviroments for strapi project, user will need to push to version control and deploy to cloud provider
60+
🚀 - Automatic - Creating apps, databases, setting up env variables.
61+
🚝 - Semi Automatic - Creating configuration files. Some manual steps required.
62+
63+
| **Provider** | Is Supported | Semi Automatic 🚝 / Automatic 🚀 | ⚙️ Notes |
64+
| ------------- | ------------ | -------------------------------- | -------------------------------------------- |
65+
| Heroku || 🚀 | Manual deployment |
66+
| Render || 🚝 | Push to repo, connect repo to render website |
67+
| AWS ||| Not Added yet |
68+
| Google ||| Not Added yet |
69+
| Digital Ocean ||| Not Added yet |
70+
| Platform.sh ||| Not Added yet |
71+
| Railway.app ||| Not Added yet |
72+
5773
## 🖐 Requirements
5874

5975
Supported Strapi Versions:
6076

61-
| Strapi Version | Is Compatible | Last Tested |
62-
| --------------- | ------------- | ----------- |
63-
| v3.x.x || Never |
64-
| v4.0.x || Never |
65-
| v4.1.x || Never |
66-
| v4.2.x || Never |
67-
| v4.3.x || Never |
68-
| Future Versions || Never |
77+
| Strapi Version | Is Compatible |
78+
| -------------- | ------------- |
79+
| v3 ||
80+
| v4 ||
6981

7082
**This tool will not work with Strapi v3 projects as it utilizes the V4 folder format that don't exist in the v3!**
7183

@@ -77,7 +89,7 @@ If interested please feel free to email the lead maintainer Simen at: simen@dehl
7789

7890
### Contributors
7991

80-
- [Daedalus](https://github.com/ComfortablyCoding)
92+
- [@ComfortablyCoding / Daedalus](https://github.com/ComfortablyCoding)
8193

8294
## ⭐️ Show your support
8395

cli/cli.js renamed to cli/args.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ const options = {
3131
flags
3232
};
3333

34-
module.exports = meow(helpText, options);
34+
module.exports = {
35+
getArgs: () => meow(helpText, options)
36+
};

cli/commands/generate/generate.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const { buildConfig } = require(`../../../config`);
2+
const { askGenerateQuestions } = require(`../../../core/questions`);
3+
const { getDetectableSettings } = require(`./getDetectableSettings`);
4+
const { triggerGenerateHooks } = require(`./triggerGenerateHooks`);
5+
6+
const generate = async () => {
7+
const { packageManager, projectType } = await getDetectableSettings();
8+
9+
const generateAnswers = await askGenerateQuestions();
10+
11+
// load configs
12+
let config = buildConfig({
13+
...generateAnswers,
14+
packageManager,
15+
projectType
16+
});
17+
18+
await triggerGenerateHooks(config);
19+
};
20+
21+
module.exports = {
22+
generate
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const chalk = require(`chalk`);
2+
const { pathExists } = require(`fs-extra`);
3+
const path = require(`path`);
4+
const { spinner } = require(`../../../utils`);
5+
const { file, getTemplate } = require(`../../../core`);
6+
const outputs = require(`../../outputs`);
7+
8+
const generateConfigFiles = async config => {
9+
const fileExtension = config.projectType;
10+
const environment = config.env;
11+
const dirPath = path.join(process.cwd(), `config`, `env`, config.env);
12+
13+
for (const fileName of config.files) {
14+
const projectFilePath = `config/env/${environment}/${fileName}.${fileExtension}`;
15+
const filePath = path.join(dirPath, `${fileName}.${fileExtension}`);
16+
17+
spinner.start(`Checking for existing ${projectFilePath}`);
18+
const hasExistingConfigFile = await pathExists(filePath);
19+
if (hasExistingConfigFile) {
20+
spinner.stopAndPersist({
21+
symbol: `🕵️‍♀️ `,
22+
text: `Detected ${chalk.yellow(`${projectFilePath}`)} \n`
23+
});
24+
25+
const backedUp = await file.backup(filePath);
26+
spinner.stopAndPersist({
27+
text: `${chalk.yellow(projectFilePath)} was backed up ${
28+
backedUp ? `successfully` : `unsuccessfuly`
29+
} \n`
30+
});
31+
}
32+
33+
const generatedFile = await file.generate(
34+
filePath,
35+
getTemplate(fileName, fileExtension)
36+
);
37+
if (generatedFile) {
38+
spinner.stopAndPersist({
39+
symbol: `⚙️ `,
40+
text: `Configured ${chalk.bold.green(`${projectFilePath}`)} \n`
41+
});
42+
} else {
43+
outputs.error(`Unable to generate the ${fileName} configuration file`);
44+
}
45+
}
46+
};
47+
48+
module.exports = {
49+
generateConfigFiles
50+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const chalk = require(`chalk`);
2+
const { spinner, detect } = require(`../../../utils`);
3+
4+
const getDetectableSettings = async () => {
5+
// package manager
6+
spinner.start(` 💻 Detecting package manager... `);
7+
const packageManager = await detect.packageManager();
8+
spinner.stopAndPersist({
9+
symbol: `📦 `,
10+
text: `${chalk.bold.yellow(packageManager.toUpperCase())} detected \n`
11+
});
12+
13+
// project type
14+
spinner.start(` 💻 Detecting Project type... `);
15+
const projectType = await detect.projectType();
16+
const projectTypeColoredText =
17+
projectType === `ts`
18+
? chalk.bold.blueBright(`TypeScript`)
19+
: chalk.bold.yellow(`JavaScript`);
20+
spinner.stopAndPersist({
21+
symbol: `🍿 `,
22+
text: `${projectTypeColoredText} project detected \n`
23+
});
24+
25+
return {
26+
packageManager,
27+
projectType
28+
};
29+
};
30+
31+
module.exports = {
32+
getDetectableSettings
33+
};

cli/commands/generate/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const { generate } = require(`./generate`);
2+
3+
module.exports = { name: `generate`, invoke: generate };
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const { generateDockerFile, installDependencies } = require(`../../../core`);
2+
const { generateConfigFiles } = require(`./generateConfigFiles`);
3+
4+
module.exports = {
5+
async internalprebuild({ config }) {
6+
await generateConfigFiles(config);
7+
await installDependencies(config.packageManager);
8+
},
9+
10+
async internalpostbuild({ config }) {
11+
if (config.useDocker) {
12+
await generateDockerFile(config);
13+
}
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const { loadProviderConfig } = require(`../../../config`);
2+
const internalGenerateHooks = require(`./internalGenerateHooks`);
3+
4+
const triggerGenerateHooks = async config => {
5+
const providerConfig = loadProviderConfig(config.provider);
6+
7+
// setup hooks
8+
const { hooks } = require(`${config.providersDir}/${config.provider}`);
9+
10+
// init hooks
11+
config.hooks.addHooks({
12+
...hooks,
13+
...internalGenerateHooks
14+
});
15+
16+
// trigger provider setup
17+
// provider specific pre build
18+
await config.hooks.callHook(`prebuild`, { providerConfig, config });
19+
20+
// general internal pre build
21+
await config.hooks.callHook(`internalprebuild`, { providerConfig, config });
22+
23+
// provider specific build
24+
await config.hooks.callHook(`build`, { providerConfig, config });
25+
26+
// provider specific post build
27+
await config.hooks.callHook(`postbuild`, { providerConfig, config });
28+
29+
// general internal pre build
30+
await config.hooks.callHook(`internalpostbuild`, { providerConfig, config });
31+
};
32+
33+
module.exports = {
34+
triggerGenerateHooks
35+
};

cli/commands/help.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const help = args => {
2+
args.showHelp(0);
3+
};
4+
5+
module.exports = { name: `help`, invoke: help };

cli/commands/index.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const generate = require(`./generate`);
2+
const reset = require(`./reset`);
3+
const help = require(`./help`);
4+
const commands = {
5+
generate,
6+
reset,
7+
help
8+
};
9+
10+
module.exports = commands;

cli/commands/reset/deleteEnvDirs.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const chalk = require(`chalk`);
2+
const path = require(`path`);
3+
const { file } = require(`../../../core`);
4+
const { spinner } = require(`../../../utils`);
5+
const outputs = require(`../../outputs`);
6+
7+
const deleteEnvDirs = async environments => {
8+
const directory = `${process.cwd()}/config/env`;
9+
10+
for (const env of environments) {
11+
const folderPath = path.join(directory, env);
12+
const removedEnv = await file.remove(folderPath);
13+
14+
if (removedEnv) {
15+
spinner.stopAndPersist({
16+
symbol: `🧹 `,
17+
text: `Cleand up ${chalk.yellow(`${folderPath}`)} folder \n`
18+
});
19+
} else {
20+
outputs.error(`Unable to clean ${chalk.yellow(`${folderPath}`)}`);
21+
}
22+
}
23+
};
24+
25+
module.exports = {
26+
deleteEnvDirs
27+
};

cli/commands/reset/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const { reset } = require(`./reset`);
2+
3+
module.exports = { name: `reset`, invoke: reset };

cli/commands/reset/reset.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const chalk = require(`chalk`);
2+
const { spinner, detect } = require(`../../../utils`);
3+
const { buildConfig } = require(`../../../config`);
4+
const { askResetQuestions } = require(`../../../core/questions`);
5+
const { deleteEnvDirs } = require(`./deleteEnvDirs`);
6+
const { triggerResetHooks } = require(`./triggerResetHooks`);
7+
8+
const reset = async () => {
9+
const projectType = await detect.projectType();
10+
11+
const detectedProviderName = await detect.provider();
12+
const { environments, provider } = await askResetQuestions(
13+
detectedProviderName
14+
);
15+
16+
const config = buildConfig({ projectType, provider });
17+
18+
spinner.start(` 🦄 ${chalk.yellow(`Searching for our directories...`)} `);
19+
await deleteEnvDirs(environments);
20+
spinner.stopAndPersist({
21+
symbol: `🦄`,
22+
text: ` Directory search ${chalk.yellow(` completed`)} \n`
23+
});
24+
await triggerResetHooks(config);
25+
26+
spinner.stopAndPersist({
27+
symbol: `🧹 `,
28+
text: `Project ${chalk.yellow(`cleaned`)} \n`
29+
});
30+
};
31+
32+
module.exports = { reset };
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const { loadProviderConfig } = require(`../../../config`);
2+
3+
const triggerResetHooks = async config => {
4+
const providerConfig = loadProviderConfig(config.provider);
5+
// setup hooks
6+
const { hooks } = require(`${config.providersDir}/${providerConfig.name}`);
7+
// init provider hooks
8+
config.hooks.addHooks(hooks);
9+
// trigger provider specific destroy
10+
await config.hooks.callHook(`destroy`, { providerConfig, config });
11+
};
12+
13+
module.exports = {
14+
triggerResetHooks
15+
};

cli/index.js

+7-12
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
const init = require(`./init`);
2-
const cli = require(`./cli`);
3-
const log = require(`./log`);
4-
const quickStart = require(`./quickstart`);
5-
const { resetProvider } = require(`./reset`);
6-
const message = require(`./message`);
1+
const { getArgs } = require(`./args`);
2+
const commands = require(`./commands`);
3+
const outputs = require(`./outputs`);
4+
75
module.exports = {
8-
init,
9-
cli,
10-
log,
11-
quickStart,
12-
resetProvider,
13-
message
6+
getArgs,
7+
commands,
8+
outputs
149
};

cli/init.js

-16
This file was deleted.

cli/log.js

-12
This file was deleted.

cli/message.js

-10
This file was deleted.

0 commit comments

Comments
 (0)