Skip to content

Commit

Permalink
Merge pull request #4 from ComfortablyCoding/refactor-providers
Browse files Browse the repository at this point in the history
refactor(providers): normalize structure
  • Loading branch information
Eventyret committed Sep 5, 2022
2 parents 78388ae + fc72c1e commit 0d1a53d
Show file tree
Hide file tree
Showing 11 changed files with 94 additions and 65 deletions.
23 changes: 20 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#!/usr/bin/env node
const { cli, init, log, resetProvider } = require(`./cli`);
const { genericQuestions } = require(`./core/`);
const {
genericQuestions,
configSetup,
installDependecies
} = require(`./core/`);

const {
detectPackageManager,
Expand All @@ -10,7 +14,6 @@ const {
config
} = require(`./utils`);
const { useTool } = require(`./providers/heroku`);
const { selectProvider } = require(`./providers/selectProvider`);

const input = cli.input;
const flags = cli.flags;
Expand All @@ -30,7 +33,21 @@ const { clear, debug } = flags;
await detectPackageManager();
await detectProjectType();
await genericQuestions();
await selectProvider();

const { hooks } = require(`${config.providersDir}/${config.provider}`);

const providerConfig = config.providers[config.provider];

// init provider hooks
config.hooks.addHooks(hooks);

// trigger provider setup
await configSetup();
await installDependecies();
await config.hooks.callHook(`prebuild`, providerConfig);
await config.hooks.callHook(`build`, providerConfig);
await config.hooks.callHook(`postbuild`, providerConfig);

config.useDocker && (await useTool());

await goodbye();
Expand Down
11 changes: 11 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"cli-welcome": "^2.2.2",
"do-wrapper": "^4.5.1",
"fs-extra": "^10.1.0",
"hookable": "^5.3.0",
"liquidjs": "^9.41.0",
"meow": "^9.0.0",
"new-github-issue-url": "^0.2.1",
Expand Down
2 changes: 1 addition & 1 deletion providers/heroku/apiKey.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const getApiKey = async () => {
`[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}`
)
.substring(11, 47);
setConfig({ apiToken });
setConfig({ providers: { heroku: { apiToken } } });
} catch (error) {
spinner.stopAndPersist({
symbol: `❌`,
Expand Down
51 changes: 31 additions & 20 deletions providers/heroku/heroku.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
const { config, spinner, chalk } = require(`../../utils`);
const { config, spinner, chalk, detectHerokuCLI } = require(`../../utils`);
const shell = require(`shelljs`);
const { createHerokuFile } = require(`./herokuFile`);
const { herokuQuestions } = require(`../../core`);
const message = require(`../../cli/message`);

const _createEnv = async () => {
const _createEnv = async herokuConfig => {
shell.exec(
`HEROKU_API_KEY="${config.apiToken}" heroku config:set WEBSITE_URL=$(heroku info -s | grep web_url | cut -d= -f2) APP_KEYS=${config.strapiSecrets.appKeys} API_TOKEN_SALT=${config.strapiSecrets.apiTokenSalt} ADMIN_JWT_SECRET=${config.strapiSecrets.adminJwtSecret} JWT_SECRET=${config.strapiSecrets.jwtSecret} NODE_ENV=${config.env} --app ${config.projectName}`,
`HEROKU_API_KEY="${herokuConfig.apiToken}" heroku config:set WEBSITE_URL=$(heroku info -s | grep web_url | cut -d= -f2) APP_KEYS=${config.strapiSecrets.appKeys} API_TOKEN_SALT=${config.strapiSecrets.herokuConfig.apiTokenSalt} ADMIN_JWT_SECRET=${config.strapiSecrets.adminJwtSecret} JWT_SECRET=${config.strapiSecrets.jwtSecret} NODE_ENV=${config.env} --app ${config.projectName}`,
{ silent: true }
);
spinner.stopAndPersist({
Expand All @@ -13,21 +16,21 @@ const _createEnv = async () => {
)} enviroment variables ${_herokuWithRegion()}`
});
};
const _createApp = async () => {
const _createApp = async herokuConfig => {
spinner.stopAndPersist({
symbol: `🌍`,
text: ` Spinning up ${chalk.magenta.bold(
config.projectName.toUpperCase()
)} app ${_herokuWithRegion()}`
});
shell.exec(
`HEROKU_API_KEY="${config.apiToken}" heroku create ${config.projectName} --region ${config.region}`
`HEROKU_API_KEY="${herokuConfig.apiToken}" heroku create ${config.projectName} --region ${config.region}`
);
};

const _createDatabase = async () => {
const _createDatabase = async herokuConfig => {
shell.exec(
`HEROKU_API_KEY="${config.apiToken}" heroku addons:create heroku-postgresql:hobby-dev --app ${config.projectName}`,
`HEROKU_API_KEY="${herokuConfig.apiToken}" heroku addons:create heroku-postgresql:hobby-dev --app ${config.projectName}`,
{ silent: true }
);
spinner.stopAndPersist({
Expand All @@ -41,9 +44,9 @@ const _createDatabase = async () => {
)} project ${_herokuWithRegion()}`
});
};
const _useContainer = async () => {
const _useContainer = async herokuConfig => {
shell.exec(
`HEROKU_API_KEY="${config.apiToken}" stack:set container --app ${config.projectName}`,
`HEROKU_API_KEY="${herokuConfig.apiToken}" stack:set container --app ${config.projectName}`,
{ silent: true }
);
spinner.stopAndPersist({
Expand All @@ -54,23 +57,23 @@ const _useContainer = async () => {
});
};

const destroyHerokuApp = async () => {
const destroyHerokuApp = async herokuConfig => {
spinner.stopAndPersist({
symbol: `💀`,
text: `Tearing down ${chalk.magenta.bold(
config.projectName.toUpperCase()
)} ${_herokuWithRegion()}`
});
shell.exec(
`HEROKU_API_KEY="${config.apiToken}" heroku apps:destroy ${config.projectName} --confirm ${config.projectName}`
`HEROKU_API_KEY="${herokuConfig.apiToken}" heroku apps:destroy ${config.projectName} --confirm ${config.projectName}`
);
spinner.stopAndPersist({
symbol: `🤠`,
text: `Note from ${chalk.magenta(
`heroku`
)} here are the apps that are left on your heroku account 👇 \n`
});
shell.exec(`HEROKU_API_KEY="${config.apiToken}" heroku apps`, {});
shell.exec(`HEROKU_API_KEY="${herokuConfig.apiToken}" heroku apps`, {});
console.log(`\n`);
};

Expand All @@ -80,14 +83,22 @@ const _herokuWithRegion = () => {
)}) \n`;
};

const herokuSetup = async () => {
_createApp();
config.useDocker && _useContainer();
_createEnv();
_createDatabase();
};

module.exports = {
herokuSetup,
herokuHooks: {
async prebuild() {
await message(`This tool will only create NEW project on heroku`);
await detectHerokuCLI();
await herokuQuestions();
},
async build(herokuConfig) {
await createHerokuFile(herokuConfig);
},
postbuild(herokuConfig) {
_createApp(herokuConfig);
config.useDocker && _useContainer(herokuConfig);
_createEnv(herokuConfig);
_createDatabase(herokuConfig);
}
},
destroyHerokuApp
};
6 changes: 4 additions & 2 deletions providers/heroku/herokuFile.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ const liquidEngine = new Liquid({
extname: `.liquid`
});

const createHerokuFile = async () => {
const createHerokuFile = async herokuConfig => {
try {
const template = liquidEngine.renderFileSync(`heroku`, {
dockerFile:
config.env === `production` ? `Dockerfile.prod` : `Dockerfile`,
env: config.env
});
const file = fs.createWriteStream(`${config.outDir}/heroku.yml`);
const file = fs.createWriteStream(
`${config.outDir}/${herokuConfig.outputFileName}`
);
file.write(template);
file.end();

Expand Down
8 changes: 2 additions & 6 deletions providers/heroku/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
const { herokuSetup, destroyHerokuApp } = require(`./heroku`);
const getApiKey = require(`./apiKey`);
const { createHerokuFile } = require(`./herokuFile`);
const { herokuHooks, destroyHerokuApp } = require(`./heroku`);
module.exports = {
getApiKey,
herokuSetup,
createHerokuFile,
hooks: herokuHooks,
destroyHerokuApp
};
4 changes: 2 additions & 2 deletions providers/render/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { renderSetup } = require(`./render`);
const { renderHooks } = require(`./render`);

module.exports = {
renderSetup
hooks: renderHooks
};
14 changes: 11 additions & 3 deletions providers/render/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const liquidEngine = new Liquid({
extname: `.liquid`
});

const renderSetup = async () => {
const renderSetup = async renderConfig => {
try {
const template = liquidEngine.renderFileSync(`render`, {
name: config.projectName,
Expand All @@ -17,7 +17,9 @@ const renderSetup = async () => {
region: config.region,
docker: config.useDocker
});
const file = fs.createWriteStream(`${config.outDir}/render.yaml`);
const file = fs.createWriteStream(
`${config.outDir}/${renderConfig.outputFileName}`
);
file.write(template);
file.end();

Expand All @@ -38,4 +40,10 @@ const renderSetup = async () => {
}
};

module.exports = { renderSetup };
module.exports = {
renderHooks: {
build(renderConfig) {
renderSetup(renderConfig);
}
}
};
27 changes: 0 additions & 27 deletions providers/selectProvider.js

This file was deleted.

12 changes: 11 additions & 1 deletion utils/config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const path = require(`path`);
const crypto = require(`crypto`);
const { createHooks } = require(`hookable`);

const _config = {
url: `https://github.com/strapi-community/strapi-tool-deployify`,
Expand All @@ -15,7 +16,6 @@ const _config = {
herokuCLI: false,
packageManager: `yarn`,
projectType: `js`,
apiToken: ``,
projectName: ``,
region: `eu`,
files: [`server`, `database`],
Expand All @@ -24,6 +24,16 @@ const _config = {
apiTokenSalt: crypto.randomBytes(32).toString(`hex`),
adminJwtSecret: crypto.randomBytes(32).toString(`hex`),
jwtSecret: crypto.randomBytes(32).toString(`hex`)
},
hooks: createHooks(),
providers: {
heroku: {
apiToken: ``,
outputFileName: `heroku.yml`
},
render: {
outputFileName: `render.yaml`
}
}
};
const setConfig = newConfig => Object.assign(_config, newConfig);
Expand Down

0 comments on commit 0d1a53d

Please sign in to comment.