nene-lang 0.1.0 → 0.1.1
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 +6 -6
- package/build/cli.js +1 -1
- package/build/packages.js +1 -1
- package/docs/design.md +1 -1
- package/docs/guide.md +2 -2
- package/docs/spec.md +1 -1
- package/package.json +2 -2
- package/template/CLAUDE.md +2 -2
- package/template/package.json +1 -1
- package/template/src/Main.nn +2 -2
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Nene(ネネ)は、Haskell の書き心地と JSX の見やすさを両立させる、UI 向けの関数型言語。少ない規則で書き、タグを見れば画面の形が分かる。
|
|
6
6
|
|
|
7
|
-
> **ステータス: v0.1。** 言語仕様、コンパイラ、ランタイム、`nene` コマンド、Vite プラグイン、公式の部品集 [nene-ui](ui/README.md)、nvim 用のハイライトと言語サーバーがある。
|
|
7
|
+
> **ステータス: v0.1。** 言語仕様、コンパイラ、ランタイム、`nene` コマンド、Vite プラグイン、公式の部品集 [nene-lang-ui](ui/README.md)、nvim 用のハイライトと言語サーバーがある。
|
|
8
8
|
|
|
9
9
|
```haskell
|
|
10
10
|
view :: Model -> Html Msg
|
|
@@ -46,7 +46,7 @@ style
|
|
|
46
46
|
| 層 | 中身 | パッケージ |
|
|
47
47
|
| --- | --- | --- |
|
|
48
48
|
| 言語 | コンパイラ、ランタイム、`nene` コマンド、標準ライブラリ(ルーティング・HTTP・JSON など) | `nene-lang` |
|
|
49
|
-
| 部品集 | ボタン・入力欄・ダイアログなど 16 の部品 | [`nene-ui`](ui/README.md) |
|
|
49
|
+
| 部品集 | ボタン・入力欄・ダイアログなど 16 の部品 | [`nene-lang-ui`](ui/README.md) |
|
|
50
50
|
|
|
51
51
|
標準ライブラリは差し替えられない(ルーティングも HTTP も一通りだけ)。部品集は別のパッケージで、使わなくてもよい。出力には、アプリが使っている標準モジュールとランタイムの部分だけが入る。
|
|
52
52
|
|
|
@@ -90,7 +90,7 @@ my-app/
|
|
|
90
90
|
index.html <script type="module" src="/src/Main.nn"> が入口
|
|
91
91
|
src/Main.nn
|
|
92
92
|
public/ 画像など。そのままの名前で配信される
|
|
93
|
-
CLAUDE.md Claude Code 向けの Nene の書き方(nene-ui の部品も)
|
|
93
|
+
CLAUDE.md Claude Code 向けの Nene の書き方(nene-lang-ui の部品も)
|
|
94
94
|
.claude/ .nn を編集したら型検査して、エラーを Claude に伝えるフック
|
|
95
95
|
```
|
|
96
96
|
|
|
@@ -127,7 +127,7 @@ npm run dev
|
|
|
127
127
|
|
|
128
128
|
### パッケージを作る
|
|
129
129
|
|
|
130
|
-
`package.json` に `"nene": { "source": "src" }` と書いた npm パッケージは、`src/` の `.nn` を `import` で使える(`nene-ui` もこの形)。モジュール名は、ほかとぶつからないように頭を揃える(`Ui.Button` など)。同じ名前のモジュールが 2 か所にあるとエラーになる。
|
|
130
|
+
`package.json` に `"nene": { "source": "src" }` と書いた npm パッケージは、`src/` の `.nn` を `import` で使える(`nene-lang-ui` もこの形)。モジュール名は、ほかとぶつからないように頭を揃える(`Ui.Button` など)。同じ名前のモジュールが 2 か所にあるとエラーになる。
|
|
131
131
|
|
|
132
132
|
### 既存の Vite プロジェクトに入れる
|
|
133
133
|
|
|
@@ -187,7 +187,7 @@ npm pack # 配布するパッケージを手元で作る
|
|
|
187
187
|
| [examples/Todo.nn](examples/Todo.nn) | elm-sample のタスク管理画面に相当するもの |
|
|
188
188
|
| [examples/Gallery.nn](examples/Gallery.nn) | アルバムごとに写真が横に続くギャラリー。開いた写真は URL に入り、戻るボタンや Esc で閉じる |
|
|
189
189
|
| [examples/Stopwatch.nn](examples/Stopwatch.nn) | タイマー・キーボード・ブラウザへの保存・ダークテーマを使う例 |
|
|
190
|
-
| [examples/Showcase.nn](examples/Showcase.nn) | nene-ui の部品を一通り並べた見本 |
|
|
190
|
+
| [examples/Showcase.nn](examples/Showcase.nn) | nene-lang-ui の部品を一通り並べた見本 |
|
|
191
191
|
|
|
192
192
|
## 構成
|
|
193
193
|
|
|
@@ -204,7 +204,7 @@ npm pack # 配布するパッケージを手元で作る
|
|
|
204
204
|
| `src/lib/*.nn` | 標準ライブラリ(Nene で書かれている) |
|
|
205
205
|
| `runtime/runtime.js` | 仮想 DOM、レイアウトタグ、`style` ブロックの CSS の読み込み、URL、The Elm Architecture の実行 |
|
|
206
206
|
| `runtime/http.js` | JSON との変換と HTTP(使うアプリにだけ入る) |
|
|
207
|
-
| `ui/` | 公式の部品集 `nene-ui` |
|
|
207
|
+
| `ui/` | 公式の部品集 `nene-lang-ui` |
|
|
208
208
|
| `src/css.ts` | `style` ブロックのクラス名を取り出し、ファイルごとに区別できる名前に書き換える |
|
|
209
209
|
| `src/cli.ts` / `src/vite.ts` / `src/lsp.ts` | `nene` コマンド、Vite プラグイン、言語サーバー |
|
|
210
210
|
| `src/report.ts` | コンパイルエラーを、該当する行と印つきで見せる |
|
package/build/cli.js
CHANGED
|
@@ -160,7 +160,7 @@ function createProject(name) {
|
|
|
160
160
|
const real = realpathSync(packageRoot);
|
|
161
161
|
const local = !real.split(/[\\/]/).includes("node_modules");
|
|
162
162
|
const dependency = local ? `file:${real}` : `^${version}`;
|
|
163
|
-
const uiDependency = local ? `file:${join(real, "ui")}` : `^${version}`; // nene-ui は nene-lang と同じ版で出す
|
|
163
|
+
const uiDependency = local ? `file:${join(real, "ui")}` : `^${version}`; // nene-lang-ui は nene-lang と同じ版で出す
|
|
164
164
|
copyTemplate(join(packageRoot, "template"), dir, { name: basename(dir), dependency, uiDependency });
|
|
165
165
|
if (local)
|
|
166
166
|
console.log(paint("2", `(手元の ${real} を使うプロジェクトとして作ります)\n`));
|
package/build/packages.js
CHANGED
package/docs/design.md
CHANGED
|
@@ -100,7 +100,7 @@ Nene では、JSON との変換を型から決める。メッセージに `GotTo
|
|
|
100
100
|
|
|
101
101
|
ルーティング、HTTP、JSON は標準ライブラリに入れ、差し替えられないようにした。React ではルーターも状態管理もスタイルの当て方も選べるが、そのぶん、プロジェクトごとに書き方が違う。Nene では、こうした土台は一通りだけにする。標準ライブラリに入れても、使っていないモジュールは出力に入らないので、アプリは重くならない。
|
|
102
102
|
|
|
103
|
-
見た目の好みが分かれる部品集は、別のパッケージ `nene-ui` にした。使わずに自分で部品を作ってもよい。ただし、外から足せるのは部品と関数だけで、言語の振る舞いを変える差し込み口は作らない。
|
|
103
|
+
見た目の好みが分かれる部品集は、別のパッケージ `nene-lang-ui` にした。使わずに自分で部品を作ってもよい。ただし、外から足せるのは部品と関数だけで、言語の振る舞いを変える差し込み口は作らない。
|
|
104
104
|
|
|
105
105
|
## 道具
|
|
106
106
|
|
package/docs/guide.md
CHANGED
|
@@ -276,7 +276,7 @@ button :: ButtonProps msg -> [Html msg] -> Html msg
|
|
|
276
276
|
|
|
277
277
|
### 用意された部品を使う
|
|
278
278
|
|
|
279
|
-
ボタン・入力欄・ダイアログなどは、公式の部品集 `nene-ui` にある(`nene new` で作ったプロジェクトには入っている)。
|
|
279
|
+
ボタン・入力欄・ダイアログなどは、公式の部品集 `nene-lang-ui` にある(`nene new` で作ったプロジェクトには入っている)。
|
|
280
280
|
|
|
281
281
|
```haskell
|
|
282
282
|
import Ui.Button (Variant(..))
|
|
@@ -289,7 +289,7 @@ import Ui.Theme (Tone(..))
|
|
|
289
289
|
<Dialog open={model.asking} title="削除しますか?" onClose={Cancel}>…</Dialog>
|
|
290
290
|
```
|
|
291
291
|
|
|
292
|
-
部品の一覧と、色の変え方は `node_modules/nene-ui/README.md` にある。
|
|
292
|
+
部品の一覧と、色の変え方は `node_modules/nene-lang-ui/README.md` にある。
|
|
293
293
|
|
|
294
294
|
### ファイルと部品
|
|
295
295
|
|
package/docs/spec.md
CHANGED
|
@@ -38,7 +38,7 @@ import qualified Ui.Dialog as Modal
|
|
|
38
38
|
- export の書き方は Haskell と同じ。`T(..)` で型とそのコンストラクタをすべて export する。
|
|
39
39
|
- `import M` は M が export したものをすべて取り込む。`import M (a, B(..))` は指定したものだけを取り込む。
|
|
40
40
|
- `import qualified M as N` は `N.x` の形でだけ使えるようにする。
|
|
41
|
-
- `import` したモジュールは、プロジェクトのフォルダと、Nene のパッケージから探す。Nene のパッケージは、`package.json` に `"nene": { "source": "src" }` と書いた npm パッケージで、`source` のフォルダにモジュールを置く(`nene-ui` の `src/Ui/Button.nn` は `Ui.Button`)。プロジェクトの `dependencies` と `devDependencies`、そこからたどれるパッケージが対象。同じ名前のモジュールが 2 か所にあればコンパイルエラー。
|
|
41
|
+
- `import` したモジュールは、プロジェクトのフォルダと、Nene のパッケージから探す。Nene のパッケージは、`package.json` に `"nene": { "source": "src" }` と書いた npm パッケージで、`source` のフォルダにモジュールを置く(`nene-lang-ui` の `src/Ui/Button.nn` は `Ui.Button`)。プロジェクトの `dependencies` と `devDependencies`、そこからたどれるパッケージが対象。同じ名前のモジュールが 2 か所にあればコンパイルエラー。
|
|
42
42
|
- 標準モジュール(14 章)のうち `Prelude` はつねに取り込まれている。`App` `Cmd` `Sub` `List` `Maybe` `String` `Time` `Window` `Keyboard` `Nav` `Storage` は import なしで `App.app` のように修飾名で使う。
|
|
43
43
|
|
|
44
44
|
## 2. 字句
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nene-lang",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"nene": "bin/nene.js"
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@types/jsdom": "^21.1.7",
|
|
38
38
|
"@types/node": "^22.20.5",
|
|
39
39
|
"jsdom": "^25.0.1",
|
|
40
|
-
"nene-ui": "file:./ui",
|
|
40
|
+
"nene-lang-ui": "file:./ui",
|
|
41
41
|
"typescript": "^5.8.3"
|
|
42
42
|
},
|
|
43
43
|
"publishConfig": {
|
package/template/CLAUDE.md
CHANGED
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
- 標準モジュール(`List` `Maybe` `Result` `String` `Dict` `Json` `Http` `Storage` `Time` `Random` `Nav` `Dom` `Env` `Cmd` `Sub` `App` など)は import せず `List.head` のように修飾して使う。
|
|
31
31
|
- 型クラスと演算子は自分で定義できない。`null` は無く `Maybe` を使う。パターンの漏れはエラー。
|
|
32
32
|
|
|
33
|
-
## 部品(nene-ui)
|
|
33
|
+
## 部品(nene-lang-ui)
|
|
34
34
|
|
|
35
|
-
ボタン・入力欄などは自分で作らず、まず `nene-ui` を使う。一覧と属性は `node_modules/nene-ui/README.md`、使い方の例は各ファイルの先頭のコメント(`node_modules/nene-ui/src/Ui/*.nn`)。
|
|
35
|
+
ボタン・入力欄などは自分で作らず、まず `nene-lang-ui` を使う。一覧と属性は `node_modules/nene-lang-ui/README.md`、使い方の例は各ファイルの先頭のコメント(`node_modules/nene-lang-ui/src/Ui/*.nn`)。
|
|
36
36
|
|
|
37
37
|
```haskell
|
|
38
38
|
import Ui.Button (Variant(..))
|
package/template/package.json
CHANGED
package/template/src/Main.nn
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Main (main) where
|
|
2
2
|
|
|
3
|
-
-- 部品は nene-ui(公式の部品集)のもの。一覧は node_modules/nene-ui/README.md
|
|
3
|
+
-- 部品は nene-lang-ui(公式の部品集)のもの。一覧は node_modules/nene-lang-ui/README.md
|
|
4
4
|
import Ui.Button (Variant(..))
|
|
5
5
|
import qualified Ui.Icon as Icon
|
|
6
6
|
import Ui.IconButton
|
|
@@ -63,7 +63,7 @@ main = App.app { init = 0, update, view }
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
style
|
|
66
|
-
/* 色は nene-ui と同じ変数で決める。--primary を変えると、ボタンなどの色も変わる */
|
|
66
|
+
/* 色は nene-lang-ui と同じ変数で決める。--primary を変えると、ボタンなどの色も変わる */
|
|
67
67
|
:root {
|
|
68
68
|
--primary: light-dark(#7c5cff, #9d85ff);
|
|
69
69
|
--accent: #ff6fa8;
|