mcpField
A
atscript-db

atscript-db

github.com/moostjsデータ・データベース146 回インストール1 週間前に更新
リポジトリ

atscript-db について

atscript-dbは、TypeScriptプロジェクト向けのデータベース層スキルで、複数のアダプター、スキーマ同期、リレーションを扱います。データアクセスやMoost HTTPエンドポイントを構築する開発者向けです。

主な機能

  1. 01複数のデータベースアダプター
  2. 02分散ロック付きスキーマ同期
  3. 03共通のフィルター・書き込みインターフェース
  4. 04リレーション参照とネスト書き込み制御
  5. 05Moost HTTPコントローラー

活用シーン

  1. 01SQLite、PostgreSQL、MySQL、MongoDBでのデータアクセス
  2. 02アプリケーションモデルとDBスキーマの同期
  3. 03Moost HTTPエンドポイントによるテーブル公開

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/moostjs/atscript-db --skill atscript-db

インストール後、Claude Code で/atscript-dbを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
actions.md
adapters-memory.md
adapters-mongo.md
adapters-mysql.md
adapters-postgres.md
adapters-sqlite.md
annotations.md
creating-adapters.md
crud.md
db-client.md
encryption.md
geo-search.md
getting-started.md
http-query-syntax.md
mongo-annotations.md
moost-db.md
patch.md
queries.md
relations.md
schema-sync.md
tables-and-views.md
testing.md
validation.md
versioning.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(単一の親参照)はこの制限の対象外です。
4MongoDB のインデックスには 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 です。テーブルレベルのアクションでフォームがない場合、空のボディ/{} は有効です。
12disabled には 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 プリセットでは無効になっています)。
18guardWrite / 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 を参照してください。
19PK のみの 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 を参照してください。
21SQLite トランザクションはドライバーごとに直列化されます(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.mdDbSpace.getTable/getView/get、ライフサイクル、ensureTable、syncIndexes、ビューの種類(managed/materialized/external)
CRUDcrud.mdinsertOne/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.mdFNV-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.mdBetterSqlite3Driver(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.mdPgDriver、pgvector + HNSW、CITEXT、@db.pg.type、@db.pg.schema、@db.pg.collate、tsvector FTS
MySQL 固有の情報adapters-mysql.mdMysql2Driver、@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.mdMongoAdapter(db, client?)、集約パイプラインのパッチ、Atlas Search のテキスト + ベクトル検索、atscript__ インデックスプレフィックス + 物理インデックス名ヘルパー(raw-driver の $search との相互運用向けの mongoIndexKey/INDEX_PREFIX)、ObjectId プリミティブ
メモリ固有の情報adapters-memory.mdインメモリアダプター、プロバイダーが提供するランタイムサーフェス、インメモリテスト、JavaScript ネイティブのフィルターセマンティクス
カスタムアダプターcreating-adapters.mdBaseDbAdapter コントラクト、抽象メソッド、オーバーライド可能なフック、supports* フラグ、@atscript/db-sql-tools の再利用
moost-db HTTPmoost-db.mdAsDbController / 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.mdURL フィルターのエンコード(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.mdClient<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.mdcreateDbValidatorPlugin、buildDbValidator、サーバーおよびクライアントのバリデーター、HTTP 経由のエラー形式、ValidatorMode
バージョニング / OCCversioning.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.mddb.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.mdprovideTestDbSpace / resetTestDbSpaces(@atscript/moost-db/testing)、インメモリ SQLite(:memory:)、MongoDB インメモリサーバー、フィクスチャの投入、スキーマのリセット、テストハーネスからのコントローラー実行、CAS の成功/失敗のテスト
Reference docs: https://db.atscript.dev.

コメント