Skip to content

Commit e3dfaba

Browse files
authored
Merge pull request #19 from vltansky/lang
feat: lang select
2 parents 6972646 + 1e9e3af commit e3dfaba

8 files changed

+928
-88
lines changed

CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
## 0.1.0 (May 25, 2020)
2-
* Initial Release
2+
3+
- Initial Release

cli.js

-55
This file was deleted.

index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
#!/usr/bin/env node
2-
require("./cli")().catch(console.error);
2+
require("./lib/cli")(process.argv.slice(2)).catch(console.error);

lib/cli.js

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
"use strict";
2+
const yargs_parser = require("yargs-parser");
3+
const path = require("path");
4+
const chalk = require("chalk");
5+
const langsList = require("./countries.json");
6+
const prompts = require("prompts");
7+
// const semver = require("semver");
8+
const fuzzy = require("fuzzy");
9+
const ora = require("ora");
10+
const { extract } = require("pacote");
11+
const glob = require("fast-glob");
12+
const fs = require("fs-extra");
13+
const os = require("os");
14+
const packageName = "html5-boilerplate";
15+
const tempDir = os.tmpdir() + `/${packageName}-staging`;
16+
const elapsed = require("elapsed-time-logger");
17+
let spinner;
18+
19+
module.exports = async (argvs) => {
20+
const argv = yargs_parser(argvs, {
21+
alias: { release: ["r"], yes: ["y"] },
22+
});
23+
const timer = elapsed.start();
24+
const version = argv["release"] || "latest";
25+
const targetDir = path.resolve(argv["_"][0] || "./");
26+
spinner = ora(
27+
`Downloading ${packageName} version '${version}' to ${targetDir}`
28+
).start();
29+
await fs.ensureDir(tempDir);
30+
try {
31+
const { from: nameWithVersion } = await extract(
32+
packageName + "@" + version,
33+
tempDir,
34+
{}
35+
);
36+
await fs.copy(tempDir + "/dist", targetDir);
37+
const timerDownloaded = timer.get();
38+
await onLoad(targetDir, version, argv);
39+
spinner.succeed(
40+
`${nameWithVersion} copied to ${targetDir} in ${timerDownloaded}. Have fun!`
41+
);
42+
return;
43+
} catch (err) {
44+
if (err.code === "ETARGET") {
45+
const msg = chalk.red(
46+
`version '${err.wanted}' not found in npm registry\navailable versions:\n`
47+
);
48+
spinner.fail(msg + err.versions.reverse().join(" | "));
49+
throw err.code;
50+
}
51+
spinner.fail("Unexpected error");
52+
throw new Error(err);
53+
} finally {
54+
await fs.remove(tempDir);
55+
}
56+
};
57+
58+
const onLoad = async (targetDir, version, argv) => {
59+
// see https://github.com/mrmlnc/fast-glob#how-to-write-patterns-on-windows
60+
const npmIgnoreFiles = await glob(
61+
`${targetDir.replace(/\\/g, "/")}/**/.npmignore`
62+
);
63+
for (const npmIgnore of npmIgnoreFiles) {
64+
await fs.rename(npmIgnore, npmIgnore.replace(/\.npmignore$/, ".gitignore"));
65+
}
66+
const skipPrompts = argv["yes"] === true;
67+
68+
spinner.stop();
69+
if (skipPrompts) {
70+
return;
71+
}
72+
let langListOut = langsList.map((v) => {
73+
return { title: `${v.title} (${v.value})`, value: v.value };
74+
});
75+
langListOut.splice(1, 0, { title: "Enter custom", value: "custom" });
76+
const questions = [
77+
{
78+
type: "autocomplete",
79+
name: "langChoice",
80+
message: "Select language",
81+
choices: langListOut,
82+
suggest: /* istanbul ignore next */ async (input, choices) => {
83+
return fuzzy
84+
.filter(input, choices, { extract: (el) => el.title })
85+
.map((v) => v.original);
86+
},
87+
},
88+
];
89+
let lang = argv.lang;
90+
/* istanbul ignore if */
91+
if (!lang) {
92+
let { langChoice } = await prompts(questions);
93+
if (langChoice === "custom") {
94+
let { customLang } = await prompts({
95+
type: "text",
96+
name: "customLang",
97+
message: "Enter custom language code",
98+
});
99+
langChoice = customLang;
100+
}
101+
lang = langChoice || "";
102+
}
103+
try {
104+
const indexFile = targetDir + "/index.html";
105+
const sourceHTML = await fs.readFile(indexFile, "utf-8");
106+
const resultHTML = sourceHTML.replace(
107+
/(<html.*lang=)\"([^"]*)\"/gi,
108+
`$1"${lang}"`
109+
);
110+
await fs.writeFile(indexFile, resultHTML);
111+
} catch (err) {
112+
/* istanbul ignore next */
113+
throw new Error(err);
114+
}
115+
};

0 commit comments

Comments
 (0)