@toiroakr/lines-db 0.1.0 → 0.2.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # @toiroakr/lines-db
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b8e0afe: feat!: remove bun/deno
8
+
9
+ ### Patch Changes
10
+
11
+ - 49089e1: fix: skip validation with warning instead of error when schema file is not found
12
+
13
+ When validating a directory containing JSONL files, if a schema file is missing for some tables, the validator will now:
14
+ - Skip validation for those files with a warning message instead of throwing an error
15
+ - Display warnings in yellow in the CLI output
16
+ - Continue validation for other files that have schema files
17
+
18
+ This allows for more flexible validation workflows where not all tables require validation schemas.
19
+
20
+ ## 0.1.2
21
+
22
+ ### Patch Changes
23
+
24
+ - 00c623a: chore: update README
25
+
26
+ ## 0.1.1
27
+
28
+ ### Patch Changes
29
+
30
+ - fce2b5a: chore: update README
package/README.ja.md ADDED
@@ -0,0 +1,359 @@
1
+ # lines-db
2
+
3
+ JSONLファイルをテーブルとして扱うデータ管理ライブラリです。アプリケーションのシードデータ管理やテストに最適です。
4
+
5
+ ## 機能
6
+
7
+ - 📝 JSONLファイルをデータベーステーブルとして読み込み
8
+ - ✅ **バリデーションとデータマイグレーションのためのCLIツール**
9
+ - 🔄 自動スキーマ推論
10
+ - 📦 **JSON型カラムサポート** - 自動シリアライズ/デシリアライズ
11
+ - ✅ StandardSchemaによる組み込みバリデーション(Valibot、Zodなど対応)
12
+ - 🎯 **テーブル名からの自動型推論**
13
+ - 🔄 **双方向スキーマ変換**
14
+ - 💾 **JSONLファイルへの自動同期**
15
+ - 🛡️ TypeScriptによる型安全性
16
+ - Node.js 22.5+サポート
17
+
18
+ ## VS Code拡張機能
19
+
20
+ JSONLファイルのシンタックスハイライトとバリデーションをサポートするVS Code拡張機能が利用可能です。
21
+
22
+ [![VS Code Marketplace](https://img.shields.io/visual-studio-marketplace/v/toiroakr.lines-db-vscode?label=VS%20Code%20Marketplace&logo=visual-studio-code)](https://marketplace.visualstudio.com/items?itemName=toiroakr.lines-db-vscode)
23
+
24
+ [VS Code Marketplaceからインストール](https://marketplace.visualstudio.com/items?itemName=toiroakr.lines-db-vscode)
25
+
26
+ ## インストール
27
+
28
+ ```bash
29
+ npm install @toiroakr/lines-db
30
+ # または
31
+ pnpm add @toiroakr/lines-db
32
+ ```
33
+
34
+ ## CLI の使い方
35
+
36
+ ### スキーマの設定
37
+
38
+ JSONLファイルと同じ場所にスキーマファイルを作成します:
39
+
40
+ **ディレクトリ構造:**
41
+
42
+ ```
43
+ data/
44
+ ├── users.jsonl
45
+ ├── users.schema.ts
46
+ ├── products.jsonl
47
+ └── products.schema.ts
48
+ ```
49
+
50
+ **スキーマの例(users.schema.ts):**
51
+
52
+ ```typescript
53
+ import * as v from 'valibot';
54
+ import { defineSchema } from '@toiroakr/lines-db';
55
+
56
+ export const schema = defineSchema(
57
+ v.object({
58
+ id: v.pipe(v.number(), v.integer(), v.minValue(1)),
59
+ name: v.pipe(v.string(), v.minLength(1)),
60
+ age: v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(150)),
61
+ email: v.pipe(v.string(), v.email()),
62
+ }),
63
+ );
64
+ export default schema;
65
+ ```
66
+
67
+ **サポートされているバリデーションライブラリ:**
68
+
69
+ - [StandardSchema](https://standardschema.dev/)を実装する任意のライブラリ
70
+
71
+ ### JSONL ファイルのバリデーション
72
+
73
+ JSONLファイルをスキーマに対してバリデーションします:
74
+
75
+ ```bash
76
+ npx lines-db validate <path>
77
+ ```
78
+
79
+ **例:**
80
+
81
+ ```bash
82
+ # ./dataディレクトリ内の全JSONLファイルをバリデーション
83
+ npx lines-db validate ./data
84
+
85
+ # 特定のファイルをバリデーション
86
+ npx lines-db validate ./data/users.jsonl
87
+
88
+ # 詳細出力
89
+ npx lines-db validate ./data --verbose
90
+ ```
91
+
92
+ このコマンドは以下を実行します:
93
+
94
+ - ディレクトリの場合:ディレクトリ内の全ての `.jsonl` ファイルを検索
95
+ - ファイルの場合:指定された `.jsonl` ファイルをバリデーション
96
+ - 対応する `.schema.ts` ファイルを読み込み
97
+ - 各レコードをスキーマに対してバリデーション
98
+ - 詳細なメッセージとともにバリデーションエラーを報告
99
+
100
+ ### データのマイグレーション
101
+
102
+ バリデーション付きでJSONLファイルのデータを変換します:
103
+
104
+ ```bash
105
+ npx lines-db migrate <file> <transform> [options]
106
+ ```
107
+
108
+ **例:**
109
+
110
+ ```bash
111
+ # 全ての年齢に1を加算
112
+ npx lines-db migrate ./data/users.jsonl "(row) => ({ ...row, age: row.age + 1 })"
113
+
114
+ # フィルター付きでマイグレーション
115
+ npx lines-db migrate ./data/users.jsonl "(row) => ({ ...row, active: true })" --filter "{ age: (age) => age > 18 }"
116
+
117
+ # エラー時に変換後のデータを保存
118
+ npx lines-db migrate ./data/users.jsonl "(row) => ({ ...row, age: row.age + 1 })" --errorOutput ./migrated.jsonl
119
+ ```
120
+
121
+ **オプション:**
122
+
123
+ - `--filter, -f <expr>` - 行を選択するフィルター式
124
+ - `--errorOutput, -e <path>` - マイグレーション失敗時に変換後のデータを保存するファイルパス
125
+ - `--verbose, -v` - 詳細なエラーメッセージを表示
126
+
127
+ マイグレーションはトランザクション内で実行され、コミット前に全ての変換後の行がバリデーションされます。
128
+
129
+ ## TypeScript での使い方
130
+
131
+ ### 型の生成
132
+
133
+ スキーマから型安全なデータベースアクセスのためのTypeScript型を生成します:
134
+
135
+ ```bash
136
+ npx lines-db generate <dataDir>
137
+ ```
138
+
139
+ **例:**
140
+
141
+ ```bash
142
+ # 型を生成(デフォルトで ./data/db.ts を作成)
143
+ npx lines-db generate ./data
144
+ ```
145
+
146
+ **package.jsonに追加:**
147
+
148
+ ```json
149
+ "scripts": {
150
+ "db:validate": "lines-db validate ./data",
151
+ "db:generate": "lines-db generate ./data"
152
+ }
153
+ ```
154
+
155
+ ### クイックスタート
156
+
157
+ **1. JSONLファイルを作成(./data/users.jsonl):**
158
+
159
+ ```jsonl
160
+ {"id":1,"name":"Alice","age":30,"email":"alice@example.com"}
161
+ {"id":2,"name":"Bob","age":25,"email":"bob@example.com"}
162
+ {"id":3,"name":"Charlie","age":35,"email":"charlie@example.com"}
163
+ ```
164
+
165
+ **2. TypeScriptで使用:**
166
+
167
+ ```typescript
168
+ import { LinesDB } from '@toiroakr/lines-db';
169
+
170
+ const db = LinesDB.create({ dataDir: './data' });
171
+ await db.initialize();
172
+
173
+ // 全てのユーザーを検索
174
+ const users = db.find('users');
175
+ console.log(users); // [{ id: 1, name: "Alice", ... }, ...]
176
+
177
+ // 特定のユーザーを検索
178
+ const user = db.findOne('users', { id: 1 });
179
+ console.log(user); // { id: 1, name: "Alice", age: 30, ... }
180
+
181
+ // 条件付きで検索
182
+ const adults = db.find('users', { age: (age) => age >= 30 });
183
+
184
+ await db.close();
185
+ ```
186
+
187
+ ### 生成された型の使用
188
+
189
+ `npx lines-db generate ./data` を実行後:
190
+
191
+ ```typescript
192
+ import { LinesDB } from '@toiroakr/lines-db';
193
+ import { config } from './data/db.js';
194
+
195
+ const db = LinesDB.create(config);
196
+ await db.initialize();
197
+
198
+ // ✨ 型は自動的に推論されます!
199
+ const users = db.find('users');
200
+
201
+ // ✨ 型安全な操作
202
+ db.insert('users', {
203
+ id: 10,
204
+ name: 'Alice',
205
+ age: 30,
206
+ email: 'alice@example.com',
207
+ });
208
+
209
+ await db.close();
210
+ ```
211
+
212
+ ### コア API
213
+
214
+ **クエリ操作:**
215
+
216
+ - `find(table, where?)` - 一致する全てのレコードを検索
217
+ - `findOne(table, where?)` - 単一のレコードを検索
218
+ - `query(sql, params?)` - 生のSQLクエリを実行
219
+
220
+ **変更操作:**
221
+
222
+ - `insert(table, data)` - 単一のレコードを挿入
223
+ - `update(table, data, where)` - 一致するレコードを更新
224
+ - `delete(table, where)` - 一致するレコードを削除
225
+
226
+ **バッチ操作:**
227
+
228
+ - `batchInsert(table, data[])` - 複数のレコードを挿入
229
+ - `batchUpdate(table, updates[])` - 複数のレコードを更新
230
+ - `batchDelete(table, where)` - 複数のレコードを削除
231
+
232
+ **トランザクションとスキーマ:**
233
+
234
+ - `transaction(fn)` - トランザクション内で操作を実行
235
+ - `getSchema(table)` - テーブルスキーマを取得
236
+ - `getTableNames()` - 全てのテーブル名を取得
237
+
238
+ **WHERE条件:**
239
+
240
+ ```typescript
241
+ // シンプルな等価条件
242
+ db.find('users', { age: 30 });
243
+
244
+ // 複数条件(AND)
245
+ db.find('users', { age: 30, name: 'Alice' });
246
+
247
+ // 高度な条件
248
+ db.find('users', {
249
+ age: (age) => age > 25,
250
+ name: (name) => name.startsWith('A'),
251
+ });
252
+ ```
253
+
254
+ ### JSON型カラム
255
+
256
+ オブジェクトと配列は自動的にJSON型カラムとして処理されます:
257
+
258
+ ```typescript
259
+ db.insert('orders', {
260
+ id: 1,
261
+ items: [{ name: 'Laptop', quantity: 1 }],
262
+ metadata: { source: 'web' },
263
+ });
264
+
265
+ const order = db.findOne('orders', { id: 1 });
266
+ console.log(order.items[0].name); // "Laptop"
267
+ ```
268
+
269
+ ### スキーマ変換
270
+
271
+ スキーマがデータ型を変換する場合(例:日付文字列をDateオブジェクトに変換)、データをJSONLファイルに保存し直すためのバックワード変換を提供する必要があります。
272
+
273
+ **なぜ必要?** JSONLファイルは`"2024-01-01"`のような文字列を保存しますが、アプリケーションは`Date`オブジェクトで動作します。双方向の変換が必要です。
274
+
275
+ **例:**
276
+
277
+ ```typescript
278
+ import * as v from 'valibot';
279
+ import { defineSchema } from '@toiroakr/lines-db';
280
+
281
+ const eventSchema = v.pipe(
282
+ v.object({
283
+ id: v.number(),
284
+ // 変換:string → Date(読み込み時)
285
+ date: v.pipe(
286
+ v.string(),
287
+ v.isoDate(),
288
+ v.transform((str) => new Date(str)),
289
+ ),
290
+ }),
291
+ );
292
+
293
+ // バックワード変換を提供:Date → string(書き込み時)
294
+ export const schema = defineSchema(eventSchema, (output) => ({
295
+ ...output,
296
+ date: output.date.toISOString(), // DateをStringに変換
297
+ }));
298
+ ```
299
+
300
+ **JSONLファイル内(events.jsonl):**
301
+
302
+ ```jsonl
303
+ {
304
+ "id": 1,
305
+ "date": "2024-01-01T00:00:00.000Z"
306
+ }
307
+ ```
308
+
309
+ **TypeScriptコード内:**
310
+
311
+ ```typescript
312
+ const event = db.findOne('events', { id: 1 });
313
+ console.log(event.date instanceof Date); // true
314
+ console.log(event.date.getFullYear()); // 2024
315
+ ```
316
+
317
+ ### トランザクション
318
+
319
+ トランザクション外の操作は自動的に同期されます:
320
+
321
+ ```typescript
322
+ db.insert('users', { id: 10, name: 'Alice', age: 30 });
323
+ // ↑ 自動的に users.jsonl に同期
324
+ ```
325
+
326
+ トランザクションでのバッチ操作:
327
+
328
+ ```typescript
329
+ await db.transaction(async (tx) => {
330
+ tx.insert('users', { id: 10, name: 'Alice', age: 30 });
331
+ tx.update('users', { age: 31 }, { id: 1 });
332
+ // コミット時に全ての変更がアトミックに同期
333
+ });
334
+ ```
335
+
336
+ ## 設定
337
+
338
+ ```typescript
339
+ interface DatabaseConfig {
340
+ dataDir: string; // JSONLファイルが含まれるディレクトリ
341
+ }
342
+
343
+ const db = LinesDB.create({ dataDir: './data' });
344
+ ```
345
+
346
+ ## 型マッピング
347
+
348
+ | JSON型 | カラム型 | SQLiteストレージ |
349
+ | -------------------- | -------- | ---------------- |
350
+ | number(整数) | INTEGER | INTEGER |
351
+ | number(浮動小数点) | REAL | REAL |
352
+ | string | TEXT | TEXT |
353
+ | boolean | INTEGER | INTEGER |
354
+ | object | JSON | TEXT |
355
+ | array | JSON | TEXT |
356
+
357
+ ## ライセンス
358
+
359
+ MIT