@b4moss/crudian 0.3.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/LICENSE +21 -0
- package/README.md +81 -0
- package/dist/bun-sqlite/crud.d.ts +9 -0
- package/dist/bun-sqlite/crud.d.ts.map +1 -0
- package/dist/bun-sqlite/crud.js +32 -0
- package/dist/bun-sqlite/index.d.ts +9 -0
- package/dist/bun-sqlite/index.d.ts.map +1 -0
- package/dist/bun-sqlite/index.js +8 -0
- package/dist/bun-sqlite/node-stub.d.ts +2 -0
- package/dist/bun-sqlite/node-stub.d.ts.map +1 -0
- package/dist/bun-sqlite/node-stub.js +2 -0
- package/dist/bun-sqlite/sql.d.ts +2 -0
- package/dist/bun-sqlite/sql.d.ts.map +1 -0
- package/dist/bun-sqlite/sql.js +1 -0
- package/dist/drizzle/crud.d.ts +14 -0
- package/dist/drizzle/crud.d.ts.map +1 -0
- package/dist/drizzle/crud.js +33 -0
- package/dist/drizzle/index.d.ts +8 -0
- package/dist/drizzle/index.d.ts.map +1 -0
- package/dist/drizzle/index.js +6 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/prisma/crud.d.ts +14 -0
- package/dist/prisma/crud.d.ts.map +1 -0
- package/dist/prisma/crud.js +53 -0
- package/dist/prisma/index.d.ts +8 -0
- package/dist/prisma/index.d.ts.map +1 -0
- package/dist/prisma/index.js +6 -0
- package/dist/sqlite/async-crud.d.ts +27 -0
- package/dist/sqlite/async-crud.d.ts.map +1 -0
- package/dist/sqlite/async-crud.js +237 -0
- package/dist/sqlite/sql.d.ts +8 -0
- package/dist/sqlite/sql.d.ts.map +1 -0
- package/dist/sqlite/sql.js +72 -0
- package/dist/sqlite/sync-crud.d.ts +27 -0
- package/dist/sqlite/sync-crud.d.ts.map +1 -0
- package/dist/sqlite/sync-crud.js +237 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/where.d.ts +36 -0
- package/dist/where.d.ts.map +1 -0
- package/dist/where.js +75 -0
- package/package.json +91 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bicycle for Mind LLC., Kohki SHIKATA
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# @b4moss/crudian
|
|
2
|
+
|
|
3
|
+
CRUD abstraction for DDD repositories.
|
|
4
|
+
|
|
5
|
+
Single npm package with adapter subpaths. Shared contracts live at the package root; concrete backends are imported from subpaths.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @b4moss/crudian
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Adapter peers (install only what you use):
|
|
14
|
+
|
|
15
|
+
| Subpath | Peer dependencies |
|
|
16
|
+
|---------|-------------------|
|
|
17
|
+
| `@b4moss/crudian/bun-sqlite` | Bun (`bun:sqlite`) |
|
|
18
|
+
| `@b4moss/crudian/drizzle` | `drizzle-orm`, `better-sqlite3` |
|
|
19
|
+
| `@b4moss/crudian/prisma` | `@prisma/client` |
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
### Shared contracts
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { where, CrudianError } from "@b4moss/crudian"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Bun (`bun:sqlite`)
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { Database } from "bun:sqlite"
|
|
33
|
+
import { createCrud } from "@b4moss/crudian/bun-sqlite"
|
|
34
|
+
import { where } from "@b4moss/crudian"
|
|
35
|
+
|
|
36
|
+
const db = new Database(":memory:")
|
|
37
|
+
const crud = createCrud(db)
|
|
38
|
+
|
|
39
|
+
const row = crud.create("items", { name: "alpha", score: 1 })
|
|
40
|
+
const found = crud.read("items", { where: where().eq("id", row.id) })
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Node.js must not import `@b4moss/crudian/bun-sqlite` (resolves to an explicit error stub).
|
|
44
|
+
|
|
45
|
+
### Drizzle (better-sqlite3)
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import Database from "better-sqlite3"
|
|
49
|
+
import { drizzle } from "drizzle-orm/better-sqlite3"
|
|
50
|
+
import { createCrud } from "@b4moss/crudian/drizzle"
|
|
51
|
+
|
|
52
|
+
const sqlite = new Database(":memory:")
|
|
53
|
+
const db = drizzle(sqlite)
|
|
54
|
+
const crud = createCrud(db)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Prisma (SQLite)
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { PrismaClient } from "@prisma/client"
|
|
61
|
+
import { createCrud } from "@b4moss/crudian/prisma"
|
|
62
|
+
|
|
63
|
+
const client = new PrismaClient()
|
|
64
|
+
const crud = createCrud(client)
|
|
65
|
+
|
|
66
|
+
await crud.create("items", { name: "alpha", score: 1 })
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Prisma methods are async. Raw SQL goes through the injected client.
|
|
70
|
+
|
|
71
|
+
## API surface
|
|
72
|
+
|
|
73
|
+
`create` / `read` / `update` / `delete` / `search` / `list` / `upsert` / `duplicate` / `bulkCreate` / `bulkUpdate` / `bulkDelete` / `bulkUpsert` / `transaction`
|
|
74
|
+
|
|
75
|
+
- `search` is canonical; `list` is an alias
|
|
76
|
+
- Cursor pagination uses `id` ascending; response is `{ items, nextCursor, hasMore }`
|
|
77
|
+
- Conditions use the `where()` builder (`eq` / `ne` / `lt` / `gt` / `lte` / `gte` / `in` / `like` / `isNull` / `isNotNull`, nestable `and` / `or`)
|
|
78
|
+
|
|
79
|
+
## License
|
|
80
|
+
|
|
81
|
+
MIT © Bicycle for Mind LLC., Kohki SHIKATA
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
import { type SyncSqliteCrud } from "../sqlite/sync-crud.js";
|
|
3
|
+
export type BunSqliteCrud = SyncSqliteCrud<Database>;
|
|
4
|
+
/**
|
|
5
|
+
* Create a Crud bound to a Bun SQLite Database.
|
|
6
|
+
* The same Database instance is reused for every operation.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createCrud(db: Database): BunSqliteCrud;
|
|
9
|
+
//# sourceMappingURL=crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/bun-sqlite/crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAA;AAE5D,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAA;AAM/B,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;AAEpD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,CAyBtD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CrudianError } from "../index.js";
|
|
2
|
+
import { createSyncSqliteCrud, } from "../sqlite/sync-crud.js";
|
|
3
|
+
function bindings(args) {
|
|
4
|
+
return args;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Create a Crud bound to a Bun SQLite Database.
|
|
8
|
+
* The same Database instance is reused for every operation.
|
|
9
|
+
*/
|
|
10
|
+
export function createCrud(db) {
|
|
11
|
+
if (db == null) {
|
|
12
|
+
throw new CrudianError("db is required");
|
|
13
|
+
}
|
|
14
|
+
if (typeof db !== "object" || typeof db.query !== "function") {
|
|
15
|
+
throw new CrudianError("db must be a bun:sqlite Database");
|
|
16
|
+
}
|
|
17
|
+
return createSyncSqliteCrud(db, {
|
|
18
|
+
run(sql, args = []) {
|
|
19
|
+
const result = db.query(sql).run(...bindings(args));
|
|
20
|
+
return { changes: Number(result.changes ?? 0) };
|
|
21
|
+
},
|
|
22
|
+
get(sql, args = []) {
|
|
23
|
+
return db.query(sql).get(...bindings(args));
|
|
24
|
+
},
|
|
25
|
+
all(sql, args = []) {
|
|
26
|
+
return db.query(sql).all(...bindings(args));
|
|
27
|
+
},
|
|
28
|
+
transaction(fn) {
|
|
29
|
+
return db.transaction(fn)();
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun `bun:sqlite` adapter for @b4moss/crudian.
|
|
3
|
+
* Import via: `import { createCrud } from "@b4moss/crudian/bun-sqlite"`
|
|
4
|
+
*
|
|
5
|
+
* Node.js resolves `package.json` exports to `node-stub` instead of this file.
|
|
6
|
+
*/
|
|
7
|
+
export { createCrud, type BunSqliteCrud } from "./crud.js";
|
|
8
|
+
export { CrudianError, where, WhereBuilder, type Row, type SearchResult, type SearchQuery, type ReadQuery, } from "../index.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bun-sqlite/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EACL,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun `bun:sqlite` adapter for @b4moss/crudian.
|
|
3
|
+
* Import via: `import { createCrud } from "@b4moss/crudian/bun-sqlite"`
|
|
4
|
+
*
|
|
5
|
+
* Node.js resolves `package.json` exports to `node-stub` instead of this file.
|
|
6
|
+
*/
|
|
7
|
+
export { createCrud } from "./crud.js";
|
|
8
|
+
export { CrudianError, where, WhereBuilder, } from "../index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-stub.d.ts","sourceRoot":"","sources":["../../src/bun-sqlite/node-stub.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/bun-sqlite/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { compileWhere, quoteIdent, resolveWhere, } from "../sqlite/sql.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
|
|
2
|
+
import type BetterSqlite3 from "better-sqlite3";
|
|
3
|
+
import { type SyncSqliteCrud } from "../sqlite/sync-crud.js";
|
|
4
|
+
type DrizzleSqliteDb = BetterSQLite3Database<Record<string, unknown>> & {
|
|
5
|
+
$client: BetterSqlite3.Database;
|
|
6
|
+
};
|
|
7
|
+
export type DrizzleCrud = SyncSqliteCrud<DrizzleSqliteDb>;
|
|
8
|
+
/**
|
|
9
|
+
* Create a Crud bound to a Drizzle better-sqlite3 database.
|
|
10
|
+
* Raw SQL goes through the underlying better-sqlite3 client (`db.$client`).
|
|
11
|
+
*/
|
|
12
|
+
export declare function createCrud(db: DrizzleSqliteDb): DrizzleCrud;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/drizzle/crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAA;AAE/B,KAAK,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;IACtE,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;AAEzD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,eAAe,GAAG,WAAW,CA2B3D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CrudianError } from "../index.js";
|
|
2
|
+
import { createSyncSqliteCrud, } from "../sqlite/sync-crud.js";
|
|
3
|
+
/**
|
|
4
|
+
* Create a Crud bound to a Drizzle better-sqlite3 database.
|
|
5
|
+
* Raw SQL goes through the underlying better-sqlite3 client (`db.$client`).
|
|
6
|
+
*/
|
|
7
|
+
export function createCrud(db) {
|
|
8
|
+
if (db == null) {
|
|
9
|
+
throw new CrudianError("db is required");
|
|
10
|
+
}
|
|
11
|
+
if (typeof db !== "object" || typeof db.$client !== "object") {
|
|
12
|
+
throw new CrudianError("db must be a drizzle better-sqlite3 database");
|
|
13
|
+
}
|
|
14
|
+
const client = db.$client;
|
|
15
|
+
if (client == null || typeof client.prepare !== "function") {
|
|
16
|
+
throw new CrudianError("db.$client must be a better-sqlite3 Database");
|
|
17
|
+
}
|
|
18
|
+
return createSyncSqliteCrud(db, {
|
|
19
|
+
run(sql, args = []) {
|
|
20
|
+
const result = client.prepare(sql).run(...args);
|
|
21
|
+
return { changes: Number(result.changes ?? 0) };
|
|
22
|
+
},
|
|
23
|
+
get(sql, args = []) {
|
|
24
|
+
return client.prepare(sql).get(...args);
|
|
25
|
+
},
|
|
26
|
+
all(sql, args = []) {
|
|
27
|
+
return client.prepare(sql).all(...args);
|
|
28
|
+
},
|
|
29
|
+
transaction(fn) {
|
|
30
|
+
return client.transaction(fn)();
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drizzle adapter for @b4moss/crudian.
|
|
3
|
+
* Import via: `import { createCrud } from "@b4moss/crudian/drizzle"`
|
|
4
|
+
*/
|
|
5
|
+
export { createCrud, type DrizzleCrud } from "./crud.js";
|
|
6
|
+
export type { Row, SearchResult, WhereInput, ReadQuery, SearchQuery, DeleteQuery, UpdateQuery, DuplicateQuery, } from "../types.js";
|
|
7
|
+
export { CrudianError, where, WhereBuilder, type Op, type CondNode, type GroupNode, type WhereNode, } from "../index.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/drizzle/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AACxD,YAAY,EACV,GAAG,EACH,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,KAAK,EAAE,EACP,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,SAAS,GACf,MAAM,aAAa,CAAA"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Minimal library error for invalid arguments. SQLite errors propagate as-is. */
|
|
2
|
+
export declare class CrudianError extends Error {
|
|
3
|
+
readonly code: "INVALID";
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function assertString(value: unknown, label: string): asserts value is string;
|
|
7
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAS;gBAEtB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAInF"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Minimal library error for invalid arguments. SQLite errors propagate as-is. */
|
|
2
|
+
export class CrudianError extends Error {
|
|
3
|
+
code = "INVALID";
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "CrudianError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function assertString(value, label) {
|
|
10
|
+
if (typeof value !== "string") {
|
|
11
|
+
throw new CrudianError(`${label} must be a string`);
|
|
12
|
+
}
|
|
13
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contracts and types for @b4moss/crudian.
|
|
3
|
+
* Adapter implementations live under subpath exports:
|
|
4
|
+
* - @b4moss/crudian/bun-sqlite
|
|
5
|
+
* - @b4moss/crudian/drizzle
|
|
6
|
+
* - @b4moss/crudian/prisma
|
|
7
|
+
*/
|
|
8
|
+
export { CrudianError, assertString } from "./errors.js";
|
|
9
|
+
export { WhereBuilder, where, isWhereBuilder, type Op, type CondNode, type GroupNode, type WhereNode, } from "./where.js";
|
|
10
|
+
export type { Row, SearchResult, WhereInput, ReadQuery, SearchQuery, DeleteQuery, UpdateQuery, DuplicateQuery, } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EACL,YAAY,EACZ,KAAK,EACL,cAAc,EACd,KAAK,EAAE,EACP,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,SAAS,GACf,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,GAAG,EACH,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contracts and types for @b4moss/crudian.
|
|
3
|
+
* Adapter implementations live under subpath exports:
|
|
4
|
+
* - @b4moss/crudian/bun-sqlite
|
|
5
|
+
* - @b4moss/crudian/drizzle
|
|
6
|
+
* - @b4moss/crudian/prisma
|
|
7
|
+
*/
|
|
8
|
+
export { CrudianError, assertString } from "./errors.js";
|
|
9
|
+
export { WhereBuilder, where, isWhereBuilder, } from "./where.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type AsyncSqliteCrud } from "../sqlite/async-crud.js";
|
|
2
|
+
/** Minimal surface of PrismaClient used by the adapter (raw SQL + TX). */
|
|
3
|
+
export type PrismaLikeClient = {
|
|
4
|
+
$executeRawUnsafe(query: string, ...values: unknown[]): Promise<number>;
|
|
5
|
+
$queryRawUnsafe<T = unknown>(query: string, ...values: unknown[]): Promise<T>;
|
|
6
|
+
$transaction<T>(fn: (tx: PrismaLikeClient) => Promise<T>): Promise<T>;
|
|
7
|
+
};
|
|
8
|
+
export type PrismaCrud = AsyncSqliteCrud<PrismaLikeClient>;
|
|
9
|
+
/**
|
|
10
|
+
* Create a Crud bound to a PrismaClient (SQLite).
|
|
11
|
+
* Methods are async. The injected client is exposed as `crud.db`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createCrud(client: PrismaLikeClient): PrismaCrud;
|
|
14
|
+
//# sourceMappingURL=crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/prisma/crud.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAA;AAGhC,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvE,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7E,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACtE,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAA;AAU1D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAyC/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CrudianError } from "../index.js";
|
|
2
|
+
import { createAsyncSqliteCrud, } from "../sqlite/async-crud.js";
|
|
3
|
+
function normalizeRow(row) {
|
|
4
|
+
const out = { ...row };
|
|
5
|
+
for (const [k, v] of Object.entries(out)) {
|
|
6
|
+
if (typeof v === "bigint")
|
|
7
|
+
out[k] = Number(v);
|
|
8
|
+
}
|
|
9
|
+
return out;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a Crud bound to a PrismaClient (SQLite).
|
|
13
|
+
* Methods are async. The injected client is exposed as `crud.db`.
|
|
14
|
+
*/
|
|
15
|
+
export function createCrud(client) {
|
|
16
|
+
if (client == null) {
|
|
17
|
+
throw new CrudianError("db is required");
|
|
18
|
+
}
|
|
19
|
+
if (typeof client !== "object" ||
|
|
20
|
+
typeof client.$executeRawUnsafe !== "function" ||
|
|
21
|
+
typeof client.$queryRawUnsafe !== "function" ||
|
|
22
|
+
typeof client.$transaction !== "function") {
|
|
23
|
+
throw new CrudianError("db must be a PrismaClient");
|
|
24
|
+
}
|
|
25
|
+
let active = client;
|
|
26
|
+
return createAsyncSqliteCrud(client, {
|
|
27
|
+
async run(sql, args = []) {
|
|
28
|
+
const changes = await active.$executeRawUnsafe(sql, ...args);
|
|
29
|
+
return { changes: Number(changes ?? 0) };
|
|
30
|
+
},
|
|
31
|
+
async get(sql, args = []) {
|
|
32
|
+
const rows = (await active.$queryRawUnsafe(sql, ...args)) ?? [];
|
|
33
|
+
const row = rows[0];
|
|
34
|
+
return row == null ? undefined : normalizeRow(row);
|
|
35
|
+
},
|
|
36
|
+
async all(sql, args = []) {
|
|
37
|
+
const rows = (await active.$queryRawUnsafe(sql, ...args)) ?? [];
|
|
38
|
+
return rows.map(normalizeRow);
|
|
39
|
+
},
|
|
40
|
+
async transaction(fn) {
|
|
41
|
+
return client.$transaction(async (tx) => {
|
|
42
|
+
const prev = active;
|
|
43
|
+
active = tx;
|
|
44
|
+
try {
|
|
45
|
+
return await fn();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
active = prev;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma adapter for @b4moss/crudian.
|
|
3
|
+
* Import via: `import { createCrud } from "@b4moss/crudian/prisma"`
|
|
4
|
+
*/
|
|
5
|
+
export { createCrud, type PrismaCrud, type PrismaLikeClient } from "./crud.js";
|
|
6
|
+
export type { Row, SearchResult, WhereInput, ReadQuery, SearchQuery, DeleteQuery, UpdateQuery, DuplicateQuery, } from "../types.js";
|
|
7
|
+
export { CrudianError, where, WhereBuilder, type Op, type CondNode, type GroupNode, type WhereNode, } from "../index.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC9E,YAAY,EACV,GAAG,EACH,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,KAAK,EAAE,EACP,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,SAAS,GACf,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type DeleteQuery, type DuplicateQuery, type ReadQuery, type Row, type SearchQuery, type SearchResult, type UpdateQuery } from "../index.js";
|
|
2
|
+
export type AsyncSqliteExecutor = {
|
|
3
|
+
run(sql: string, args?: unknown[]): Promise<{
|
|
4
|
+
changes: number;
|
|
5
|
+
}>;
|
|
6
|
+
get(sql: string, args?: unknown[]): Promise<Row | undefined>;
|
|
7
|
+
all(sql: string, args?: unknown[]): Promise<Row[]>;
|
|
8
|
+
transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
9
|
+
};
|
|
10
|
+
export type AsyncSqliteCrud<TDb> = {
|
|
11
|
+
readonly db: TDb;
|
|
12
|
+
create<T extends Row = Row>(table: string, cols: Record<string, unknown>): Promise<T>;
|
|
13
|
+
read<T extends Row = Row>(table: string, query?: ReadQuery): Promise<T | null>;
|
|
14
|
+
update<T extends Row = Row>(table: string, cols: Record<string, unknown>, query: UpdateQuery): Promise<T | null>;
|
|
15
|
+
delete(table: string, query: DeleteQuery): Promise<number>;
|
|
16
|
+
upsert<T extends Row = Row>(table: string, cols: Record<string, unknown>): Promise<T>;
|
|
17
|
+
duplicate<T extends Row = Row>(table: string, query: DuplicateQuery): Promise<T | null>;
|
|
18
|
+
bulkCreate(table: string, rows: Record<string, unknown>[]): Promise<number>;
|
|
19
|
+
bulkUpdate(table: string, cols: Record<string, unknown>, query: UpdateQuery): Promise<number>;
|
|
20
|
+
bulkDelete(table: string, query: DeleteQuery): Promise<number>;
|
|
21
|
+
bulkUpsert(table: string, rows: Record<string, unknown>[]): Promise<number>;
|
|
22
|
+
search<T extends Row = Row>(table: string, query?: SearchQuery): Promise<SearchResult<T>>;
|
|
23
|
+
list<T extends Row = Row>(table: string, query?: SearchQuery): Promise<SearchResult<T>>;
|
|
24
|
+
transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
};
|
|
26
|
+
export declare function createAsyncSqliteCrud<TDb>(db: TDb, ex: AsyncSqliteExecutor): AsyncSqliteCrud<TDb>;
|
|
27
|
+
//# sourceMappingURL=async-crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-crud.d.ts","sourceRoot":"","sources":["../../src/sqlite/async-crud.ts"],"names":[],"mappings":"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"}
|