atscript-db について
atscript-dbは、TypeScriptプロジェクト向けのデータベース層スキルで、複数のアダプター、スキーマ同期、リレーションを扱います。データアクセスやMoost HTTPエンドポイントを構築する開発者向けです。
主な機能
- 01複数のデータベースアダプター
- 02分散ロック付きスキーマ同期
- 03共通のフィルター・書き込みインターフェース
- 04リレーション参照とネスト書き込み制御
- 05Moost HTTPコントローラー
活用シーン
- 01SQLite、PostgreSQL、MySQL、MongoDBでのデータアクセス
- 02アプリケーションモデルとDBスキーマの同期
- 03Moost HTTPエンドポイントによるテーブル公開
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ moostjs/ atscript-db --skill atscript-dbインストール後、Claude Code で/atscript-dbを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/actions.mdadapters-memory.mdadapters-mongo.mdadapters-mysql.mdadapters-postgres.mdadapters-sqlite.mdannotations.mdcreating-adapters.mdcrud.mddb-client.mdencryption.mdgeo-search.mdgetting-started.mdhttp-query-syntax.mdmongo-annotations.mdmoost-db.mdpatch.mdqueries.mdrelations.mdschema-sync.mdtables-and-views.mdtesting.mdvalidation.mdversioning.md詳細
atscript-db
Install
npx skills add moostjs/atscript-db # this skill (DB layer)
npx skills add moostjs/atscript # sibling — .as syntax, @meta.*, @expect.*, asc, unplugin
Packages
@atscript/db core: DbSpace, AtscriptDbTable, AtscriptDbView, schema sync, relations
├── @atscript/db-sql-tools shared SQL builders (WHERE, SELECT, INSERT, aggregation, filter visitor)
│ ├── @atscript/db-sqlite better-sqlite3 + FTS5 + sqlite-vec (vec0) + collation
│ ├── @atscript/db-postgres pg + pgvector + HNSW + CITEXT + FTS
│ └── @atscript/db-mysql mysql2 + VECTOR + FULLTEXT + utf8mb4
├── @atscript/db-mongo mongodb (aggregation pipelines, Atlas Search, no SQL layer)
├── @atscript/db-memory in-memory adapter (no engine); provider-backed read-only + stored read-write
├── @atscript/moost-db Moost HTTP controllers: AsDbController / AsDbReadableController
└── @atscript/db-client browser/SSR fetch client over moost-db REST
pnpm add @atscript/core @atscript/typescript @atscript/db
pnpm add @atscript/db-sqlite better-sqlite3 # pick one adapter
pnpm add @atscript/db-postgres pg
pnpm add @atscript/db-mysql mysql2
pnpm add @atscript/db-mongo mongodb
pnpm add @atscript/db-memory # in-memory (tests / runtime surfaces)
pnpm add @atscript/moost-db @moostjs/event-http moost # REST
pnpm add @atscript/db-client # browser/SSR client
Quick start
// src/todo.as
@db.table 'todos'
@db.depth.limit 0
export interface Todo {
@meta.id @db.default.increment
id: number
title: string
@db.default 'false'
completed?: boolean
@db.default.now
createdAt?: number.timestamp
}
import { DbSpace } from "@atscript/db";
import { syncSchema } from "@atscript/db/sync";
import { SqliteAdapter, BetterSqlite3Driver } from "@atscript/db-sqlite";
import { Todo } from "./todo.as";
const db = new DbSpace(() => new SqliteAdapter(new BetterSqlite3Driver("./app.db")));
await syncSchema(db, [Todo]); // idempotent, lock-coordinated
const todos = db.getTable(Todo);
await todos.insertOne({ title: "ship it" }); // { insertedId: 1 }
const open = await todos.findMany({ filter: { completed: false } });
await todos.updateOne({ id: 1, completed: true }); // PK required in payload
await todos.deleteOne(1);
Invariants
| # | ルール |
|---|---|
| 1 | アダプタ間の同等性 — アプリケーションコードでアダプタの種類によって分岐してはいけません。すべてのアダプタで同じフィルター形式、パッチ形式、制御を受け付けます。エンジンごとの機能は API の分岐ではなく、アノテーションを通じて公開します。 |
| 2 | @meta.id は複合キーを示すマーカーです。 @meta.isKey はありません。異なるプロパティに複数の @meta.id を付けると、複合 PK が形成されます。引数は受け取りません。 |
| 3 | @db.depth.limit N は、@db.rel.from / @db.rel.via チェーンに沿ったネストされた書き込み(insert / replace / patch)を制限します。 指定がない、または 0 の場合、サーバーはネストされた FROM/VIA ペイロードを HTTP 400 で拒否し、/meta は浅い FK 参照を返します。オプトインするには N ≥ 1 を設定します。@db.rel.to(単一の親参照)はこの制限の対象外です。 |
| 4 | MongoDB のインデックスには atscript__ プレフィックスを使用します。 syncIndexes() が管理するのはこのプレフィックスを持つインデックスのみです。利用側が作成したインデックスでも atscript__ で始まるものは管理対象とみなされ、差異がある場合に削除されることがあります。 |
| 5 | 利用側プロジェクトの生成済み *.as.d.ts / atscript.d.ts ファイルは asc が生成します。 手動で編集してはいけません。npx asc で再生成するか、バンドル時に unplugin-atscript に生成させてください。 |
| 6 | スキーマ同期では分散ロックを取得します。 複数 Pod のデプロイでは、syncSchema() のオプションで podId、lockTtlMs、waitTimeoutMs を設定する必要があります。制御テーブルは __atscript_control です。 |
| 7 | サードパーティの BaseDbAdapter 実装は、ツリー内の他のアダプタを絶対にインポートしてはいけません。 共通の SQL ヘルパーは @atscript/db-sql-tools にあります。各アダプタは独立しています。 |
| 8 | ナビゲーションリレーションは遅延読み込みです。 controls.$with で要求しない限り、読み込み時の @db.rel.to / .from / .via フィールドは undefined です。N+1 の遅延読み込みは行いません。 |
| 9 | @db.column には行ごとのコストがかかるため、明確な理由なしに使用しないでください。 1 か所でも使用すると、読み込み、書き込み、フィルターのたびにテーブル全体でキー変換パスが有効になります。正当な理由は次のものに限られます。(a)対象名が SQL の予約語である。(b)所有していないスキーマと統合する。(c)リポジトリ全体の規約により、DB では snake_case、TS では camelCase を使う必要がある。同様の考え方は @db.table 'physical' にも当てはまります(行ごとのコストはなく、意図は同じです)。詳細と、使用する理由にならないケースについては、annotations.md § @db.column — when to use it を参照してください。 |
| 10 | 読み取りレスポンスには常に preferredId フィールドが含まれます。 moost-db コントローラーは、行を返すすべての読み取りエンドポイント(/query、/pages、/one、/one/:id、search/vector)で、meta.preferredId を含めるように $select を暗黙的に拡張します。集計($groupBy)および件数($count)のレスポンスは拡張されません。transformProjection() のオーバーライドでも preferred-id フィールドを抑制できません。識別子はネットワーク/認可レイヤーで非表示にしてください。 |
| 11 | アクションのボディは { ids?, input? } 形式のエンベロープです。 ids には識別子を格納します。@DbActionID* / @DbActionRow* では、単一の場合は JSON オブジェクト、複数の場合はオブジェクトの配列とし、スカラー値は使用できません。フィールドの組み合わせは、正当な識別方法(PK または任意の @db.index.unique グループ)のいずれかと完全に一致する必要があります。厳密に検証され、不明なフィールドは拒否されます。input には任意の @InputForm ペイロードを格納し、ハンドラーの実行前に宣言済み/推論済みフォームに対してサーバー側で検証されます(ValidatorError → 構造化された 400。input がない場合は {} として検証されるため、必須フィールドがあれば 400 となり、ハンドラーには常にオブジェクトが渡されます)。単一フィールドの PK は { "ids": { "id": "abc" } } の形式で送信し、"abc" を直接渡してはいけません。ルートが配列またはスカラーの場合は 400 です。テーブルレベルのアクションでフォームがない場合、空のボディ/{} は有効です。 |
| 12 | disabled には requiredFields が必要です。 @DbAction / @DbActions* の述語では、読み取るすべてのフィールドをリテラルの requiredFields タプルとして宣言する必要があります。このタプルは述語の行引数の型を絞り込む(Pick<FlatOf<TRow>, R[number]>[])とともに、@DbActionRow* の注入および $actions=true の拡張におけるサーバー側のプロジェクション拡張を制御します。requiredFields はサーバー内部専用であり、/meta の通信には含まれません。requiredFields のない disabled は検出時にアクションが破棄されます。 |
| 13 | 行ごとのアクション可用性は ?$actions=true を通じてサーバーで評価されます。 /query、/pages、/one でオプトインする URL 制御です。返される各行に $actions: string[] が付きます(無効化されていない行/複数行レベルのアクション名)。$count / $groupBy では除去されます。'table' レベルのアクションは表示されません。リクエストごとの applyMetaOverlay() を通じてフィルターされます。 |
| 14 | /meta.fields は厳密で、これがゲートです(0.1.128 以降)。 すべてのアダプタ、モード、フィールド種別において、fields[P].sortable === ($sort=P accepted) かつ fields[P].filterable === (filter on P accepted) です。どちらも単一の FieldCapabilityIndex に基づきます。indexed: true は別個の参考情報(明示的な @db.index*、PK、unique)です。自動モードでは、ソート可能なすべてのアダプタ列が公開されます。アダプタの機能はアノテーションより優先されます。@db.json / 配列列はどのアダプタでもソートできず(canSortField が designType の 'json' / 'array' を拒否するため、Mongo/memory でも $sort=tags は 400 になります)、SQL ではフィルターもできません。一覧にないフィールドは常に 400 になります。ネストされたオブジェクトの親(contact — リーフを使用)、ナビゲーションパス(assignee.name — $with=assignee(...) を使用)、SQL 上の JSON 子孫(prefs.theme — 親を選択します。Mongo/memory では一覧に含まれ、受け付けられます)、不明なフィールドが該当します。手動モードのポリシーが対象とするのはフィルターと$sortのみです。$groupBy / $having / 集計フィールドには物理機能が適用されます。拒否時の形式は { statusCode: 400, message, errors: [{ path, message }] } です。物理列名(contact\_\_email)は、transformFilterオーバーレイやupdateMany / deleteManyを含め、どこでも拒否されます。詳細は moost-db.md § Gate mode を参照してください。 |
| 15 | コントローラーはモデルのトークンでバインドし、init() の前にスペースを登録してください。 @TableController(Model) は、アンビエントレジストリに対して app.init() 時に遅延解決されます。そのため、provideDbSpace(db)(および @db.space に対応する名前付きスペースの provideDbSpace(x, "name"))を先に実行する必要があります。遅延ファクトリー形式では明示的なプレフィックスが必要です。独自コンストラクターを持つサブクラスは super(moost) を呼び出し、基底クラスはクラスメタデータから解決します(コンストラクターは (app, readable?) で、readable は最後の任意引数です)。インスタンス形式(@TableController(table))も引き続き機能しますが、バインドがモジュール評価順序に依存します。→ moost-db.md § Binding forms |
| 16 | 同期の失敗はデフォルトで明示されます。 エラー項目を含む syncSchema の実行では、デフォルトの NoopLogger を使用している場合でも、概要と項目ごとのエラーが報告されます(コンソールにフォールバック)。onError: "throw" | "warn" | "silent" で動作を調整できます。手作業で管理するインポート配列ではなく、生成済みマニフェスト(dbPlugin({ manifest }) → atscriptModels)から同期データを渡してください。→ schema-sync.md |
| 17 | .as アーティファクトは値としてインポートし、import type は使用しないでください。 コンパイル済みの .as モデル/フォームは、実行時に使用されるクラスです(デコレーター引数、パラメーター型による DI、.validator()、マニフェスト配列)。型のみのインポートでは値が省略され、design:paramtypes が Object を出力するため、フォームのバインドや型による DI が気付かないうちに機能しなくなります。.as ファイルをインポートするアプリでは、typescript/consistent-type-imports のような lint ルールを無効にしてください(create-moost プリセットでは無効になっています)。 |
| 18 | guardWrite / guardRemove はテーブルの書き込みガードです(0.1.128 以降)。 onWrite / onRemove は信頼できないボディをトランザクションの外で確認します。オーバーライドしたガードは、テーブル呼び出しの guard オプションとして渡され、デフォルト値の適用と検証後、テーブル独自のトランザクション内で 1 回実行されます(その後、行は再検証されます)。404/409 の判別はテーブル呼び出し後に行われます。transactionalWrites フラグはなく、オーバーライド自体が切り替えになります。SDK の呼び出し元も insertMany(rows, { guard }) / deleteOne(id, { guard }) で同じフックを利用できます。拒否する場合は HttpError をスローしてください。DbError(PG のトランザクションが中断状態になる)を握りつぶしてはいけません。SQLite では外部 I/O を待機してはいけません。組み込みの書き込み失敗は HttpError としてスローされます。オブジェクト以外のボディは、フックの実行前に形状ゲートエラーとして 400 になります。onWrite がオブジェクト以外を返すと 500 になります。references/moost-db.md、references/crud.md を参照してください。 |
| 19 | PK のみの CAS 書き込みも実際の書き込みです(0.1.128 以降)。 updateOne({ ...pk, $cas }) / PATCH { id, version } は SET version = version + 1 WHERE pk AND version = ? を実行します。一致すれば値を更新して { 1, 1 } を報告し、古い値/見つからない場合は { 0, 0 }(HTTP 409/404)を返します。$cas がない場合、空のパッチは何も書き込まず、実際の存在件数を報告します。withOptimisticRetry のミューテーターが undefined / {} を返す場合は、明示的に書き込みを行いません。変更していないフォームを version 付きで再送信してはいけません。references/versioning.md を参照してください。バッチのフェンスには touchMany(keys, { require })(0.1.129 以降)を使用します。各キーには主キー(複合キー可。unique インデックスは不可)とバージョンが必要で、ペイロードはありません。古い値/見つからない場合は CasMismatchError(DbError コード CAS_MISMATCH、409)となり、何も更新されません。updateMany(orFilter, {}) は 0.1.128 以降、ロックとして機能しません。 |
| 20 | すべての書き込み経路で、プレーンオブジェクトのあらゆる深さにおいて、undefined ≡ 不在、null ≡ 明示的な NULL です(0.1.128 以降)。 デフォルト値の適用と検証の前に undefined プロパティは取り除かれます。デフォルト値を持つ列には DEFAULT が設定され、パッチではその列に対する SET は行われません。配列要素は決して取り除かれず、クラスインスタンスは変更されません。マージしないネストされたオブジェクトでは、undefined の任意リーフは省略と同様に扱われます(null で埋められます)。references/crud.md、references/patch.md を参照してください。 |
| 21 | SQLite トランザクションはドライバーごとに直列化されます(0.1.128 以降)。 withTransaction は FIFO ゲートと BEGIN IMMEDIATE を組み合わせたものです。他のコンテキストからの通常のステートメントは COMMIT まで待機します。SQLite のトランザクションやガード内で外部 I/O を待機してはいけません(デッドロックが発生します。デフォルトではタイムアウトなしです。transactionWaitTimeoutMs は DbError("TX_WAIT_TIMEOUT") → 503 となり、transactionWaitWarnMs は警告を出します)。スキーマ操作も同じ接続ゲートを使用し(0.1.128 以降)、リクエストのトランザクション内では実行されません。データベースごとにドライバーは 1 つにしてください。references/adapters-sqlite.md を参照してください。 |
| 22 | スキーマ同期は適用前に実行を拒否します(0.1.128 以降)。 run() は、検出 → 事前チェック → 実行の順に進みます。予測可能な理由で実行できない場合(データのあるテーブル、または有効な FK の下での主キー変更、PK から外れるオートインクリメント列、モデル/ビューがまだ参照しているテーブルの削除、どこにも存在しないテーブルへの FK、管理対象ビューと同じ名前の物理テーブル)は、status: 'refused' を返します。DDL は一切実行されず、何も永続化されず、ロックは解放されます。status === 'synced' を確認するブート処理では、これを失敗したマイグレーションとして扱う必要があります。作成は親から先に、削除は子から先に実行します(FK の循環は 1 グループとして処理します)。PG の削除で CASCADE は使用しません。セーフモードによるスキップは追跡対象のままです。references/schema-sync.md を参照してください。 |
主なインポート
// Core
import { DbSpace, AtscriptDbTable, AtscriptDbView, BaseDbAdapter, DbError } from "@atscript/db";
import { syncSchema, planSchema, SchemaSync, readStoredSnapshot } from "@atscript/db/sync";
import { dbPlugin } from "@atscript/db/plugin"; // dbPlugin({ manifest: "atscript.models.ts" }) — path is rootDir-relative
import { $inc, $dec, $mul, $replace, $insert, $upsert, $update, $remove } from "@atscript/db/ops";
// Optimistic concurrency — see references/versioning.md
import { withOptimisticRetry, CasExhaustedError } from "@atscript/db";
// Adapters (pick one)
import {
SqliteAdapter,
BetterSqlite3Driver,
createAdapter as sqliteSpace,
} from "@atscript/db-sqlite";
import { PostgresAdapter, PgDriver, createAdapter as pgSpace } from "@atscript/db-postgres";
import { MysqlAdapter, Mysql2Driver, createAdapter as mysqlSpace } from "@atscript/db-mysql";
import { MongoAdapter } from "@atscript/db-mongo";
import {
MemoryAdapter,
createAdapter as memorySpace,
setMemoryProvider,
buildMemoryPredicate,
sortRows,
projectRow, // shared JS-native engine — also backs moost-db value-help
} from "@atscript/db-memory";
// HTTP
import {
AsDbController,
AsDbReadableController,
TableController,
ReadableController,
provideDbSpace, // register the DbSpace for token-bound controllers, BEFORE app.init()
clearDbSpaces,
assertExposed, // dev check: @db.http.path models without a bound controller
} from "@atscript/moost-db";
import { provideTestDbSpace, resetTestDbSpaces } from "@atscript/moost-db/testing";
// Browser client
import { Client } from "@atscript/db-client";
参照 — 必要なものだけを読み込みます
| 分野 | ファイル | 内容 |
|---|---|---|
| 初回利用 | getting-started.md | インストール、atscript.config、最初の .as モデル、DbSpace の配線、syncSchema、最初の CRUD 呼び出し |
@db.* アノテーション | annotations.md | @db.table、@db.table.preferredId.uniqueIndex、@db.column、@db.default*、インデックス、@db.rel.*、@db.json、@db.ignore、@db.space、@meta.id、ゲートモード、@db.amount.currency[.ref]、@db.unit[.ref]、db.currencyCode プリミティブ |
| Mongo アノテーション | mongo-annotations.md | @db.mongo.*:コレクション、上限付きコレクション、search.text/static/dynamic/autocomplete(タイプアヘッド、edgeGram/nGram/rightEdgeGram)、クエリ時の fuzzy + $fuzzy 制御、インデックス strategy(compound/autocomplete/text)、$index による同一フィールドの複数インデックスバリアント、patch.strategy、array.uniqueItems、プリミティブ |
| テーブルとビュー | tables-and-views.md | DbSpace.getTable/getView/get、ライフサイクル、ensureTable、syncIndexes、ビューの種類(managed/materialized/external) |
| CRUD | crud.md | insertOne/Many、replaceOne/Many、updateOne/Many、deleteOne/Many、findOne/Many、count、bulkUpdate/Replace、DbError、undefined プロパティ ≡ 不在(0.1.128)、DbPatch / DbRow ペイロード型、書き込みガード(TWriteOptions.guard / TDeleteOptions.guard)、replaceMany = $set マージ、空パッチのカウントパス |
| クエリ | queries.md | フィルター演算子、$and / $or / $not、プロジェクション($select)、$sort、$skip / $limit / $page / $size、$count、$with、$groupBy 集計、null フィルターの型付け(NullableOptional、{ note: null } / $ne: null)、パスガード(SQL の JSON 子孫、ナビゲーションパス、物理名に対する INVALID_QUERY) |
| パッチのセマンティクス | patch.md | フィールド操作($inc/$dec/$mul)、配列操作、@db.json の処理、@db.patch.strategy のマージと置換、@db.depth.limit の深度ゲート、Mongo の CollectionPatcher |
| リレーション | relations.md | @db.rel.FK/.to/.from/.via、省略可能な FK、参照整合性アクション、controls.$with、/meta での小数の参照深度、ネストした書き込み、ビュー/参照チェーンを介した値ヘルプ(終端の ref + /meta 内で継承される db.rel.FK) |
| スキーマ同期 | schema-sync.md | FNV-1a ハッシュ、__atscript_control ストア、分散ロック(podId、lockTtlMs、waitTimeoutMs)、@db.sync.method、safe モード、onError ポリシー(デフォルトでエラーを明示)、planSchema ドライラン、生成されたモデルマニフェスト(dbPlugin({ manifest })、atscriptModels、modelsBySpace)、同期フック、status: 'error' エントリーと再試行セマンティクス(エラー時はハッシュを永続化しない)、インデックス付き/ビューから参照されている/全文検索の列の削除、複合インデックス定義のドリフト、status: 'refused' / 事前チェックでの拒否(0.1.128):「refused」、「primary key change」 / PK の移動 / @meta.id の移動 / 複合キー、「drop order」 / 「foreign key order」 / 親を先に/子を先に / 「dropped right before」 / 'drop' で再作成されたテーブルまたはキー再構築されたテーブルの削除された子、「other objects depend on it」 / FK 循環 / deferForeignKeysTo、「cannot drop … still referenced」、不明な FK ターゲット、テーブルとビューの名前の衝突、dependsOn / dropGroup / pkChange / skipped / pending、safe モードでの追跡保持と保留中の作業(「skipped (safe mode)」、スナップショットとハッシュを保留)、ビューの結合条件/having のハッシュ化と一度限りの再作成、isAtscriptDbView |
| SQLite 固有の情報 | adapters-sqlite.md | BetterSqlite3Driver(vector: true のオプトイン対応)、FTS5、@db.search.vector 用の sqlite-vec / vec0 シャドーテーブル、@db.column.collate、ネイティブ FK、インメモリの :memory:、$regex → LIKE … ESCAPE '\'(制限されたサブセットで、\d/[…]/(a|b)/量指定子では例外をスロー)、ドライバーごとのトランザクションゲート / BEGIN IMMEDIATE / transactionWaitTimeoutMs + transactionWaitWarnMs / TX_WAIT_TIMEOUT 503(0.1.128) |
| PostgreSQL 固有の情報 | adapters-postgres.md | PgDriver、pgvector + HNSW、CITEXT、@db.pg.type、@db.pg.schema、@db.pg.collate、tsvector FTS |
| MySQL 固有の情報 | adapters-mysql.md | Mysql2Driver、@db.mysql.engine/.charset/.collate/.type/.unsigned/.onUpdate、VECTOR、FULLTEXT、デフォルトの utf8mb4、列定義ルール(0.1.128):DEFAULT NULL / NOT NULL DEFAULT NULL は使用しない(ER 1067)、型のデフォルト値を自動生成 + DROP DEFAULT、NOT NULL の前に NULL をバックフィル、列ごとに MODIFY を 1 つ使用、式によるデフォルト値は 8.0.13 以降、「index prefix」 / キー長 768 / (255) / SUB_PART のドリフト、PK のソースは KEY_COLUMN_USAGE、1 文での PK 交換、専用接続での FOREIGN_KEY_CHECKS |
| MongoDB 固有の情報 | adapters-mongo.md | MongoAdapter(db, client?)、集約パイプラインのパッチ、Atlas Search のテキスト + ベクトル検索、atscript__ インデックスプレフィックス + 物理インデックス名ヘルパー(raw-driver の $search との相互運用向けの mongoIndexKey/INDEX_PREFIX)、ObjectId プリミティブ |
| メモリ固有の情報 | adapters-memory.md | インメモリアダプター、プロバイダーが提供するランタイムサーフェス、インメモリテスト、JavaScript ネイティブのフィルターセマンティクス |
| カスタムアダプター | creating-adapters.md | BaseDbAdapter コントラクト、抽象メソッド、オーバーライド可能なフック、supports* フラグ、@atscript/db-sql-tools の再利用 |
moost-db HTTP | moost-db.md | AsDbController / AsDbReadableController のルート、TableController / ReadableController のバインド形式(モデルトークン / 遅延ファクトリー / インスタンス)、provideDbSpace + @db.space による複数スペースの解決、サブクラスのフォールバックである super(moost)、assertExposed、@db.http.path の解決、値ヘルプエンドポイント、guardWrite / guardRemove(テーブルの書き込みガード)+ withTransaction、形状ゲート 400(onWrite の出力に対しても → 500)、スローされた書き込みエラー、reconcileCas の 400(0.1.128)、ソート可能なメタデータ / /meta.fields とゲートの一致(FieldCapabilityIndex、indexed ヒント、400 エンベロープ) |
| アクション | actions.md | @DbAction / @DbActionID* / @DbActionRow* / @InputForm / @DbActions* デコレーター、{ ids?, input? } ボディエンベロープ、行/複数行/テーブルのアクション、processor: 'backend' | 'navigate' | 'custom'、同期バッチの disabled ゲート(requiredFields タプルで型付け、必須)、perRow() ヘルパー、onDisabledRows、@DbActionRow* のプロジェクション範囲拡張、サーバー評価による行の利用可能性の拡張 $actions=true、/meta の inputForm + フォームスキーマエンドポイント GET /meta/form/:name(組み込みのサーバー側入力検証。パラメーター型からフォームを推論可能)、preferred-id に基づく navigate の置換、ActionDisabledError、/meta の actions[] 形式 |
| URL クエリ構文 | http-query-syntax.md | URL フィルターのエンコード(field=v、!=、>、<、{v1,v2}、~=/re/i、範囲)、$sort、$select、$with、$page、$size、$search/$index/$fuzzy(Mongo Atlas)、$vector/$threshold、アダプターごとの JSON サブフィールド/ネストしたパスのルール、$having エイリアス / $groupBy 専用キー($having key "x" must be an aggregate alias or a $groupBy field)、ネストしたグループ化キー、ゲートの拒否テーブル |
| ブラウザークライアント | db-client.md | Client<T extends AtscriptClientShape>、$with によるレスポンス絞り込みに対応した型付き CRUD メソッド(ClientResponse<T, Q>)、エンベロープ形式の契約 client.action<R>(name, id?, input?)、フォームスキーマを遅延取得する client.getActionForm(name)、フィルターの構築、認証ヘッダー、ClientError / ActionDisabledError、メタデータとバリデーターのキャッシュ、preferred-id に基づく navigate URL、version + PatchOf / RowOf 書き込み型への $cas のリフト(0.1.128)、TransportError(0.1.129:fetch が拒否された、または 2xx の本文が JSON ではない場合 — サーバーの判定なし。method/url/cause を含み、ClientError を継承しない);JSON ではないエラーボディ → body.message が空にならない(HTTP <status> にフォールバック) |
| バリデーション | validation.md | createDbValidatorPlugin、buildDbValidator、サーバーおよびクライアントのバリデーター、HTTP 経由のエラー形式、ValidatorMode |
| バージョニング / OCC | versioning.md | @db.column.version アノテーション、$cas 演算子、必須の自動バンプ、withOptimisticRetry ヘルパー、CasExhaustedError、updateMany の除外、直接書き込みの拒否(DbError("VERSION_COLUMN_WRITE"))、HTTP での自動リフト + 409 kind: "version_mismatch" ボディ(@atscript/db-client の型付き VersionMismatchError)+ 404 の区別、/meta の versionColumn、一括処理の集約レスポンス、制限事項(項目ごとの競合ステータスなし、名前変更されたバージョン列なし)、PK のみの $cas によるバージョン付きタッチ/空パッチのセマンティクス、version+$cas の競合 400、db-client の $cas リフト(0.1.128)、一括バージョン付きタッチ touchMany(keys, { require: "all" | "any" }) + CasMismatchError(CAS_MISMATCH)→ 409(0.1.129) |
| フィールド暗号化 | encryption.md | @db.encrypted、DbSpace の encryption オプション(defaultKeyId、keys、KMS/Vault 用の resolveKey、onUnencrypted)、エンベロープ形式、鍵のローテーション、平文列の移行、ENC_CONFIG_MISSING / ENC_KEY_INVALID / ENC_FIELD_FILTER / ENC_FIELD_SORT / ENC_FIELD_AGG / ENC_FIELD_PATCH_OP / ENC_NOT_ENCRYPTED / ENC_DECRYPT_FAILED、CSFLE の境界 |
| 地理空間検索 | geo-search.md | db.geoPoint([lng, lat] — 経度が先)、@db.index.geo、table.geoSearch() / geoSearchWithCount() / isGeoSearchable()、$maxDistance / $minDistance(メートル)、$distance 行フィールド、$geoWithin 円フィルター、GET /geo + $center、client.geoSearch/geoPages、すべてのアダプターでネイティブ対応(Mongo 2dsphere / PG PostGIS GiST / MySQL POINT SRID 4326 / SQLite haversine)、GEO_NOT_SUPPORTED(PostGIS なしの PG)/ GEO_INDEX_MISSING / FILTER_TYPE_MISMATCH、atscript__geo__* 管理インデックス |
| アプリ側テスト | testing.md | provideTestDbSpace / resetTestDbSpaces(@atscript/moost-db/testing)、インメモリ SQLite(:memory:)、MongoDB インメモリサーバー、フィクスチャの投入、スキーマのリセット、テストハーネスからのコントローラー実行、CAS の成功/失敗のテスト |
| Reference docs: https://db.atscript.dev. |
コメント
Markdown 対応