Skip to content

Commit e7a4db0

Browse files
authored
feat: eslint (#78)
* chore: add eslint * chore: vscode prettier formating * ci: lint workflow * ci(lint): run on node 14 * chore: vscode recommended extensions * chore: add eslint recommended plugin
1 parent 892e025 commit e7a4db0

File tree

7 files changed

+1710
-365
lines changed

7 files changed

+1710
-365
lines changed

.eslintrc.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module.exports = {
2+
env: {
3+
browser: true,
4+
commonjs: true,
5+
es2020: true,
6+
},
7+
extends: ["eslint:recommended", "airbnb/base", "plugin:prettier/recommended"],
8+
parserOptions: {
9+
ecmaVersion: 12,
10+
},
11+
rules: {
12+
"no-console": "off",
13+
},
14+
};

.github/workflows/lint.yml

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
2+
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
3+
4+
name: Eslint
5+
6+
on:
7+
push:
8+
branches: [master]
9+
pull_request:
10+
branches: [master]
11+
12+
jobs:
13+
build:
14+
runs-on: ubuntu-latest
15+
16+
steps:
17+
- name: Get npm cache directory
18+
id: npm-cache
19+
run: |
20+
echo "::set-output name=dir::$(npm config get cache)"
21+
- uses: actions/cache@v2
22+
with:
23+
path: ${{ steps.npm-cache.outputs.dir }}
24+
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
25+
restore-keys: |
26+
${{ runner.os }}-node-
27+
- uses: actions/checkout@v2
28+
- name: Use Node.js ${{ matrix.node-version }}
29+
uses: actions/setup-node@v1
30+
with:
31+
node-version: "14.x"
32+
- run: npm ci
33+
- run: npm run lint

.vscode/extensions.json

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
3+
}

.vscode/settings.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"editor.formatOnSave": true,
3+
"editor.defaultFormatter": "esbenp.prettier-vscode",
4+
"eslint.enable": true,
5+
"eslint.validate": ["javascript"]
6+
}

lib/cli.js

+65-59
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,29 @@
1-
"use strict";
2-
const yargs_parser = require("yargs-parser");
1+
const yargsParser = require("yargs-parser");
32
const path = require("path");
43
const chalk = require("chalk");
5-
const langsList = require("./countries.json");
64
const inquirer = require("inquirer");
75
const fuzzy = require("fuzzy");
86
const ora = require("ora");
97
const { extract } = require("pacote");
108
const glob = require("fast-glob");
119
const fs = require("fs-extra");
1210
const os = require("os");
11+
1312
const packageName = "html5-boilerplate";
14-
const tempDir = os.tmpdir() + `/${packageName}-staging`;
13+
const tempDir = `${os.tmpdir()}/${packageName}-staging`;
1514
const elapsed = require("elapsed-time-logger");
1615
const compareVersions = require("compare-versions");
16+
const langsList = require("./countries.json");
17+
1718
let spinner;
1819
inquirer.registerPrompt(
1920
"autocomplete",
2021
require("inquirer-autocomplete-prompt")
2122
);
22-
module.exports = async (argvs) => {
23-
const argv = yargs_parser(argvs, {
24-
alias: { release: ["r"], yes: ["y"] },
25-
});
26-
const timer = elapsed.start();
27-
const version = (argv["release"] || "latest").toString();
28-
const targetDir = path.resolve(argv["_"][0] || "./");
29-
const override = await checkFolder(targetDir, argv);
30-
if (!override) {
31-
console.log(chalk.red("Aborted"));
32-
return;
33-
}
34-
spinner = ora(
35-
`Downloading ${packageName} version '${version}' to ${targetDir}`
36-
).start();
37-
await fs.ensureDir(tempDir);
38-
try {
39-
const { from: nameWithVersion } = await extract(
40-
packageName + "@" + version,
41-
tempDir,
42-
{}
43-
);
44-
await fs.copy(tempDir + "/dist", targetDir);
45-
const timerDownloaded = timer.get();
46-
await onLoad(targetDir, version, argv);
47-
spinner.succeed(
48-
` ${nameWithVersion} copied to ${targetDir} in ${timerDownloaded}. Have fun!`
49-
);
50-
return;
51-
} catch (err) {
52-
if (err.code === "ETARGET") {
53-
const msg = chalk.red(
54-
`version '${err.wanted}' not found in npm registry\navailable versions:\n`
55-
);
56-
spinner.fail(msg + err.versions.reverse().join(" | "));
57-
throw err.code;
58-
}
59-
spinner.fail("✖ Unexpected error");
60-
throw new Error(err);
61-
} finally {
62-
await fs.remove(tempDir);
63-
}
64-
};
6523

