diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 03bdb9e..c5500b9 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,6 +3,7 @@ "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "editorconfig.editorconfig", - "DavidAnson.vscode-markdownlint" + "DavidAnson.vscode-markdownlint", + "oxc.oxc-vscode" ] } diff --git a/packages/oxfmt-config/.oxfmtrc.json b/packages/oxfmt-config/.oxfmtrc.json new file mode 100644 index 0000000..facaf8e --- /dev/null +++ b/packages/oxfmt-config/.oxfmtrc.json @@ -0,0 +1,13 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "singleQuote": true, + "semi": false, + "useTabs": false, + "tabWidth": 4, + "endOfLine": "lf", + "bracketSpacing": false, + "arrowParens": "always", + "bracketSameLine": false, + "printWidth": 120, + "trailingComma": "all" +} diff --git a/packages/oxfmt-config/README.md b/packages/oxfmt-config/README.md new file mode 100644 index 0000000..8721be2 --- /dev/null +++ b/packages/oxfmt-config/README.md @@ -0,0 +1,96 @@ +# @naverpay/oxfmt-config + +네이버페이 스타일 가이드에 맞게 oxfmt formatter 설정을 커스텀하여 제공합니다. + +> oxfmt는 Prettier 호환 포매터로, Rust로 작성되어 빠른 속도를 제공합니다. +> +> **Note:** oxfmt는 현재 **alpha** 단계입니다. VSCode Extension 지원도 experimental 상태입니다. + +## 설치 방법 + +```bash +npm install @naverpay/oxfmt-config oxfmt -D +``` + +## 사용 방법 + +> **Note:** oxfmt는 현재 `extends` 옵션을 지원하지 않습니다. ([관련 이슈](https://github.com/oxc-project/oxc/issues/16394)) + +패키지 설치 시 `.oxfmtrc.json` 파일이 프로젝트 루트에 자동으로 생성됩니다. 이미 파일이 존재하면 덮어쓰지 않습니다. + +필요에 따라 `ignorePatterns`를 추가합니다. + +```json +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "singleQuote": true, + "semi": false, + "useTabs": false, + "tabWidth": 4, + "endOfLine": "lf", + "bracketSpacing": false, + "arrowParens": "always", + "bracketSameLine": false, + "printWidth": 120, + "trailingComma": "all", + "ignorePatterns": [ + "dist", + "pnpm-lock.yaml", + ".github" + ] +} +``` + +## CLI + +package.json에 스크립트를 추가하여 format 검사를 할 수 있습니다. + +```json +{ + "scripts": { + "format": "oxfmt", + "format:check": "oxfmt --check" + } +} +``` + +> [lefthook](https://github.com/evilmartians/lefthook)을 사용해서 commit 또는 push 전에 스타일 확인을 자동화할 것을 권장합니다. + +## Integrating with IDE + +- code-style에서는 **Formatting을 위해 oxfmt**를, **Code-quality를 위해 oxlint**를 사용할 수 있습니다. +- IDE에서 autofix 하기 위해 아래 설정이 필요합니다. + +### VSCode + +> **Warning:** oxfmt의 VSCode 지원은 현재 **experimental** 단계입니다. 예상대로 동작하지 않을 수 있습니다. + +1. [oxc Extension](https://marketplace.visualstudio.com/items?itemName=oxc.oxc-vscode)을 설치합니다. +2. IDE에서 Command Palette(CMD/CTRL + Shift + P)를 열고 `settings.json`을 입력하여 설정파일을 오픈합니다. +3. 아래 설정을 추가하면 파일 저장시 oxfmt config에 맞게 autofix 할 수 있습니다. + +```json +{ + "oxc.enable": true, + "oxc.fmt.experimental": true, + "editor.defaultFormatter": "oxc.oxc-vscode", + "editor.formatOnSave": true, + "[typescript]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + } +} +``` + +| 설정 | 설명 | +|------|------| +| `oxc.enable` | oxc 익스텐션 활성화 | +| `oxc.fmt.experimental` | experimental 포매터 활성화 (필수) | +| `editor.defaultFormatter` | 기본 포매터로 oxc 사용 | +| `editor.formatOnSave` | 저장 시 자동 포맷 | + +### WebStorm + +[oxc-intellij-plugin](https://plugins.jetbrains.com/plugin/27061-oxc) (v0.0.21 이상)을 설치하여 사용할 수 있습니다. diff --git a/packages/oxfmt-config/createConfigFile.js b/packages/oxfmt-config/createConfigFile.js new file mode 100644 index 0000000..d0c6527 --- /dev/null +++ b/packages/oxfmt-config/createConfigFile.js @@ -0,0 +1,29 @@ +#!/usr/bin/env node +/* eslint-disable no-console */ +const {execSync} = require('child_process') +const fs = require('fs') +const path = require('path') + +const createConfigFile = (dirname, fileName, destFileName = fileName) => { + try { + const source = path.join(dirname, fileName) + const config = fs.readFileSync(source) + + const gitRoot = execSync('git rev-parse --show-toplevel').toString().trim() + const dest = path.join(gitRoot, destFileName) + + if (fs.existsSync(dest)) { + process.exit(0) + } + fs.writeFileSync(dest, config) + console.log(`${destFileName} is created successfully`) + } catch (error) { + console.log(`Failed to create ${destFileName}`) + console.log(error?.message) + process.exit(0) + } +} + +module.exports = { + createConfigFile, +} diff --git a/packages/oxfmt-config/index.js b/packages/oxfmt-config/index.js new file mode 100644 index 0000000..876d6c5 --- /dev/null +++ b/packages/oxfmt-config/index.js @@ -0,0 +1,3 @@ +const {createConfigFile} = require('./createConfigFile') + +createConfigFile(__dirname, '.oxfmtrc.json') diff --git a/packages/oxfmt-config/package.json b/packages/oxfmt-config/package.json new file mode 100644 index 0000000..ed0f9b0 --- /dev/null +++ b/packages/oxfmt-config/package.json @@ -0,0 +1,30 @@ +{ + "name": "@naverpay/oxfmt-config", + "version": "0.0.1", + "description": "oxfmt configuration for NaverPay projects", + "keywords": [ + "oxfmt", + "oxc", + "config", + "formatter", + "naverpay" + ], + "homepage": "https://github.com/NaverPayDev/code-style", + "repository": { + "type": "git", + "url": "https://github.com/NaverPayDev/code-style.git", + "directory": "packages/oxfmt-config" + }, + "license": "MIT", + "author": "@NaverPayDev/frontend", + "type": "commonjs", + "scripts": { + "postinstall": "node index.js" + }, + "devDependencies": { + "oxfmt": "^0.16.0" + }, + "peerDependencies": { + "oxfmt": ">=0.16.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3084ec7..d09e921 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,6 +170,12 @@ importers: specifier: ^0.32.1 version: 0.32.1 + packages/oxfmt-config: + devDependencies: + oxfmt: + specifier: ^0.16.0 + version: 0.16.0 + packages/prettier-config: devDependencies: prettier: @@ -1469,6 +1475,46 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oxfmt/darwin-arm64@0.16.0': + resolution: {integrity: sha512-I+Unj7wePcUTK7p/YKtgbm4yer6dw7dTlmCJa0UilFZyge5uD4rwCSfSDx3A+a6Z3A60/SqXMbNR2UyidWF4Cg==} + cpu: [arm64] + os: [darwin] + + '@oxfmt/darwin-x64@0.16.0': + resolution: {integrity: sha512-EfiXFKEOV5gXgEatFK89OOoSmd8E9Xq83TcjPLWQNFBO4cgaQsfKmctpgJmJjQnoUwD7nQsm0ruj3ae7Gva8QA==} + cpu: [x64] + os: [darwin] + + '@oxfmt/linux-arm64-gnu@0.16.0': + resolution: {integrity: sha512-ydcNY9Fn/8TjVswANhdSh+zdgD3tiikNQA68bgXbENHuV3RyYql1qoOM1eGv5xeIVJfkPJme17MKQz3OwMFS4A==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-arm64-musl@0.16.0': + resolution: {integrity: sha512-I9WeYe1/YnrfXgXVaKkZITZzil0G0g9IknS2KJbq1lOnpTw3dwViXZ7XMa2cq6Mv7S+4SoDImb7fLQ59AfVX/w==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-x64-gnu@0.16.0': + resolution: {integrity: sha512-Szg9lJtZdN5FoCnNbl3N/2pJv8d056NUmk51m60E2tZV7rvwRTrNC8HPc2sVdb1Ti5ogsicpZDYSWA3cwIrJIQ==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.16.0': + resolution: {integrity: sha512-5koN8nl21ZxOADaMxXHT+mt3YjfXe1nsa23Fanf9aY7B0hcQ6rXYCZ7r5vmpoTtzW/US3aaVcRFZE1cyof+lKw==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.16.0': + resolution: {integrity: sha512-Jaesn+FYn+MudSmWJMPGBAa0PhQXo52Z0ZYeNfzbQP7v2GFbZBI3Cb87+K0aHGlpqK3VEJKXeIaASaTWlkgO1Q==} + cpu: [arm64] + os: [win32] + + '@oxfmt/win32-x64@0.16.0': + resolution: {integrity: sha512-1obVSlb5blwBKgSsE1mNxvcq1pK9I6aXpZDy5d6jjGdrru33dHrH1ASChrcxwCukkToH2SxwYmnzAto0xeuZlw==} + cpu: [x64] + os: [win32] + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3709,6 +3755,11 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + oxfmt@0.16.0: + resolution: {integrity: sha512-uRnnBAN0zH07FXSfvSKbIw+Jrohv4Px2RwNiZOGI4/pvns4sx0+k4WSt+tqwd7bDeoWaXiGmhZgnbK63hi6hVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -6462,6 +6513,30 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@oxfmt/darwin-arm64@0.16.0': + optional: true + + '@oxfmt/darwin-x64@0.16.0': + optional: true + + '@oxfmt/linux-arm64-gnu@0.16.0': + optional: true + + '@oxfmt/linux-arm64-musl@0.16.0': + optional: true + + '@oxfmt/linux-x64-gnu@0.16.0': + optional: true + + '@oxfmt/linux-x64-musl@0.16.0': + optional: true + + '@oxfmt/win32-arm64@0.16.0': + optional: true + + '@oxfmt/win32-x64@0.16.0': + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -9100,6 +9175,17 @@ snapshots: outdent@0.5.0: {} + oxfmt@0.16.0: + optionalDependencies: + '@oxfmt/darwin-arm64': 0.16.0 + '@oxfmt/darwin-x64': 0.16.0 + '@oxfmt/linux-arm64-gnu': 0.16.0 + '@oxfmt/linux-arm64-musl': 0.16.0 + '@oxfmt/linux-x64-gnu': 0.16.0 + '@oxfmt/linux-x64-musl': 0.16.0 + '@oxfmt/win32-arm64': 0.16.0 + '@oxfmt/win32-x64': 0.16.0 + p-filter@2.1.0: dependencies: p-map: 2.1.0