From 84a34e2fa406ea6b0aa99cb9014e9bed2711cd4f Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Sat, 9 May 2026 20:10:12 +0900 Subject: [PATCH 01/22] =?UTF-8?q?build(scripts):=20release-npm=EC=97=90=20?= =?UTF-8?q?BREAKING=20CHANGE=20=EA=B0=90=EC=A7=80=20=EC=8B=9C=20major=20bu?= =?UTF-8?q?mp=20=EA=B0=95=EC=A0=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 직전 v* tag 이후 commit 본문에 BREAKING CHANGE: footer가 있으면 releaseVersion specifier를 major로 강제 - nx release conventionalCommits scope 매칭이 full npm name을 요구하지만 우리는 short scope를 사용 → 자동 매칭 실패를 release script에서 보정 - --beta prerelease 모드에선 미적용 (기존 분기 우선) --- tools/scripts/release/release-npm.ts | 31 +++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tools/scripts/release/release-npm.ts b/tools/scripts/release/release-npm.ts index 6aedf0a..1e88b52 100644 --- a/tools/scripts/release/release-npm.ts +++ b/tools/scripts/release/release-npm.ts @@ -1,12 +1,41 @@ +import { execSync } from 'node:child_process'; + import { releaseChangelog, releasePublish, releaseVersion } from 'nx/release'; +/** + * 직전 release tag 이후 commit 본문에 BREAKING CHANGE footer가 있는지 확인합니다. + * + * nx release의 conventionalCommits scope 매칭은 full npm name(@scope/pkg)을 요구하지만, + * 현재 프로젝트 commit scope는 short name(react-ui 등)이라 자동 매칭이 안 되므로, 여기서 직접 감지해 major 강제 여부를 결정합니다. + */ +const hasBreakingChangeSinceLastTag = (): boolean => { + try { + const lastTag = execSync('git describe --tags --abbrev=0 --match="v*"', { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }).trim(); + if (!lastTag) return false; + const log = execSync(`git log ${lastTag}..HEAD --format=%B`, { encoding: 'utf8' }); + return /^BREAKING CHANGE:/m.test(log); + } catch { + return false; + } +}; + const main = async () => { const isFirstRelease = process.argv.includes('--first-release'); const isBeta = process.argv.includes('--beta') || process.argv.includes('--preid=beta'); + const hasBreaking = !isBeta && hasBreakingChangeSinceLastTag(); + + if (hasBreaking) { + console.log('직전 tag 이후 BREAKING CHANGE 감지 — major bump를 강제합니다.'); + } + + const specifier = isBeta ? 'prerelease' : hasBreaking ? 'major' : undefined; const { workspaceVersion, projectsVersionData, releaseGraph } = await releaseVersion({ firstRelease: isFirstRelease, - specifier: isBeta ? 'prerelease' : undefined, + specifier, preid: isBeta ? 'beta' : undefined, }); From 836eaf7dfa7f89aa2c2d993bd89d5c42b83d0da1 Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:04:01 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feat(commitlint-config):=20=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20commitlint=20=EC=84=A4=EC=A0=95=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=8B=A0=EA=B7=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존 루트 commitlint.config.js 규칙을 @berrypjh/commitlint-config로 추출 - no-header-bang, type-enum, conventional preset extends 유지 - nx-release-publish target 포함, MIT 라이선스로 공개 --- commitlint.config.js | 46 +---------------------------- libs/commitlint-config/README.md | 20 +++++++++++++ libs/commitlint-config/index.js | 39 ++++++++++++++++++++++++ libs/commitlint-config/package.json | 12 ++++++++ libs/commitlint-config/project.json | 12 ++++++++ 5 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 libs/commitlint-config/README.md create mode 100644 libs/commitlint-config/index.js create mode 100644 libs/commitlint-config/package.json create mode 100644 libs/commitlint-config/project.json diff --git a/commitlint.config.js b/commitlint.config.js index 183619e..a106e15 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,45 +1 @@ -module.exports = { - extends: ['@commitlint/config-conventional'], - plugins: [ - { - rules: { - 'no-header-bang': ({ header }) => { - // 헤더에 '!:'가 포함되어 있으면 에러 반환 - return [ - !header.includes('!:'), - '실수 방지를 위해 feat!: 문법 사용을 금지합니다. Major 변경은 Footer에 "BREAKING CHANGE"를 사용하세요.', - ]; - }, - }, - }, - ], - rules: { - 'no-header-bang': [2, 'always'], - // Type(태그)의 종류를 제한 (레벨: 0=무시, 1=경고, 2=에러) - 'type-enum': [ - 2, - 'always', - [ - 'feat', - 'fix', - 'docs', - 'design', - 'style', - 'refactor', - 'test', - 'chore', - 'build', - 'ci', - 'revert', - ], - ], - // Subject의 케이스를 제한 - 'subject-case': [0, 'always', ['sentence-case', 'start-case', 'pascal-case', 'upper-case']], - // Subject가 비어있으면 안 됨 - 'subject-empty': [2, 'never'], - // Type이 비어있으면 안 됨 - 'type-empty': [2, 'never'], - // Body의 최대 줄 수를 제한 - 'body-max-line-length': [0, 'always', 200], - }, -}; +module.exports = { extends: ['@berrypjh/commitlint-config'] }; diff --git a/libs/commitlint-config/README.md b/libs/commitlint-config/README.md new file mode 100644 index 0000000..bbde03d --- /dev/null +++ b/libs/commitlint-config/README.md @@ -0,0 +1,20 @@ +# @berrypjh/commitlint-config + +워크스페이스 공통 Commitlint 설정. Conventional Commits 기반. + +## 사용 + +```bash +pnpm add -D @berrypjh/commitlint-config @commitlint/cli +``` + +```js +// commitlint.config.js +module.exports = { extends: ['@berrypjh/commitlint-config'] }; +``` + +## 규칙 요약 + +- `type-enum`: feat, fix, docs, design, style, refactor, test, chore, build, ci, revert +- `no-header-bang`: `feat!:` 형태 헤더 금지. Major 변경은 Footer에 `BREAKING CHANGE`를 사용 +- `subject-empty`, `type-empty`: 빈 값 금지 diff --git a/libs/commitlint-config/index.js b/libs/commitlint-config/index.js new file mode 100644 index 0000000..7ae9f8c --- /dev/null +++ b/libs/commitlint-config/index.js @@ -0,0 +1,39 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + plugins: [ + { + rules: { + 'no-header-bang': ({ header }) => { + return [ + !header.includes('!:'), + '실수 방지를 위해 feat!: 문법 사용을 금지합니다. Major 변경은 Footer에 "BREAKING CHANGE"를 사용하세요.', + ]; + }, + }, + }, + ], + rules: { + 'no-header-bang': [2, 'always'], + 'type-enum': [ + 2, + 'always', + [ + 'feat', + 'fix', + 'docs', + 'design', + 'style', + 'refactor', + 'test', + 'chore', + 'build', + 'ci', + 'revert', + ], + ], + 'subject-case': [0, 'always', ['sentence-case', 'start-case', 'pascal-case', 'upper-case']], + 'subject-empty': [2, 'never'], + 'type-empty': [2, 'never'], + 'body-max-line-length': [0, 'always', 200], + }, +}; diff --git a/libs/commitlint-config/package.json b/libs/commitlint-config/package.json new file mode 100644 index 0000000..e20c93d --- /dev/null +++ b/libs/commitlint-config/package.json @@ -0,0 +1,12 @@ +{ + "name": "@berrypjh/commitlint-config", + "version": "0.0.6", + "license": "MIT", + "main": "./index.js", + "files": [ + "index.js" + ], + "dependencies": { + "@commitlint/config-conventional": "^20.5.0" + } +} diff --git a/libs/commitlint-config/project.json b/libs/commitlint-config/project.json new file mode 100644 index 0000000..593aa33 --- /dev/null +++ b/libs/commitlint-config/project.json @@ -0,0 +1,12 @@ +{ + "name": "@berrypjh/commitlint-config", + "projectType": "library", + "sourceRoot": "libs/commitlint-config", + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {} + } + }, + "tags": ["scope:internal"] +} From 399ea6969e439d49ecfd269372a10cccfa6b2b31 Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:04:27 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feat(prettier-config):=20=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20prettier=20=EC=84=A4=EC=A0=95=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=8B=A0=EA=B7=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존 루트 .prettierrc 규칙을 @berrypjh/prettier-config로 추출 (printWidth 100, singleQuote 등 동일) - *.md/*.mdx proseWrap, *.yml/*.yaml singleQuote override 포함 - nx-release-publish target 포함, MIT 라이선스로 공개 --- libs/prettier-config/README.md | 30 +++++++++++++++++++++++++++ libs/prettier-config/index.js | 34 +++++++++++++++++++++++++++++++ libs/prettier-config/package.json | 9 ++++++++ libs/prettier-config/project.json | 12 +++++++++++ 4 files changed, 85 insertions(+) create mode 100644 libs/prettier-config/README.md create mode 100644 libs/prettier-config/index.js create mode 100644 libs/prettier-config/package.json create mode 100644 libs/prettier-config/project.json diff --git a/libs/prettier-config/README.md b/libs/prettier-config/README.md new file mode 100644 index 0000000..f67cabe --- /dev/null +++ b/libs/prettier-config/README.md @@ -0,0 +1,30 @@ +# @berrypjh/prettier-config + +워크스페이스 공통 Prettier 설정. + +## 사용 + +```bash +pnpm add -D @berrypjh/prettier-config prettier +``` + +```jsonc +// package.json +{ + "prettier": "@berrypjh/prettier-config", +} +``` + +## 규칙 + +- `printWidth`: 100, `tabWidth`: 2, `useTabs`: false +- `singleQuote`: true, `jsxSingleQuote`: false, `semi`: true +- `trailingComma`: all, `arrowParens`: always +- `bracketSpacing`: true, `bracketSameLine`: false, `singleAttributePerLine`: false +- `endOfLine`: lf +- `htmlWhitespaceSensitivity`: css, `embeddedLanguageFormatting`: auto + +### Override + +- `*.md`, `*.mdx`: `proseWrap: preserve` +- `*.yml`, `*.yaml`: `singleQuote: false` (YAML 표준) diff --git a/libs/prettier-config/index.js b/libs/prettier-config/index.js new file mode 100644 index 0000000..371604b --- /dev/null +++ b/libs/prettier-config/index.js @@ -0,0 +1,34 @@ +module.exports = { + singleQuote: true, + semi: true, + trailingComma: 'all', + printWidth: 100, + tabWidth: 2, + useTabs: false, + jsxSingleQuote: false, + bracketSpacing: true, + bracketSameLine: false, + arrowParens: 'always', + endOfLine: 'lf', + htmlWhitespaceSensitivity: 'css', + embeddedLanguageFormatting: 'auto', + singleAttributePerLine: false, + overrides: [ + { + files: ['*.md', '*.mdx'], + options: { + proseWrap: 'preserve', + printWidth: 100, + tabWidth: 2, + embeddedLanguageFormatting: 'auto', + }, + }, + { + files: ['*.yml', '*.yaml'], + options: { + tabWidth: 2, + singleQuote: false, + }, + }, + ], +}; diff --git a/libs/prettier-config/package.json b/libs/prettier-config/package.json new file mode 100644 index 0000000..fd0cfa1 --- /dev/null +++ b/libs/prettier-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "@berrypjh/prettier-config", + "version": "0.0.6", + "license": "MIT", + "main": "./index.js", + "files": [ + "index.js" + ] +} diff --git a/libs/prettier-config/project.json b/libs/prettier-config/project.json new file mode 100644 index 0000000..1ec0777 --- /dev/null +++ b/libs/prettier-config/project.json @@ -0,0 +1,12 @@ +{ + "name": "@berrypjh/prettier-config", + "projectType": "library", + "sourceRoot": "libs/prettier-config", + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {} + } + }, + "tags": ["scope:internal"] +} From e4cdd689dbc60b74bd83d9ab159cb6f13b46d63f Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:05:19 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat(tsconfig):=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B3=B5=ED=86=B5=20tsc?= =?UTF-8?q?onfig=20=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=8B=A0=EA=B7=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - base.json(공통 strict 옵션), library.json(nodenext), next.json(bundler+composite+emitDeclarationOnly) 3종 제공 - README에 시나리오별 베이스 매핑과 사용 예시 포함 - nx-release-publish target 포함, MIT 라이선스로 공개 --- libs/tsconfig/README.md | 39 ++++++++++++++++++++++++++++++++++++++ libs/tsconfig/base.json | 16 ++++++++++++++++ libs/tsconfig/library.json | 9 +++++++++ libs/tsconfig/next.json | 12 ++++++++++++ libs/tsconfig/package.json | 10 ++++++++++ libs/tsconfig/project.json | 12 ++++++++++++ 6 files changed, 98 insertions(+) create mode 100644 libs/tsconfig/README.md create mode 100644 libs/tsconfig/base.json create mode 100644 libs/tsconfig/library.json create mode 100644 libs/tsconfig/next.json create mode 100644 libs/tsconfig/package.json create mode 100644 libs/tsconfig/project.json diff --git a/libs/tsconfig/README.md b/libs/tsconfig/README.md new file mode 100644 index 0000000..1c0343b --- /dev/null +++ b/libs/tsconfig/README.md @@ -0,0 +1,39 @@ +# @berrypjh/tsconfig + +워크스페이스 공통 TypeScript 베이스 설정. + +## 사용 + +```bash +pnpm add -D @berrypjh/tsconfig +``` + +### 시나리오별 베이스 + +| 파일 | 용도 | +| -------------- | ------------------------------------------------------------- | +| `base.json` | 공통 strict 옵션. 직접 extends하기보다 시나리오별 베이스 사용 | +| `next.json` | Next.js · 번들러 기반 앱용 (`moduleResolution: bundler`) | +| `library.json` | npm 배포 라이브러리용 (`moduleResolution: nodenext`) | + +### 예시 + +```jsonc +// it-tech-blog: tsconfig.base.json +{ + "extends": "@berrypjh/tsconfig/next.json", + "compilerOptions": { + "customConditions": ["@it-tech-blog/source"], + }, +} +``` + +```jsonc +// 라이브러리 패키지의 tsconfig.lib.json +{ + "extends": "@berrypjh/tsconfig/library.json", + "compilerOptions": { + "outDir": "./dist", + }, +} +``` diff --git a/libs/tsconfig/base.json b/libs/tsconfig/base.json new file mode 100644 index 0000000..8aa6c26 --- /dev/null +++ b/libs/tsconfig/base.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "target": "es2022", + "lib": ["es2022"], + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "isolatedModules": true, + "importHelpers": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/libs/tsconfig/library.json b/libs/tsconfig/library.json new file mode 100644 index 0000000..4b1b9c2 --- /dev/null +++ b/libs/tsconfig/library.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "module": "nodenext", + "moduleResolution": "nodenext", + "resolveJsonModule": true + } +} diff --git a/libs/tsconfig/next.json b/libs/tsconfig/next.json new file mode 100644 index 0000000..3a4d32b --- /dev/null +++ b/libs/tsconfig/next.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "composite": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "module": "esnext", + "moduleResolution": "bundler", + "noEmitOnError": true + } +} diff --git a/libs/tsconfig/package.json b/libs/tsconfig/package.json new file mode 100644 index 0000000..dcada8c --- /dev/null +++ b/libs/tsconfig/package.json @@ -0,0 +1,10 @@ +{ + "name": "@berrypjh/tsconfig", + "version": "0.0.6", + "license": "MIT", + "files": [ + "base.json", + "next.json", + "library.json" + ] +} diff --git a/libs/tsconfig/project.json b/libs/tsconfig/project.json new file mode 100644 index 0000000..ecea3d2 --- /dev/null +++ b/libs/tsconfig/project.json @@ -0,0 +1,12 @@ +{ + "name": "@berrypjh/tsconfig", + "projectType": "library", + "sourceRoot": "libs/tsconfig", + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {} + } + }, + "tags": ["scope:internal"] +} From bc602cafaecbf8495360b888978e54ac9ef7120d Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:05:44 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat(eslint-config):=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B3=B5=ED=86=B5=20esl?= =?UTF-8?q?int=20flat=20config=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=8B=A0?= =?UTF-8?q?=EA=B7=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - base(nx flat base/ts/js + import-sort + unused-imports + no-explicit-any), nx(enforce-module-boundaries), react(nx flat/react + jsx-a11y recommended) 3 export 제공 - @nx/eslint-plugin/eslint는 peerDependencies로 두어 consumer 버전과 정렬 - nx-release-publish target 포함, MIT 라이선스로 공개 --- libs/eslint-config/README.md | 62 ++++++++++++++++++++++++++++++++ libs/eslint-config/base.mjs | 63 +++++++++++++++++++++++++++++++++ libs/eslint-config/nx.mjs | 28 +++++++++++++++ libs/eslint-config/package.json | 26 ++++++++++++++ libs/eslint-config/project.json | 12 +++++++ libs/eslint-config/react.mjs | 24 +++++++++++++ 6 files changed, 215 insertions(+) create mode 100644 libs/eslint-config/README.md create mode 100644 libs/eslint-config/base.mjs create mode 100644 libs/eslint-config/nx.mjs create mode 100644 libs/eslint-config/package.json create mode 100644 libs/eslint-config/project.json create mode 100644 libs/eslint-config/react.mjs diff --git a/libs/eslint-config/README.md b/libs/eslint-config/README.md new file mode 100644 index 0000000..bef773f --- /dev/null +++ b/libs/eslint-config/README.md @@ -0,0 +1,62 @@ +# @berrypjh/eslint-config + +Nx 워크스페이스용 공통 ESLint 설정 (flat config). + +## 사용 + +```bash +pnpm add -D @berrypjh/eslint-config eslint @nx/eslint-plugin +``` + +```js +// eslint.config.mjs +import base from '@berrypjh/eslint-config/base'; +import nx from '@berrypjh/eslint-config/nx'; +import react from '@berrypjh/eslint-config/react'; + +export default [ + ...base, + ...nx, + ...react, + { + ignores: ['**/dist', '**/.next'], + }, + { + // 워크스페이스 scope (@my-scope/*) 그룹을 자기 레포에 맞게 override + files: ['**/*.{ts,tsx,js,jsx,mjs,cjs}'], + rules: { + 'simple-import-sort/imports': [ + 'error', + { + groups: [ + ['^\\u0000'], + ['^node:'], + ['^react(/|$)', '^next(/|$)'], + ['^@my-scope/'], + ['^@?\\w'], + ['^@/'], + ['^\\.\\.(?!/?$)', '^\\.\\./?$'], + ['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'], + ['^.+\\.s?css$'], + ], + }, + ], + }, + }, +]; +``` + +## 제공 베이스 + +| Export | 용도 | +| ------------------------------- | ---------------------------------------------------------------------- | +| `@berrypjh/eslint-config/base` | Nx flat base/ts/js + import-sort + unused-imports + no-explicit-any | +| `@berrypjh/eslint-config/nx` | `@nx/enforce-module-boundaries` 기본값 (consumer가 tag/allow override) | +| `@berrypjh/eslint-config/react` | `nx.configs['flat/react']` + react-hooks + jsx-a11y | + +Storybook, Next.js, Playwright 등 특수 layer는 소비자 레포에서 직접 추가한다. + +## Peer dependencies + +- `eslint ^9.8.0` +- `@nx/eslint-plugin ^22.6.5` — consumer의 Nx 버전과 정렬되도록 peer로 둠 diff --git a/libs/eslint-config/base.mjs b/libs/eslint-config/base.mjs new file mode 100644 index 0000000..9346ed6 --- /dev/null +++ b/libs/eslint-config/base.mjs @@ -0,0 +1,63 @@ +import nx from '@nx/eslint-plugin'; +import simpleImportSort from 'eslint-plugin-simple-import-sort'; +import unusedImports from 'eslint-plugin-unused-imports'; + +export const baseConfig = [ + ...nx.configs['flat/base'], + ...nx.configs['flat/typescript'], + ...nx.configs['flat/javascript'], + { + files: [ + '**/*.ts', + '**/*.tsx', + '**/*.cts', + '**/*.mts', + '**/*.js', + '**/*.jsx', + '**/*.cjs', + '**/*.mjs', + ], + plugins: { + 'simple-import-sort': simpleImportSort, + 'unused-imports': unusedImports, + }, + rules: { + 'simple-import-sort/imports': [ + 'error', + { + groups: [ + ['^\\u0000'], + ['^node:'], + ['^react(/|$)', '^next(/|$)', '^react-native(/|$)'], + ['^@?\\w'], + ['^@/'], + ['^\\.\\.(?!/?$)', '^\\.\\./?$'], + ['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'], + ['^.+\\.s?css$'], + ], + }, + ], + 'simple-import-sort/exports': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': [ + 'warn', + { + vars: 'all', + varsIgnorePattern: '^_', + args: 'after-used', + argsIgnorePattern: '^_', + }, + ], + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.cts', '**/*.mts'], + rules: { + '@typescript-eslint/no-explicit-any': 'error', + }, + }, +]; + +export default baseConfig; diff --git a/libs/eslint-config/nx.mjs b/libs/eslint-config/nx.mjs new file mode 100644 index 0000000..d663231 --- /dev/null +++ b/libs/eslint-config/nx.mjs @@ -0,0 +1,28 @@ +/** + * Nx 워크스페이스 전용 ESLint 설정. + * + * `@nx/enforce-module-boundaries` 기본값을 제공한다. + * Tag/allow 규칙은 consumer가 override 하는 것이 일반적이다. + */ +export const nxConfig = [ + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: { + '@nx/enforce-module-boundaries': [ + 'error', + { + enforceBuildableLibDependency: true, + allow: ['^.*/eslint(\\.base)?\\.config\\.[cm]?[jt]s$'], + depConstraints: [ + { + sourceTag: '*', + onlyDependOnLibsWithTags: ['*'], + }, + ], + }, + ], + }, + }, +]; + +export default nxConfig; diff --git a/libs/eslint-config/package.json b/libs/eslint-config/package.json new file mode 100644 index 0000000..e579335 --- /dev/null +++ b/libs/eslint-config/package.json @@ -0,0 +1,26 @@ +{ + "name": "@berrypjh/eslint-config", + "version": "0.0.6", + "license": "MIT", + "type": "module", + "exports": { + "./base": "./base.mjs", + "./nx": "./nx.mjs", + "./react": "./react.mjs" + }, + "files": [ + "base.mjs", + "nx.mjs", + "react.mjs" + ], + "dependencies": { + "eslint-plugin-jsx-a11y": "6.10.1", + "eslint-plugin-react-hooks": "5.0.0", + "eslint-plugin-simple-import-sort": "^13.0.0", + "eslint-plugin-unused-imports": "^4.4.1" + }, + "peerDependencies": { + "@nx/eslint-plugin": "^22.6.5", + "eslint": "^9.8.0" + } +} diff --git a/libs/eslint-config/project.json b/libs/eslint-config/project.json new file mode 100644 index 0000000..1eb30ec --- /dev/null +++ b/libs/eslint-config/project.json @@ -0,0 +1,12 @@ +{ + "name": "@berrypjh/eslint-config", + "projectType": "library", + "sourceRoot": "libs/eslint-config", + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {} + } + }, + "tags": ["scope:internal"] +} diff --git a/libs/eslint-config/react.mjs b/libs/eslint-config/react.mjs new file mode 100644 index 0000000..e1db2cb --- /dev/null +++ b/libs/eslint-config/react.mjs @@ -0,0 +1,24 @@ +import nx from '@nx/eslint-plugin'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; + +/** + * React / JSX 전용 ESLint 설정. + * + * 적용 항목: + * - @nx/eslint-plugin flat/react (react-hooks/jsx-a11y/react 플러그인 선언 + 안전성 룰) + * - jsx-a11y `flatConfigs.recommended` 추가 (nx 기본보다 강함) + * + * NOTE: react-hooks/jsx-a11y 플러그인 자체는 nx flat/react에서 선언하므로 + * 여기서 다시 `plugins`에 넣지 않는다 (flat config: "Cannot redefine plugin" 회피). + */ +export const reactConfig = [ + ...nx.configs['flat/react'], + { + files: ['**/*.jsx', '**/*.tsx'], + rules: { + ...jsxA11y.flatConfigs.recommended.rules, + }, + }, +]; + +export default reactConfig; From b82af1618f3629243d3e4ac4fd61bf9dd8dd463a Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:06:10 +0900 Subject: [PATCH 06/22] =?UTF-8?q?build(root):=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=ED=8C=A8=ED=82=A4=EC=A7=80(@berrypjh/*)?= =?UTF-8?q?=20=EC=B1=84=ED=83=9D=20=EB=B0=8F=20nx=20release=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .prettierrc 삭제 + package.json의 prettier/devDeps에 4개 워크스페이스 패키지 연결 - 루트 eslint.config.mjs를 @berrypjh/eslint-config/{base,nx,react}로 슬림화 (인라인 룰 제거) - tsconfig.base.json은 @berrypjh/tsconfig/base.json extends + module/moduleResolution: bundler 명시, nx.json release.projects에 신규 4개 추가 --- .prettierrc | 34 --- eslint.config.mjs | 62 +----- nx.json | 6 +- package.json | 5 + pnpm-lock.yaml | 539 +++++++++++++++++++++++++++++++++++++++++++++ tsconfig.base.json | 16 +- 6 files changed, 559 insertions(+), 103 deletions(-) delete mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 3b21174..0000000 --- a/.prettierrc +++ /dev/null @@ -1,34 +0,0 @@ -{ - "singleQuote": true, - "semi": true, - "trailingComma": "all", - "printWidth": 100, - "tabWidth": 2, - "useTabs": false, - "jsxSingleQuote": false, - "bracketSpacing": true, - "bracketSameLine": false, - "arrowParens": "always", - "endOfLine": "lf", - "htmlWhitespaceSensitivity": "css", - "embeddedLanguageFormatting": "auto", - "singleAttributePerLine": false, - "overrides": [ - { - "files": ["*.md", "*.mdx"], - "options": { - "proseWrap": "preserve", - "printWidth": 100, - "tabWidth": 2, - "embeddedLanguageFormatting": "auto" - } - }, - { - "files": ["*.yml", "*.yaml"], - "options": { - "tabWidth": 2, - "singleQuote": false - } - } - ] -} diff --git a/eslint.config.mjs b/eslint.config.mjs index ea2416c..afb19ae 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,14 +1,13 @@ -import nx from '@nx/eslint-plugin'; -import jsxA11y from 'eslint-plugin-jsx-a11y'; -import reactHooks from 'eslint-plugin-react-hooks'; -import simpleImportSort from 'eslint-plugin-simple-import-sort'; +import base from '@berrypjh/eslint-config/base'; +import nx from '@berrypjh/eslint-config/nx'; +import react from '@berrypjh/eslint-config/react'; + import storybook from 'eslint-plugin-storybook'; -import unusedImports from 'eslint-plugin-unused-imports'; export default [ - ...nx.configs['flat/base'], - ...nx.configs['flat/typescript'], - ...nx.configs['flat/javascript'], + ...base, + ...nx, + ...react, ...storybook.configs['flat/recommended'], { ignores: [ @@ -21,24 +20,6 @@ export default [ '!.storybook', ], }, - { - files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], - rules: { - '@nx/enforce-module-boundaries': [ - 'error', - { - enforceBuildableLibDependency: true, - allow: ['^.*/eslint(\\.base)?\\.config\\.[cm]?[jt]s$'], - depConstraints: [ - { - sourceTag: '*', - onlyDependOnLibsWithTags: ['*'], - }, - ], - }, - ], - }, - }, { files: [ '**/*.ts', @@ -50,10 +31,6 @@ export default [ '**/*.cjs', '**/*.mjs', ], - plugins: { - 'simple-import-sort': simpleImportSort, - 'unused-imports': unusedImports, - }, rules: { 'simple-import-sort/imports': [ 'error', @@ -80,36 +57,11 @@ export default [ ], }, ], - 'simple-import-sort/exports': 'error', - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': 'off', - 'unused-imports/no-unused-imports': 'error', - 'unused-imports/no-unused-vars': [ - 'warn', - { - vars: 'all', - varsIgnorePattern: '^_', - args: 'after-used', - argsIgnorePattern: '^_', - }, - ], - }, - }, - { - files: ['**/*.ts', '**/*.tsx', '**/*.cts', '**/*.mts'], - rules: { - '@typescript-eslint/no-explicit-any': 'error', }, }, { files: ['**/*.jsx', '**/*.tsx'], - plugins: { - 'react-hooks': reactHooks, - 'jsx-a11y': jsxA11y, - }, rules: { - ...reactHooks.configs.recommended.rules, - ...jsxA11y.flatConfigs.recommended.rules, // 커스텀 컴포넌트가 autoFocus prop을 forward 하는 패턴은 호출자 책임이므로 제외 'jsx-a11y/no-autofocus': ['error', { ignoreNonDOM: true }], }, diff --git a/nx.json b/nx.json index bfc13c3..15bcc9f 100644 --- a/nx.json +++ b/nx.json @@ -121,7 +121,11 @@ "@berrypjh/react-ui", "@berrypjh/ui-core", "@berrypjh/design-tokens", - "@berrypjh/react-native-ui" + "@berrypjh/react-native-ui", + "@berrypjh/commitlint-config", + "@berrypjh/prettier-config", + "@berrypjh/tsconfig", + "@berrypjh/eslint-config" ], "projectsRelationship": "fixed", "releaseTagPattern": "v{version}", diff --git a/package.json b/package.json index fd2f2d6..8171a3c 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,12 @@ "prepare": "husky install" }, "private": true, + "prettier": "@berrypjh/prettier-config", "devDependencies": { + "@berrypjh/commitlint-config": "workspace:^", + "@berrypjh/eslint-config": "workspace:^", + "@berrypjh/prettier-config": "workspace:^", + "@berrypjh/tsconfig": "workspace:^", "@babel/core": "^7.14.5", "@babel/preset-react": "^7.14.5", "@babel/runtime": "~7.27.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e2ba90..928e8f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,6 +54,18 @@ importers: '@babel/runtime': specifier: ~7.27.6 version: 7.27.6 + '@berrypjh/commitlint-config': + specifier: workspace:^ + version: link:libs/commitlint-config + '@berrypjh/eslint-config': + specifier: workspace:^ + version: link:libs/eslint-config + '@berrypjh/prettier-config': + specifier: workspace:^ + version: link:libs/prettier-config + '@berrypjh/tsconfig': + specifier: workspace:^ + version: link:libs/tsconfig '@commitlint/cli': specifier: ^20.5.0 version: 20.5.0(@types/node@20.19.9)(conventional-commits-parser@6.4.0)(typescript@5.9.3) @@ -402,6 +414,12 @@ importers: apps/demo-web-e2e: {} + libs/commitlint-config: + dependencies: + '@commitlint/config-conventional': + specifier: ^20.5.0 + version: 20.5.0 + libs/design-tokens: devDependencies: '@tokens-studio/sd-transforms': @@ -411,6 +429,29 @@ importers: specifier: ^5.2.0 version: 5.2.0(tslib@2.8.1) + libs/eslint-config: + dependencies: + '@nx/eslint-plugin': + specifier: ^22.6.5 + version: 22.7.1(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(typescript@5.9.3)(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0)) + eslint: + specifier: ^9.8.0 + version: 9.39.2(jiti@2.6.1) + eslint-plugin-jsx-a11y: + specifier: 6.10.1 + version: 6.10.1(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: + specifier: 5.0.0 + version: 5.0.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-simple-import-sort: + specifier: ^13.0.0 + version: 13.0.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-unused-imports: + specifier: ^4.4.1 + version: 4.4.1(@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + + libs/prettier-config: {} + libs/react-native-ui: dependencies: react: @@ -443,6 +484,8 @@ importers: specifier: ^1.97.3 version: 1.97.3 + libs/tsconfig: {} + libs/ui-core: devDependencies: '@berrypjh/design-tokens': @@ -2655,6 +2698,11 @@ packages: peerDependencies: nx: '>= 21 <= 23 || ^22.0.0-0' + '@nx/devkit@22.7.1': + resolution: {integrity: sha512-z2ayFHq406MyVpNtksGnsfHOYZVTSInwQgZeg6u+S4sD21Wvb+oldhqkbYX46jiGJSaw5aUjFdzXJu2l4MYP1A==} + peerDependencies: + nx: '>= 21 <= 23 || ^22.0.0-0' + '@nx/eslint-plugin@22.3.3': resolution: {integrity: sha512-UGAqvYUlKGupBUsO9ppEzYkai1VrrFrUkzHPOVUu5JM4zYGN30ruoO+j3K5OXu5jQLGCmOVfAQD3jzqT2balmw==} peerDependencies: @@ -2664,6 +2712,15 @@ packages: eslint-config-prettier: optional: true + '@nx/eslint-plugin@22.7.1': + resolution: {integrity: sha512-LkW2QwkiB0MslknVN8If2JQZHFPgD1FkfTkVzgw2j+3B/+4dBN8aJsWgr6b3T4vn/n6XxtwFd7NVuJlsk5nyyQ==} + peerDependencies: + '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 || ^8.0.0 + eslint-config-prettier: ^10.0.0 + peerDependenciesMeta: + eslint-config-prettier: + optional: true + '@nx/eslint@22.3.3': resolution: {integrity: sha512-iG/LvrYf2CFAm2A0kfmRU4VeCTAN5PjUw8xc6oD1zfQ/KTmE/gFG2P1aJBo2mTIyzk9k8ZI0dqIhPLdl/AAtxg==} peerDependencies: @@ -2710,6 +2767,14 @@ packages: verdaccio: optional: true + '@nx/js@22.7.1': + resolution: {integrity: sha512-zvPaamdAFehy4PsA963sJuwVXehsbpSJQJgEW6xcWy58lYLI/NRQHSZn4yJmuaFVnuuciRlmiacCom242byWnw==} + peerDependencies: + verdaccio: ^6.0.5 + peerDependenciesMeta: + verdaccio: + optional: true + '@nx/module-federation@22.3.3': resolution: {integrity: sha512-bo0qsW0hDhuyS/WnHQ1nndHcd7VeuMS3bxCwPJkPm8+qsVhWT88GO9WoYnlvdpx/LfTT/N6k1AOVOKAygRuUNQ==} @@ -2723,6 +2788,11 @@ packages: cpu: [arm64] os: [darwin] + '@nx/nx-darwin-arm64@22.7.1': + resolution: {integrity: sha512-m00ZmBn39VUgb0Ahhu5iY6D56ETdXjDbVnOz0XF3DacJrcLtq9sZ+cg1bj6PshqtvRWVg+zJRrZBU6vL7hGuFQ==} + cpu: [arm64] + os: [darwin] + '@nx/nx-darwin-x64@22.3.3': resolution: {integrity: sha512-6ZQ6rMqH8NY4Jz+Gc89D5bIH2NxZb5S/vaA4yJ9RrqAfl4QWchNFD5na+aRivSd+UdsYLPKKl6qohet5SE6vOg==} cpu: [x64] @@ -2733,6 +2803,11 @@ packages: cpu: [x64] os: [darwin] + '@nx/nx-darwin-x64@22.7.1': + resolution: {integrity: sha512-DmD8Qow+Yt7Yrmjlz1AsfiwxW+0kRzg+6MY70+d7qChtD2bTzvA/k0ut8SMy+CxU3kxgUbKhGOtml5JDXoX2ww==} + cpu: [x64] + os: [darwin] + '@nx/nx-freebsd-x64@22.3.3': resolution: {integrity: sha512-J/PP5pIOQtR7ZzrFwP6d6h0yfY7r9EravG2m940GsgzGbtZGYIDqnh5Wdt+4uBWPH8VpdNOwFqH0afELtJA3MA==} cpu: [x64] @@ -2743,6 +2818,11 @@ packages: cpu: [x64] os: [freebsd] + '@nx/nx-freebsd-x64@22.7.1': + resolution: {integrity: sha512-HboVrUCHcuYTXtuX3dMyRszP7JO90ZVBLWgnmaM7jUM7jnllZjmezUMtpNHfN1GQbVFafJf/NBShDWsu9LuaUA==} + cpu: [x64] + os: [freebsd] + '@nx/nx-linux-arm-gnueabihf@22.3.3': resolution: {integrity: sha512-/zn0altzM15S7qAgXMaB41vHkEn18HyTVUvRrjmmwaVqk9WfmDmqOQlGWoJ6XCbpvKQ8bh14RyhR9LGw1JJkNA==} cpu: [arm] @@ -2753,6 +2833,11 @@ packages: cpu: [arm] os: [linux] + '@nx/nx-linux-arm-gnueabihf@22.7.1': + resolution: {integrity: sha512-5Gm8Y7L8WXMLUjHhiy1eqGz5/PiRw1YLanFg5audBNkZvH6Jkwzdpoz0dbeKjwMDHz4NmniUV1s76Th8VLWmiQ==} + cpu: [arm] + os: [linux] + '@nx/nx-linux-arm64-gnu@22.3.3': resolution: {integrity: sha512-NmPeCexWIZHW9RM3lDdFENN9C3WtlQ5L4RSNFESIjreS921rgePhulsszYdGnHdcnKPYlBBJnX/NxVsfioBbnQ==} cpu: [arm64] @@ -2765,6 +2850,12 @@ packages: os: [linux] libc: [glibc] + '@nx/nx-linux-arm64-gnu@22.7.1': + resolution: {integrity: sha512-GdgPYMfbijBRFJs1absL/9QdSNLsTAGdyKykDf9CaVxEMZ92VB+pncpX9Vn/ZBCSeeWTLF+bSK3UM5v+loIObQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@nx/nx-linux-arm64-musl@22.3.3': resolution: {integrity: sha512-K02U88Q0dpvCfmSXXvY7KbYQSa1m+mkYeqDBRHp11yHk1GoIqaHp8oEWda7FV4gsriNExPSS5tX1/QGVoLZrCw==} cpu: [arm64] @@ -2777,6 +2868,12 @@ packages: os: [linux] libc: [musl] + '@nx/nx-linux-arm64-musl@22.7.1': + resolution: {integrity: sha512-HyBgPtY1hyNTk8683nt7F29jh3lVdS/zul9vS0NgKeCSoYL3GRM3nLoTPynoHUxyVP/tWYOE3ymvnk92qYwL4Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@nx/nx-linux-x64-gnu@22.3.3': resolution: {integrity: sha512-04TEbvgwRaB9ifr39YwJmWh3RuXb4Ry4m84SOJyjNXAfPrepcWgfIQn1VL2ul1Ybq+P023dLO9ME8uqFh6j1YQ==} cpu: [x64] @@ -2789,6 +2886,12 @@ packages: os: [linux] libc: [glibc] + '@nx/nx-linux-x64-gnu@22.7.1': + resolution: {integrity: sha512-bQBgRiEsanNvKcDOjVAUPjvcp0iDLofYYUL2af2iuCDxreLOej+J6MeA5bWTLNly5ly1d4voKGTqa+OsouVyLg==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@nx/nx-linux-x64-musl@22.3.3': resolution: {integrity: sha512-uxBXx5q+S5OGatbYDxnamsKXRKlYn+Eq1nrCAHaf8rIfRoHlDiRV2PqtWuF+O2pxR5FWKpvr+/sZtt9rAf7KMw==} cpu: [x64] @@ -2801,6 +2904,12 @@ packages: os: [linux] libc: [musl] + '@nx/nx-linux-x64-musl@22.7.1': + resolution: {integrity: sha512-gcco2GjcAztF/fRcAgFxtWxrWDnQdNmPaAN9FTt1+qQ9RUSLvdL8bQxKx4Kd9N9T+gXPlrWhMkBkKbbV09+X1Q==} + cpu: [x64] + os: [linux] + libc: [musl] + '@nx/nx-win32-arm64-msvc@22.3.3': resolution: {integrity: sha512-aOwlfD6ZA1K6hjZtbhBSp7s1yi3sHbMpLCa4stXzfhCCpKUv46HU/EdiWdE1N8AsyNFemPZFq81k1VTowcACdg==} cpu: [arm64] @@ -2811,6 +2920,11 @@ packages: cpu: [arm64] os: [win32] + '@nx/nx-win32-arm64-msvc@22.7.1': + resolution: {integrity: sha512-IT9oEn0YQ83iPH7666aoPyTRsUzBIBJdBLMXeLX4I60fHPXWhUSGpfiLtIsgU2OfeOVb9hU9idwNh1wc4u9rWQ==} + cpu: [arm64] + os: [win32] + '@nx/nx-win32-x64-msvc@22.3.3': resolution: {integrity: sha512-EDR8BtqeDvVNQ+kPwnfeSfmerYetitU3tDkxOMIybjKJDh69U2JwTB8n9ARwNaZQbNk7sCGNRUSZFTbAAUKvuQ==} cpu: [x64] @@ -2821,6 +2935,11 @@ packages: cpu: [x64] os: [win32] + '@nx/nx-win32-x64-msvc@22.7.1': + resolution: {integrity: sha512-P2zeSKXVH2Eiwsb8UfP2rMMS7//cHWpiO4M9zt6q0c4lI/hN1vXBciRKVWruGk9ZrWLHuhaMAhG94+MJtzKuRQ==} + cpu: [x64] + os: [win32] + '@nx/playwright@22.7.0': resolution: {integrity: sha512-e/hkvh6IROr63PFACVXQnDxI695gK4XgV0xNKYqXQ68PbZx+N1tRsr/12iHw+dxZ2sp/aya9SEeGkItRMinbPA==} peerDependencies: @@ -2872,6 +2991,9 @@ packages: '@nx/workspace@22.7.0': resolution: {integrity: sha512-ZhZYOlyPt1kJBvuC8MbTVTkDJSiEnr7Fu0luTGsbVLQO+2bHjIJml5HT1vCNpn39VH4Y4ZLgclHOt6P+KJH6/g==} + '@nx/workspace@22.7.1': + resolution: {integrity: sha512-wnBMgeogdGaRdxDDzZspSt1U87PMeYJhz1ygr42L9Lot9E5nCf17E85iyHl3YxcMSNslHxnHyTkq7MyQ8hHjdQ==} + '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} @@ -2965,6 +3087,11 @@ packages: peerDependencies: typescript: ^3 || ^4 || ^5 + '@phenomnomnominal/tsquery@6.1.4': + resolution: {integrity: sha512-3tHlGy/fxjJCHqIV8nelAzbRTNkCUY+k7lqBGKNuQz99H2OKGRt6oU+U2SZs6LYrbOe8mxMFl6kq6gzHapFRkw==} + peerDependencies: + typescript: ^3 || ^4 || ^5 + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -4074,6 +4201,9 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/esquery@1.5.4': + resolution: {integrity: sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -9233,6 +9363,18 @@ packages: '@swc/core': optional: true + nx@22.7.1: + resolution: {integrity: sha512-SadJUQY57MiwRIetm9rhZhdpFeOe1Csib2Vg9C423Pw/h0fZE14qUo6+OBby9vLh5QCkRfRZ0WaHkeO5q6yNtA==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.11.1 + '@swc/core': ^1.15.0 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + nyc@15.1.0: resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} engines: {node: '>=8.9'} @@ -13265,6 +13407,11 @@ snapshots: eslint: 9.39.2(jiti@2.4.2) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.21.1': @@ -14884,6 +15031,17 @@ snapshots: tslib: 2.8.1 yargs-parser: 21.1.1 + '@nx/devkit@22.7.1(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))': + dependencies: + '@zkochan/js-yaml': 0.0.7 + ejs: 5.0.1 + enquirer: 2.3.6 + minimatch: 10.2.4 + nx: 22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)) + semver: 7.7.4 + tslib: 2.8.1 + yargs-parser: 21.1.1 + '@nx/eslint-plugin@22.3.3(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.4.2)))(eslint@9.39.2(jiti@2.4.2))(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(typescript@5.9.3)(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@nx/devkit': 22.3.3(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))) @@ -14911,6 +15069,33 @@ snapshots: - typescript - verdaccio + '@nx/eslint-plugin@22.7.1(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(typescript@5.9.3)(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0))': + dependencies: + '@nx/devkit': 22.7.1(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))) + '@nx/js': 22.7.1(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 6.1.4(typescript@5.9.3) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + chalk: 4.1.2 + confusing-browser-globals: 1.0.11 + globals: 15.15.0 + jsonc-eslint-parser: 2.4.2 + semver: 7.7.4 + tslib: 2.8.1 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - debug + - eslint + - nx + - supports-color + - typescript + - verdaccio + '@nx/eslint@22.3.3(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@zkochan/js-yaml@0.0.7)(eslint@9.39.2(jiti@2.4.2))(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@nx/devkit': 22.3.3(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))) @@ -15107,6 +15292,44 @@ snapshots: - nx - supports-color + '@nx/js@22.7.1(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0))': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.6) + '@babel/preset-env': 7.28.6(@babel/core@7.28.6) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) + '@babel/runtime': 7.27.6 + '@nx/devkit': 22.7.1(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))) + '@nx/workspace': 22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)) + '@zkochan/js-yaml': 0.0.7 + babel-plugin-const-enum: 1.2.0(@babel/core@7.28.6) + babel-plugin-macros: 3.1.0 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.6)(@babel/traverse@7.29.0) + chalk: 4.1.2 + columnify: 1.6.0 + detect-port: 1.6.1 + ignore: 5.3.2 + js-tokens: 4.0.0 + jsonc-parser: 3.2.0 + npm-run-path: 4.0.1 + picocolors: 1.1.1 + picomatch: 4.0.4 + semver: 7.7.4 + source-map-support: 0.5.19 + tinyglobby: 0.2.16 + tslib: 2.8.1 + optionalDependencies: + verdaccio: 6.2.4(encoding@0.1.13)(typanion@3.14.0) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - debug + - nx + - supports-color + '@nx/module-federation@22.3.3(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/helpers@0.5.18)(esbuild@0.28.0)(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@module-federation/enhanced': 0.21.6(@rspack/core@1.7.2(@swc/helpers@0.5.18))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.33(@swc/helpers@0.5.18))(esbuild@0.28.0)) @@ -15147,60 +15370,90 @@ snapshots: '@nx/nx-darwin-arm64@22.7.0': optional: true + '@nx/nx-darwin-arm64@22.7.1': + optional: true + '@nx/nx-darwin-x64@22.3.3': optional: true '@nx/nx-darwin-x64@22.7.0': optional: true + '@nx/nx-darwin-x64@22.7.1': + optional: true + '@nx/nx-freebsd-x64@22.3.3': optional: true '@nx/nx-freebsd-x64@22.7.0': optional: true + '@nx/nx-freebsd-x64@22.7.1': + optional: true + '@nx/nx-linux-arm-gnueabihf@22.3.3': optional: true '@nx/nx-linux-arm-gnueabihf@22.7.0': optional: true + '@nx/nx-linux-arm-gnueabihf@22.7.1': + optional: true + '@nx/nx-linux-arm64-gnu@22.3.3': optional: true '@nx/nx-linux-arm64-gnu@22.7.0': optional: true + '@nx/nx-linux-arm64-gnu@22.7.1': + optional: true + '@nx/nx-linux-arm64-musl@22.3.3': optional: true '@nx/nx-linux-arm64-musl@22.7.0': optional: true + '@nx/nx-linux-arm64-musl@22.7.1': + optional: true + '@nx/nx-linux-x64-gnu@22.3.3': optional: true '@nx/nx-linux-x64-gnu@22.7.0': optional: true + '@nx/nx-linux-x64-gnu@22.7.1': + optional: true + '@nx/nx-linux-x64-musl@22.3.3': optional: true '@nx/nx-linux-x64-musl@22.7.0': optional: true + '@nx/nx-linux-x64-musl@22.7.1': + optional: true + '@nx/nx-win32-arm64-msvc@22.3.3': optional: true '@nx/nx-win32-arm64-msvc@22.7.0': optional: true + '@nx/nx-win32-arm64-msvc@22.7.1': + optional: true + '@nx/nx-win32-x64-msvc@22.3.3': optional: true '@nx/nx-win32-x64-msvc@22.7.0': optional: true + '@nx/nx-win32-x64-msvc@22.7.1': + optional: true + '@nx/playwright@22.7.0(@babel/traverse@7.29.0)(@nx/jest@22.3.3(@babel/traverse@7.29.0)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(ts-node@10.9.1(@swc/core@1.15.33(@swc/helpers@0.5.18))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0)))(@playwright/test@1.59.1)(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))(@zkochan/js-yaml@0.0.7)(eslint@9.39.2(jiti@2.4.2))(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)))(verdaccio@6.2.4(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@nx/devkit': 22.7.0(nx@22.3.3(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))) @@ -15467,6 +15720,22 @@ snapshots: - '@swc/core' - debug + '@nx/workspace@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))': + dependencies: + '@nx/devkit': 22.7.1(nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18))) + '@zkochan/js-yaml': 0.0.7 + chalk: 4.1.2 + enquirer: 2.3.6 + nx: 22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)) + picomatch: 4.0.4 + semver: 7.7.4 + tslib: 2.8.1 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -15533,6 +15802,12 @@ snapshots: esquery: 1.7.0 typescript: 5.9.3 + '@phenomnomnominal/tsquery@6.1.4(typescript@5.9.3)': + dependencies: + '@types/esquery': 1.5.4 + esquery: 1.7.0 + typescript: 5.9.3 + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': @@ -16835,6 +17110,10 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 + '@types/esquery@1.5.4': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} '@types/graceful-fs@4.1.9': @@ -16952,6 +17231,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 + eslint: 9.39.2(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + optional: true + '@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.53.0 @@ -16964,6 +17260,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.53.0(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) @@ -16994,6 +17302,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.53.0': {} '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.3)': @@ -17022,6 +17342,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.53.0': dependencies: '@typescript-eslint/types': 8.53.0 @@ -19732,6 +20063,11 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.4.2) + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + optional: true + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7(supports-color@8.1.1) @@ -19799,6 +20135,26 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 + eslint-plugin-jsx-a11y@6.10.1(eslint@9.39.2(jiti@2.6.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.11.1 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2(jiti@2.6.1) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + eslint-plugin-playwright@2.10.2(eslint@9.39.2(jiti@2.4.2)): dependencies: eslint: 9.39.2(jiti@2.4.2) @@ -19808,6 +20164,10 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.4.2) + eslint-plugin-react-hooks@5.0.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-react@7.35.0(eslint@9.39.2(jiti@2.4.2)): dependencies: array-includes: 3.1.9 @@ -19834,6 +20194,10 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.4.2) + eslint-plugin-simple-import-sort@13.0.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-storybook@10.2.19(eslint@9.39.2(jiti@2.4.2))(storybook@10.2.19(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) @@ -19849,6 +20213,12 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -19904,6 +20274,47 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + espree@10.4.0: dependencies: acorn: 8.15.0 @@ -23700,6 +24111,134 @@ snapshots: transitivePeerDependencies: - debug + nx@22.7.1(@swc-node/register@1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.33(@swc/helpers@0.5.18)): + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@emnapi/wasi-threads': 1.0.4 + '@jest/diff-sequences': 30.0.1 + '@napi-rs/wasm-runtime': 0.2.4 + '@tybys/wasm-util': 0.9.0 + '@yarnpkg/lockfile': 1.1.0 + '@zkochan/js-yaml': 0.0.7 + ansi-colors: 4.1.3 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + argparse: 2.0.1 + asynckit: 0.4.0 + axios: 1.15.0 + balanced-match: 4.0.3 + base64-js: 1.5.1 + bl: 4.1.0 + brace-expansion: 5.0.2 + buffer: 5.7.1 + call-bind-apply-helpers: 1.0.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + clone: 1.0.4 + color-convert: 2.0.1 + color-name: 1.1.4 + combined-stream: 1.0.8 + defaults: 1.0.4 + define-lazy-prop: 2.0.0 + delayed-stream: 1.0.0 + dotenv: 16.4.7 + dotenv-expand: 12.0.3 + dunder-proto: 1.0.1 + ejs: 5.0.1 + emoji-regex: 8.0.0 + end-of-stream: 1.4.5 + enquirer: 2.3.6 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + escalade: 3.2.0 + escape-string-regexp: 1.0.5 + figures: 3.2.0 + flat: 5.0.2 + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 + fs-constants: 1.0.0 + function-bind: 1.1.2 + get-caller-file: 2.0.5 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + has-flag: 4.0.0 + has-symbols: 1.1.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + ieee754: 1.2.1 + ignore: 7.0.5 + inherits: 2.0.4 + is-docker: 2.2.1 + is-fullwidth-code-point: 3.0.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + is-wsl: 2.2.0 + json5: 2.2.3 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + log-symbols: 4.1.0 + math-intrinsics: 1.1.0 + mime-db: 1.52.0 + mime-types: 2.1.35 + mimic-fn: 2.1.0 + minimatch: 10.2.4 + minimist: 1.2.8 + npm-run-path: 4.0.1 + once: 1.4.0 + onetime: 5.1.2 + open: 8.4.2 + ora: 5.3.0 + path-key: 3.1.1 + picocolors: 1.1.1 + proxy-from-env: 2.1.0 + readable-stream: 3.6.2 + require-directory: 2.1.1 + resolve.exports: 2.0.3 + restore-cursor: 3.1.0 + safe-buffer: 5.2.1 + semver: 7.7.4 + signal-exit: 3.0.7 + smol-toml: 1.6.1 + string-width: 4.2.3 + string_decoder: 1.3.0 + strip-ansi: 6.0.1 + strip-bom: 3.0.0 + supports-color: 7.2.0 + tar-stream: 2.2.0 + tmp: 0.2.4 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tslib: 2.8.1 + util-deprecate: 1.0.2 + wcwidth: 1.0.1 + wrap-ansi: 7.0.0 + wrappy: 1.0.2 + y18n: 5.0.8 + yaml: 2.8.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 22.7.1 + '@nx/nx-darwin-x64': 22.7.1 + '@nx/nx-freebsd-x64': 22.7.1 + '@nx/nx-linux-arm-gnueabihf': 22.7.1 + '@nx/nx-linux-arm64-gnu': 22.7.1 + '@nx/nx-linux-arm64-musl': 22.7.1 + '@nx/nx-linux-x64-gnu': 22.7.1 + '@nx/nx-linux-x64-musl': 22.7.1 + '@nx/nx-win32-arm64-msvc': 22.7.1 + '@nx/nx-win32-x64-msvc': 22.7.1 + '@swc-node/register': 1.9.2(@swc/core@1.15.33(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3) + '@swc/core': 1.15.33(@swc/helpers@0.5.18) + transitivePeerDependencies: + - debug + nyc@15.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 diff --git a/tsconfig.base.json b/tsconfig.base.json index c3b7bd0..5aec45a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,20 +1,10 @@ { "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@berrypjh/tsconfig/base.json", "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022"], - "module": "nodenext", - "moduleResolution": "nodenext", - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "isolatedModules": true, - "importHelpers": true, + "module": "esnext", + "moduleResolution": "bundler", "resolveJsonModule": true, - "forceConsistentCasingInFileNames": true, "paths": { "@berrypjh/ui-core": ["./libs/ui-core/src/index.ts"], "@berrypjh/react-ui": ["./libs/react-ui/src/index.ts"], From cd70bfff78453b7f7cb7d4f9aa51e5fff58ecc1f Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:06:45 +0900 Subject: [PATCH 07/22] =?UTF-8?q?refactor(demo-mobile):=20=EB=A3=A8?= =?UTF-8?q?=ED=8A=B8=20baseConfig=EA=B0=80=20react=20=ED=94=84=EB=A6=AC?= =?UTF-8?q?=EC=85=8B=EC=9D=84=20=ED=8F=AC=ED=95=A8=ED=95=98=EB=AF=80?= =?UTF-8?q?=EB=A1=9C=20=EC=A4=91=EB=B3=B5=20nx.configs[flat/react]=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nx flat/react는 이제 루트 eslint.config.mjs가 @berrypjh/eslint-config/react를 통해 제공 - 빈 rules 블록과 @nx/eslint-plugin import 제거로 단순화 --- apps/demo-mobile/eslint.config.mjs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/demo-mobile/eslint.config.mjs b/apps/demo-mobile/eslint.config.mjs index e3050b9..7c520a1 100644 --- a/apps/demo-mobile/eslint.config.mjs +++ b/apps/demo-mobile/eslint.config.mjs @@ -1,15 +1,7 @@ -import nx from '@nx/eslint-plugin'; - import baseConfig from '../../eslint.config.mjs'; export default [ ...baseConfig, - ...nx.configs['flat/react'], - { - files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], - // Override or add rules here - rules: {}, - }, { ignores: ['.expo', 'web-build', 'cache', 'dist', '**/out-tsc'], }, From 6dc9bb364ba7a0dfdf1a386aad54425c83166393 Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:07:07 +0900 Subject: [PATCH 08/22] =?UTF-8?q?refactor(demo-web):=20=EB=A3=A8=ED=8A=B8?= =?UTF-8?q?=20baseConfig=EA=B0=80=20react=20=ED=94=84=EB=A6=AC=EC=85=8B?= =?UTF-8?q?=EC=9D=84=20=ED=8F=AC=ED=95=A8=ED=95=98=EB=AF=80=EB=A1=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20nx.configs[flat/react]=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nx flat/react는 이제 루트 eslint.config.mjs가 @berrypjh/eslint-config/react를 통해 제공 - 빈 rules 블록과 @nx/eslint-plugin import 제거로 단순화 --- apps/demo-web/eslint.config.mjs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/apps/demo-web/eslint.config.mjs b/apps/demo-web/eslint.config.mjs index b53d175..b7f6277 100644 --- a/apps/demo-web/eslint.config.mjs +++ b/apps/demo-web/eslint.config.mjs @@ -1,13 +1,3 @@ -import nx from '@nx/eslint-plugin'; - import baseConfig from '../../eslint.config.mjs'; -export default [ - ...baseConfig, - ...nx.configs['flat/react'], - { - files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], - // Override or add rules here - rules: {}, - }, -]; +export default [...baseConfig]; From d87848d58fb24f2adcc7a92532891baf218031ac Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:07:24 +0900 Subject: [PATCH 09/22] =?UTF-8?q?refactor(react-native-ui):=20=EB=A3=A8?= =?UTF-8?q?=ED=8A=B8=20baseConfig=EA=B0=80=20react=20=ED=94=84=EB=A6=AC?= =?UTF-8?q?=EC=85=8B=EC=9D=84=20=ED=8F=AC=ED=95=A8=ED=95=98=EB=AF=80?= =?UTF-8?q?=EB=A1=9C=20=EC=A4=91=EB=B3=B5=20nx.configs[flat/react]=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nx flat/react는 이제 루트 eslint.config.mjs가 @berrypjh/eslint-config/react를 통해 제공 - 빈 rules 블록과 @nx/eslint-plugin import 제거로 단순화 --- libs/react-native-ui/eslint.config.mjs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/libs/react-native-ui/eslint.config.mjs b/libs/react-native-ui/eslint.config.mjs index de6e552..68c792f 100644 --- a/libs/react-native-ui/eslint.config.mjs +++ b/libs/react-native-ui/eslint.config.mjs @@ -1,15 +1,7 @@ -import nx from '@nx/eslint-plugin'; - import baseConfig from '../../eslint.config.mjs'; export default [ ...baseConfig, - ...nx.configs['flat/react'], - { - files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], - // Override or add rules here - rules: {}, - }, { ignores: ['public', '.cache', 'node_modules'], }, From cc06f1c6fdc633c2c4e8689843b556c15a8ed207 Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Tue, 12 May 2026 22:07:46 +0900 Subject: [PATCH 10/22] =?UTF-8?q?refactor(react-ui):=20=EB=A3=A8=ED=8A=B8?= =?UTF-8?q?=20baseConfig=EA=B0=80=20react=20=ED=94=84=EB=A6=AC=EC=85=8B?= =?UTF-8?q?=EC=9D=84=20=ED=8F=AC=ED=95=A8=ED=95=98=EB=AF=80=EB=A1=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20nx.configs[flat/react]=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nx flat/react는 이제 루트 eslint.config.mjs가 @berrypjh/eslint-config/react를 통해 제공 - 빈 rules 블록과 @nx/eslint-plugin import 제거로 단순화 --- libs/react-ui/eslint.config.mjs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/libs/react-ui/eslint.config.mjs b/libs/react-ui/eslint.config.mjs index f047003..165bb0e 100644 --- a/libs/react-ui/eslint.config.mjs +++ b/libs/react-ui/eslint.config.mjs @@ -1,15 +1,7 @@ -import nx from '@nx/eslint-plugin'; - import baseConfig from '../../eslint.config.mjs'; export default [ ...baseConfig, - ...nx.configs['flat/react'], - { - files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], - // Override or add rules here - rules: {}, - }, { ignores: ['**/out-tsc', '**/.storybook/**'], }, From 30eec219ef5e27925a1b361bd5b224254b9399c8 Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Sat, 16 May 2026 19:56:15 +0900 Subject: [PATCH 11/22] =?UTF-8?q?chore(root):=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EB=AA=85=EC=9D=84=20shared-stack=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - package.json name 필드를 ui-source → shared-stack으로 변경 - README 상단 제목을 신규 패키지명에 맞춰 동기화 --- README.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de72824..a1199e1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# @berrypjh/ui-source +# @berrypjh/shared-stack > **Note** > GitHub Packages 비공개 배포 라이브러리입니다. 설치 전 `.npmrc` 설정이 필요합니다. diff --git a/package.json b/package.json index 8171a3c..6cbf9de 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@berrypjh/ui-source", + "name": "@berrypjh/shared-stack", "version": "0.0.0", "license": "MIT", "scripts": { From fb377580b2bfa2fc7154bc07cc8b4a9fe62d7175 Mon Sep 17 00:00:00 2001 From: Junhyuk Park Date: Sat, 16 May 2026 19:56:40 +0900 Subject: [PATCH 12/22] =?UTF-8?q?chore(demo-web):=20GitHub=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=EB=A5=BC=20shared-stack=20=EC=A0=80=EC=9E=A5=EC=86=8C?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HomePage View on GitHub 버튼의 외부 링크를 신규 저장소(berrypjh/shared-stack)로 업데이트 --- apps/demo-web/src/app/pages/HomePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/demo-web/src/app/pages/HomePage.tsx b/apps/demo-web/src/app/pages/HomePage.tsx index c31cb01..f9d6e31 100644 --- a/apps/demo-web/src/app/pages/HomePage.tsx +++ b/apps/demo-web/src/app/pages/HomePage.tsx @@ -64,7 +64,7 @@ export const HomePage = () => {