6624
const checkFolder = async (targetDir, argv) => {
6725
const folderExists = await fs.pathExists(targetDir);
68-
if (!folderExists) {
69-
return true;
70-
}
71-
if (argv["yes"] === true) {
26+
if (!folderExists || argv.yes === true) {
7227
return true;
7328
}
7429
const folderFiles = await fs.readdir(targetDir);
@@ -81,17 +36,23 @@ const checkFolder = async (targetDir, argv) => {
8136
});
8237
return override;
8338
}
39+
return true;
8440
};
8541

8642
const onLoad = async (targetDir, version, argv) => {
8743
// see https://github.com/mrmlnc/fast-glob#how-to-write-patterns-on-windows
8844
const npmIgnoreFiles = await glob(
8945
`${targetDir.replace(/\\/g, "/")}/**/.npmignore`
9046
);
91-
for (const npmIgnore of npmIgnoreFiles) {
92-
await fs.rename(npmIgnore, npmIgnore.replace(/\.npmignore$/, ".gitignore"));
93-
}
94-
const skipPrompts = argv["yes"] === true;
47+
await Promise.all(
48+
npmIgnoreFiles.map((fileName) => {
49+
return fs.rename(
50+
fileName,
51+
fileName.replace(/\.npmignore$/, ".gitignore")
52+
);
53+
})
54+
);
55+
const skipPrompts = argv.yes === true;
9556

9657
if (skipPrompts) {
9758
return;
@@ -100,11 +61,11 @@ const onLoad = async (targetDir, version, argv) => {
10061
const langListOut = [];
10162
/* istanbul ignore if */
10263
if (!argv.lang) {
103-
for (const { title, value } of langsList) {
64+
langsList.forEach(({ title, value }) => {
10465
const text = `${title} (${value})`;
10566
langListMap[text] = value;
10667
langListOut.push(text);
107-
}
68+
});
10869
langListOut.splice(1, 0, "Enter custom");
10970
}
11071
spinner.stop();
@@ -121,6 +82,7 @@ const onLoad = async (targetDir, version, argv) => {
12182
type: "input",
12283
name: "customLang",
12384
message: "Enter custom language code",
85+
// eslint-disable-next-line
12486
when: ({ langChoice }) => !argv.lang && langChoice === langListOut[1],
12587
},
12688
{
@@ -135,10 +97,10 @@ const onLoad = async (targetDir, version, argv) => {
13597
const lang = argv.lang || langListMap[langChoice] || customLang || "";
13698
const removeJqueryFlag = removeJquery !== undefined ? removeJquery : false;
13799
try {
138-
const indexFile = targetDir + "/index.html";
100+
const indexFile = `${targetDir}/index.html`;
139101
const sourceHTML = await fs.readFile(indexFile, "utf-8");
140102
let resultHTML = sourceHTML.replace(
141-
/(<html.*lang=)\"([^"]*)\"/gi,
103+
/(<html.*lang=)"([^"]*)"/gi,
142104
`$1"${lang}"`
143105
);
144106
if (removeJqueryFlag) {
@@ -154,3 +116,47 @@ const onLoad = async (targetDir, version, argv) => {
154116
throw new Error(err);
155117
}
156118
};
119+
120+
module.exports = async (argvs) => {
121+
const argv = yargsParser(argvs, {
122+
alias: { release: ["r"], yes: ["y"] },
123+
});
124+
const timer = elapsed.start();
125+
const version = (argv.release || "latest").toString();
126+
const targetDir = path.resolve(argv._[0] || "./");
127+
const override = await checkFolder(targetDir, argv);
128+
if (!override) {
129+
console.log(chalk.red("Aborted"));
130+
return;
131+
}
132+
spinner = ora(
133+
`Downloading ${packageName} version '${version}' to ${targetDir}`
134+
).start();
135+
await fs.ensureDir(tempDir);
136+
try {
137+
const { from: nameWithVersion } = await extract(
138+
`${packageName}@${version}`,
139+
tempDir,
140+
{}
141+
);
142+
await fs.copy(`${tempDir}/dist`, targetDir);
143+
const timerDownloaded = timer.get();
144+
await onLoad(targetDir, version, argv);
145+
spinner.succeed(
146+
` ${nameWithVersion} copied to ${targetDir} in ${timerDownloaded}. Have fun!`
147+
);
148+
return;
149+
} catch (err) {
150+
if (err.code === "ETARGET") {
151+
const msg = chalk.red(
152+
`version '${err.wanted}' not found in npm registry\navailable versions:\n`
153+
);
154+
spinner.fail(msg + err.versions.reverse().join(" | "));
155+
throw err.code;
156+
}
157+
spinner.fail("✖ Unexpected error");
158+
throw new Error(err);
159+
} finally {
160+
await fs.remove(tempDir);
161+
}
162+
};

0 commit comments

Comments
 (0)