@fougere/adapter-sql 0.2.0-alpha.2
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 +18 -0
- package/dist/check.d.ts +41 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +67 -0
- package/dist/check.js.map +1 -0
- package/dist/crud.d.ts +153 -0
- package/dist/crud.d.ts.map +1 -0
- package/dist/crud.js +458 -0
- package/dist/crud.js.map +1 -0
- package/dist/ddl.d.ts +87 -0
- package/dist/ddl.d.ts.map +1 -0
- package/dist/ddl.js +194 -0
- package/dist/ddl.js.map +1 -0
- package/dist/dialect.d.ts +54 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +109 -0
- package/dist/dialect.js.map +1 -0
- package/dist/diff.d.ts +86 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +168 -0
- package/dist/diff.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/setup.d.ts +37 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +40 -0
- package/dist/setup.js.map +1 -0
- package/dist/table.d.ts +169 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +292 -0
- package/dist/table.js.map +1 -0
- package/dist/values.d.ts +32 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +70 -0
- package/dist/values.js.map +1 -0
- package/package.json +56 -0
package/dist/values.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const identity = { write: (v) => v, read: (v) => v };
|
|
2
|
+
const boolean = {
|
|
3
|
+
write: (v) => (v ? 1 : 0),
|
|
4
|
+
read: (v) => Boolean(v),
|
|
5
|
+
};
|
|
6
|
+
const dateTime = {
|
|
7
|
+
// A handler may hand over a Date (what the field declares) or an ISO string (what the
|
|
8
|
+
// pre-fix workarounds passed) — both must keep working.
|
|
9
|
+
write: (v) => (v instanceof Date ? v.toISOString() : v),
|
|
10
|
+
read: (v) => (typeof v === 'string' ? new Date(v) : v),
|
|
11
|
+
};
|
|
12
|
+
const json = {
|
|
13
|
+
write: (v) => (typeof v === 'string' ? v : JSON.stringify(v)),
|
|
14
|
+
// Already parsed by the driver (Postgres jsonb) → leave it. Text → parse. A column
|
|
15
|
+
// holding invalid JSON is a corrupt row, not a value to guess at: let it throw.
|
|
16
|
+
read: (v) => (typeof v === 'string' ? JSON.parse(v) : v),
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* A driver may answer a number as a BigInt — Postgres does it for `count(*)` and for
|
|
20
|
+
* `bigint` columns, DuckDB for every count. The entity declares a number, so that is
|
|
21
|
+
* what comes back.
|
|
22
|
+
*
|
|
23
|
+
* Out of range it REFUSES rather than rounding. `Number(9007199254740993n)` is
|
|
24
|
+
* `9007199254740992` — a wrong answer, silently, and the row would look fine. A value
|
|
25
|
+
* that large is a real identifier somewhere, and its field should say `text()`.
|
|
26
|
+
*/
|
|
27
|
+
const numeric = {
|
|
28
|
+
write: (v) => (typeof v === 'bigint' ? fits(v) : v),
|
|
29
|
+
read: (v) => (typeof v === 'bigint' ? fits(v) : v),
|
|
30
|
+
};
|
|
31
|
+
function fits(value) {
|
|
32
|
+
if (value >= MIN_SAFE && value <= MAX_SAFE)
|
|
33
|
+
return Number(value);
|
|
34
|
+
throw new Error(`${value} does not fit a JavaScript number — declare the field as \`text()\` to keep it whole.`);
|
|
35
|
+
}
|
|
36
|
+
const MIN_SAFE = BigInt(Number.MIN_SAFE_INTEGER);
|
|
37
|
+
const MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);
|
|
38
|
+
/** Absent stays absent, null stays null — a codec never invents a value. */
|
|
39
|
+
function nullSafe(codec) {
|
|
40
|
+
const pass = (fn) => (v) => v === null || v === undefined ? v : fn(v);
|
|
41
|
+
return { write: pass(codec.write), read: pass(codec.read) };
|
|
42
|
+
}
|
|
43
|
+
/** The pair a column's shape calls for — identity when the driver already accepts it. */
|
|
44
|
+
export function codecFor(shape) {
|
|
45
|
+
switch (shape?.type) {
|
|
46
|
+
case 'boolean':
|
|
47
|
+
return nullSafe(boolean);
|
|
48
|
+
case 'integer':
|
|
49
|
+
case 'number':
|
|
50
|
+
return nullSafe(numeric);
|
|
51
|
+
case 'string':
|
|
52
|
+
return shape.format === 'date-time' ? nullSafe(dateTime) : identity;
|
|
53
|
+
case 'array':
|
|
54
|
+
case 'object':
|
|
55
|
+
return nullSafe(json);
|
|
56
|
+
default:
|
|
57
|
+
return identity;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Field name → codec, for every column that needs one. Identity columns are omitted. */
|
|
61
|
+
export function codecsOf(columns) {
|
|
62
|
+
const codecs = new Map();
|
|
63
|
+
for (const column of columns) {
|
|
64
|
+
const codec = codecFor(column.shape);
|
|
65
|
+
if (codec !== identity)
|
|
66
|
+
codecs.set(column.field, codec);
|
|
67
|
+
}
|
|
68
|
+
return codecs;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fougere/adapter-sql",
|
|
3
|
+
"version": "0.2.0-alpha.2",
|
|
4
|
+
"description": "Entity → SQL tables through Kysely (SQLite, PostgreSQL, MySQL, SQL Server).",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"fougere",
|
|
7
|
+
"typescript",
|
|
8
|
+
"kysely",
|
|
9
|
+
"sql",
|
|
10
|
+
"sqlite",
|
|
11
|
+
"postgresql",
|
|
12
|
+
"mysql",
|
|
13
|
+
"orm",
|
|
14
|
+
"ddl"
|
|
15
|
+
],
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/chok/fougere.git",
|
|
20
|
+
"directory": "packages/adapter/sql"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "dist/index.js",
|
|
24
|
+
"types": "dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"better-sqlite3": "^13.0.3",
|
|
36
|
+
"@fougere/schema": "0.2.0-alpha.2"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"kysely": ">=0.28.17"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
43
|
+
"@types/node": "^22.0.0",
|
|
44
|
+
"kysely": "^0.28.17",
|
|
45
|
+
"@fougere/core": "0.2.0-alpha.2"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "rm -rf dist && tsc",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"test:watch": "vitest",
|
|
54
|
+
"typecheck": "tsc --noEmit -p tsconfig.test.json"
|
|
55
|
+
}
|
|
56
|
+
}
|