melta-app 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -2
- package/eslint-rules/melta.mjs +26 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -276,12 +276,48 @@ enableSafeAreaContext({ edges: ["top"] });
|
|
|
276
276
|
### lint plugin(`melta-app/eslint-plugin`)
|
|
277
277
|
|
|
278
278
|
melta 契約からの逸脱を機械検知する eslint カスタムルール 4 本を同梱している。
|
|
279
|
-
消費者プロジェクトの flat config に組み込むと、生値の直書きが lint
|
|
279
|
+
消費者プロジェクトの flat config に組み込むと、生値の直書きが lint で止まる。
|
|
280
|
+
推奨 severity 込みの config を配布しているので **1 行で入る**:
|
|
280
281
|
|
|
281
282
|
```js
|
|
282
283
|
// eslint.config.mjs
|
|
283
284
|
import { meltaPlugin } from "melta-app/eslint-plugin";
|
|
284
285
|
|
|
286
|
+
export default [meltaPlugin.configs.recommended];
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
`configs.recommended`(flat config 形式)は plugin の登録とルール 4 本の severity を含む。
|
|
290
|
+
**severity の正本は plugin 側**なので、消費者がドキュメントから写して持つ必要はない。
|
|
291
|
+
|
|
292
|
+
⚠️ **前提**: この config は parser を提供しない。TS/TSX を lint するには、既存の base config
|
|
293
|
+
(`@react-native/eslint-config/flat` や typescript-eslint 等、parser を持つもの)の**上に追加**すること。
|
|
294
|
+
recommended 単独の構成では TS/TSX の構文解析に失敗する。
|
|
295
|
+
|
|
296
|
+
適用範囲は指定していない(消費者側の config 構成に委ねる)。TS/TSX だけに絞る、
|
|
297
|
+
severity を変える、といった**カスタマイズをする場合**は spread して上書きする:
|
|
298
|
+
|
|
299
|
+
```js
|
|
300
|
+
// eslint.config.mjs(カスタマイズする場合)
|
|
301
|
+
import { meltaPlugin } from "melta-app/eslint-plugin";
|
|
302
|
+
|
|
303
|
+
export default [
|
|
304
|
+
{
|
|
305
|
+
...meltaPlugin.configs.recommended,
|
|
306
|
+
files: ["src/**/*.{ts,tsx}"],
|
|
307
|
+
rules: {
|
|
308
|
+
...meltaPlugin.configs.recommended.rules,
|
|
309
|
+
"melta/no-raw-spacing": "off", // 例: false positive が多い環境では落とす
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
];
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
plugin の登録とルール指定を最初から自分で書く形(従来の書き方)も動く:
|
|
316
|
+
|
|
317
|
+
```js
|
|
318
|
+
// eslint.config.mjs(すべて手書きする場合)
|
|
319
|
+
import { meltaPlugin } from "melta-app/eslint-plugin";
|
|
320
|
+
|
|
285
321
|
export default [
|
|
286
322
|
{
|
|
287
323
|
plugins: { melta: meltaPlugin },
|
|
@@ -297,6 +333,7 @@ export default [
|
|
|
297
333
|
|
|
298
334
|
- 依存ゼロの自己完結 ESM(eslint 本体以外に何も要らない)。ESLint 9+ の flat config を想定(このリポでは 10.x で検証)
|
|
299
335
|
- `meltaPlugin` は **named export のみ**(default export なし)
|
|
336
|
+
- eslintrc(`.eslintrc.*`)からは登録できない(ESM の named export のみのため)。flat config への移行が要る
|
|
300
337
|
- 検知は AST の構文形状ベースの補助線。変数経由・spread は漏れるので、値の純度の本丸は
|
|
301
338
|
token 経由(`theme.*`)で書く習慣の側にある
|
|
302
339
|
|
|
@@ -311,7 +348,7 @@ export default [
|
|
|
311
348
|
- ✅ form / feedback 10 個(TextField / Toggle / Checkbox / Radio / Alert / Toast / Progress / Modal / ActionSheet / BottomSheet)— checkbox / radio は Pressable + 描画(svg 非依存)、ActionSheet / BottomSheet は select / dropdown の adapted 変換先の受け皿
|
|
312
349
|
- ✅ showcase(https://app.melta.tsubotax.com — melta-ui 様式シェル + 実 RN カタログの Live 埋め込み。表・統計は契約からビルド時生成)
|
|
313
350
|
- ✅ AI 入口: [llms.txt](https://app.melta.tsubotax.com/llms.txt)(契約から生成・drift 検査対象)+ [docs/patterns.md](docs/patterns.md)(フォームの組み方規範。スニペットは実コードと機械同期)
|
|
314
|
-
- ✅ lint 強制層の npm 配布(0.5.2): `melta-app/eslint-plugin` を公開 subpath 化。消費者プロジェクトの flat config に組めば、生値の直書きが消費者側でも lint
|
|
351
|
+
- ✅ lint 強制層の npm 配布(0.5.2): `melta-app/eslint-plugin` を公開 subpath 化。消費者プロジェクトの flat config に組めば、生値の直書きが消費者側でも lint で止まる。推奨 severity は `configs.recommended` で配布(0.5.3。消費者が手書きで写さない)
|
|
315
352
|
- ✅ [npm publish(0.5.2)](https://www.npmjs.com/package/melta-app)
|
|
316
353
|
- ⬜ React Native Directory 登録([PR #2606](https://github.com/react-native-community/directory/pull/2606) レビュー待ち)
|
|
317
354
|
|
package/eslint-rules/melta.mjs
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
* - no-raw-radius : borderRadius 系プロパティに数値リテラル直書き → error
|
|
9
9
|
* - no-raw-spacing : padding/margin/gap 系に数値リテラル直書き → warn(false positive 多)
|
|
10
10
|
* - no-raw-fontsize: fontSize に数値リテラル直書き → warn
|
|
11
|
+
*
|
|
12
|
+
* この severity は `meltaPlugin.configs.recommended`(flat config)として機械可読な形で配布する。
|
|
13
|
+
* 消費者が手で書き写すとドリフト源になるため(rally-nav の外部導入 T6、2026-08-04)、
|
|
14
|
+
* 推奨値の正本はこのファイルの RECOMMENDED_RULES であってドキュメントではない。
|
|
11
15
|
*/
|
|
12
16
|
|
|
13
17
|
const COLOR_RE = /#[0-9a-fA-F]{3,8}\b|\brgba?\s*\(|\bhsla?\s*\(/;
|
|
@@ -96,3 +100,25 @@ export const meltaPlugin = {
|
|
|
96
100
|
},
|
|
97
101
|
},
|
|
98
102
|
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 推奨 severity の正本。
|
|
106
|
+
* error = 契約違反として止める / warn = false positive がありうるので助言に留める。
|
|
107
|
+
*/
|
|
108
|
+
const RECOMMENDED_RULES = {
|
|
109
|
+
"melta/no-raw-color": "error",
|
|
110
|
+
"melta/no-raw-radius": "error",
|
|
111
|
+
"melta/no-raw-spacing": "warn",
|
|
112
|
+
"melta/no-raw-fontsize": "warn",
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// flat config 慣行に従い、plugin 自身を参照する config は定義後に後付けする(自己参照の循環を避ける)。
|
|
116
|
+
// `files` はあえて指定しない — 適用範囲は消費者側の config 構成に委ねる
|
|
117
|
+
// (TS/TSX に絞りたい場合は spread して `files` を足す。README「カスタマイズする場合」参照)。
|
|
118
|
+
meltaPlugin.configs = {
|
|
119
|
+
recommended: {
|
|
120
|
+
name: "melta/recommended",
|
|
121
|
+
plugins: { melta: meltaPlugin },
|
|
122
|
+
rules: { ...RECOMMENDED_RULES },
|
|
123
|
+
},
|
|
124
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "melta-app",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "melta for APP — melta デザインシステムの React Native UI kit。melta-contracts(デザイン契約)を single source of truth に RN 実装でその契約を満たす。アプリ本体ではなくライブラリ。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://app.melta.tsubotax.com",
|