create-bananass
Version:
Create a Bananass framework project for solving Baekjoon problems with JavaScript/TypeScript.๐
162 lines (109 loc) โข 7.26 kB
Markdown
# ๋ฐ๋๋<sup>Bananass</sup>
[](https://github.com/lumirlumir/npm-bananass/actions/workflows/lint.yml)
[](https://github.com/lumirlumir/npm-bananass/actions/workflows/test.yml)
[](https://github.com/lumirlumir/npm-bananass/actions/workflows/test-cross-platform.yml)
[](https://codecov.io/gh/lumirlumir/npm-bananass)

[](https://www.npmjs.com/package/bananass)
[](https://www.npmjs.com/package/bananass)
<kbd>ํ๊ตญ์ด</kbd> | <kbd>[English](README.en.md)</kbd>
๋ฐฑ์ค ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ.
์๋ฐ์คํฌ๋ฆฝํธ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด์ ์๋ก์ด ํจ๋ฌ๋ค์.
> [!IMPORTANT]
>
> ```js
> const whyBananass = {
> banana: '๐',
> bananas: '๐๐',
> bananass: '๐๐๐๐',
> }
> ```
>
> ```js
> console.log(('b' + 'a' + +'a' + 'a').toLowerCase() + (!(1/0) + [])[3].repeat(2));
> ```
<!-- markdownlint-disable-next-line md026 -->
## ์๋
, ๋ฐ๋๋!
๋ฐ๋๋<sup>Bananass</sup> ํ๋ ์์ํฌ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค!
๋ฐ๋๋๋ **์๋ฐ์คํฌ๋ฆฝํธ<sup>JavaScript</sup> ๋ฐ ํ์
์คํฌ๋ฆฝํธ<sup>TypeScript</sup> ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ฅผ ์ํ ํ๋ ์์ํฌ**๋ก, [๋ฐฑ์ค](https://www.acmicpc.net/)ใ[์ฝ๋ํฌ์ค](https://codeforces.com/) ๋ฑ ๋ค์ํ ๋ฌธ์ ํ์ด ํ๋ซํผ๋ค์ Node.js ํ๊ฒฝ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ง์ฃผ์น๋ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๋ฉฐ, ๊ฐ๊ฒฐํ๊ณ ํธ๋ฆฌํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ํ์
์คํฌ๋ฆฝํธ<sup>TypeScript</sup> ์ง์์ด ํ์ํ์๋ค๊ณ ์?
- ES16<sup>ES2025</sup> ๋ฑ ์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ๋ฌธ๋ฒ์ ์ฐ๊ณ ์ถ์๋ฐ ๋งํ์
จ๋์?
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ผ์ ๊ฐ์?
- ๋งค๋ฒ `readline` / `fs` ํ
ํ๋ฆฟ ์ฝ๋ ๋ณต๋ถํ๊ธฐ ์ง์น์
จ๋์?
์ด์ ๊ฑฑ์ ํ์ง ๋ง์ธ์! ๋ฐ๋๋ ํ๋ ์์ํฌ๋ ์ด๋ฐ ๋ฌธ์ ์ ๋ค์ ๋ชจ๋ ํด๊ฒฐํฉ๋๋ค.
## ์ ๋ฐ๋๋์ผ๊น์?
ํจ๊ป ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ [๋ฐฑ์ค 1000๋ฒ: A+B](https://www.acmicpc.net/problem/1000) ๋ฌธ์ ํ์ด ์์ ๋ฅผ ์ดํด๋ด
์๋ค!
- ๊ธฐ์กด ๋ฐฉ๋ฒ์ ํตํ ๋ฌธ์ ํ์ด.
```js
const readline = require('node:readline');
const { EOL } = require('node:os');
let inputStr = '';
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on('line', line => {
inputStr = `${inputStr}${line}${EOL}`;
}).on('close', () => {
console.log(solution(inputStr));
process.exit(0);
});
function solution(input) {
const [a, b] = input
.trim()
.split(' ')
.map(val => Number(val));
return a + b;
}
```
- ๋ฐ๋๋ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ ๋ฌธ์ ํ์ด.
```js
function solution(input) {
const [a, b] = input
.trim()
.split(' ')
.map(Number);
return a + b;
}
export default { solution };
```
๋ ๊ฐ๊ฒฐํ๊ณ , ๋ ์ง๊ด์ ์ธ ์ฝ๋! ์
๋ ฅ ์ฒ๋ฆฌ์ ๋ค์ด๋ ์๊ฐ์ ์ค์ด๊ณ , ์ค์ง ์๊ณ ๋ฆฌ์ฆ์๋ง ์ง์คํ ์ ์์ต๋๋ค.
## ์ด๊ฒ ์ ๋ถ์ธ๊ฐ์?
๋ฌผ๋ก , ์๋๋๋ค!
- ์๋ฐ์คํฌ๋ฆฝํธ<sup>JavaScript</sup> ๋ฐ ํ์
์คํฌ๋ฆฝํธ<sup>TypeScript</sup> ์ง์.
- ESM<sup>ECMAScript Module</sup> ๋ฐ CommonJS ๋ชจ๋ ์์คํ
์ง์.
- ๋ฐฑ์ค Node.js ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๋ ES16<sup>ES2025</sup> ๋ฑ ์ต์ ๋ฌธ๋ฒ ์ง์.
- ์ฌ์ฉ์ ์ ์ ๋ชจ๋ ๋ฐ `lodash` ๋ฑ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ ์ง์.
- ํ๋ก๊ทธ๋๋จธ์ค์ฒ๋ผ `solution` ํจ์ ํ๋๋ก ์์ํ๊ธฐ ์ง์.
- ํ
์คํธ ์ผ์ด์ค ์์ฑ ๋ฐ ์คํ ์ง์.
- `create-bananass`๋ก ์์ํ๊ธฐ ์ง์.
- `fs` ๋ชจ๋์ ์ฌ์ฉํ ๋์ฑ ๋น ๋ฅธ ์
์ถ๋ ฅ ์ง์.
- ํธ์๋ฅผ ์ํ ๋ค์ํ CLI ๋ช
๋ น์ด ์ง์.
- ํ๋ถํ๊ณ ์์ธํ ๋ฌธ์ ์ง์.
- ESLint ๋ฐ Prettier ์์ฒด ์ง์.
์ด๋ค๊ฐ์? ๋ฐ๋๋ ํ๋ ์์ํฌ๋ฅผ ํตํด ๋์ฑ ํธ๋ฆฌํ ๋ฌธ์ ํ์ด๋ฅผ ๊ฒฝํํด๋ณด๊ณ ์ถ์ง ์์ผ์ ๊ฐ์?
## ๋ฐ๋๋๋ก ์์ํ๊ธฐ
[React](https://ko.react.dev)์ `create-react-app`, [Next.js](https://nextjs.org)์ `create-next-app` ์ฒ๋ผ, ๋ฐ๋๋ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ `create-bananass`๋ก ์ง๊ธ ๋ฐ๋ก ์๋ก์ด ๋ฌธ์ ํ์ด ํจ๋ฌ๋ค์์ ๊ฒฝํํด๋ณด์ธ์!
๋ฐ๋๋ ํ๋ ์์ํฌ๋ `create-bananass`๋ฅผ ํตํด ์ฆ์ ์ค์นํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
```sh
npm create bananass@latest
```
๋ ์์ธํ ์ฌ์ฉ๋ฒ์ [๋ฐ๋๋ ํ๋ ์์ํฌ ๋ฌธ์](https://bananass.lumir.page)๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
## ๋ฐ๋๋ ํ๋ ์์ํฌ ๋ฌธ์
๋ฐ๋๋ ํ๋ ์์ํฌ๋ ๋ฌธ์ํ๋ฅผ ๊ฐ์ฅ ํฐ ๊ฐ์น๋ก ์ฌ๊น๋๋ค. ๋ฐ๋๋ ํ๋ ์์ํฌ์ ๋ชจ๋ ์ฌ์ฉ๋ฒ๊ณผ ๊ธฐ๋ฅ์ [๋ฐ๋๋ ํ๋ ์์ํฌ ๋ฌธ์](https://bananass.lumir.page)์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
## ๊ธฐ์ฌ(์ด์<sup>Issue</sup>, ๋์ด์ค๊ธฐ ์์ฒญ<sup>Pull Request</sup>, ํ ๋ก <sup>Discussion</sup>)
๋ฐ๋๋ ํ๋ ์์ํฌ ๊ธฐ์ฌ์ ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
๋ฒ๊ทธ<sup>Bug</sup> ๋ฐ ์ ์<sup>Suggestion</sup> ๋ฑ ์ฌ๋ฌ ์ฃผ์ ์ ๋ํ ์ด์<sup>Issue</sup>, ๋์ด์ค๊ธฐ ์์ฒญ<sup>Pull Request</sup>, ํ ๋ก <sup>Discussion</sup> ๋ฑ์ ๋ชจ๋ ํ์ํฉ๋๋ค.
๋ค๋ง, ์ฌ๋ฐ๋ฅธ ์ปค๋ฎค๋ํฐ ํ๊ฒฝ์ ์ค์ํ๊ณ ๋ ๋์ ์คํ ์์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด, ๋ฐ๋๋ ํ๋ ์์ํฌ์ ๊ธฐ์ฌํ๊ธฐ ์ ๋ฐ๋์ ์๋ ๋ด์ฉ๋ค์ ํ์ธํด์ฃผ์ธ์.
- [๊ธฐ์ฌ์ ํ๋ ๊ฐ๋ น ๊ท์ฝ](CODE_OF_CONDUCT.md)
- [๊ธฐ์ฌํ๊ธฐ](CONTRIBUTING.md)
## ๋ฒ์ ์ ์ฑ
<sup>Versioning</sup>
๋ฐ๋๋ ํ๋ ์์ํฌ๋ [์ ์์ ๋ฒ์ ์ ์ฑ
<sup>Semantic Versioning</sup>](https://semver.org/lang/ko/)์ ๋ฐ๋ฆ
๋๋ค. ๋ชจ๋ ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์ `์ฃผ(MAJOR).๋ถ(MINOR).์(PATCH)` ํ์์ ๋ฐ๋ฆ
๋๋ค.
## ๊ธฐ์ฌ์ ํ๋ ๊ฐ๋ น ๊ท์ฝ<sup>Code of Conduct</sup>
์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ธฐ ์ , [๊ธฐ์ฌ์ ํ๋ ๊ฐ๋ น ๊ท์ฝ](CODE_OF_CONDUCT.md)์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
## ๋ณ๊ฒฝ ์ฌํญ<sup>Change Log</sup>
๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ์ธํ๋ ค๋ฉด, [๋ณ๊ฒฝ ์ฌํญ](CHANGELOG.md)์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
## ๋ณด์<sup>Security</sup>
๋ณด์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์
จ๋์? [๋ณด์](SECURITY.md) ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
## ๋ผ์ด์ ์ค<sup>License</sup>
๋ฐ๋๋ ํ๋ ์์ํฌ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ
๋๋ค. [๋ผ์ด์ ์ค](LICENSE.md) ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.