@fougere/adapter-sql 0.12.0-alpha.0 → 0.12.2-alpha.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/dist/check.js.map +1 -1
- package/dist/crud/SqlStorage.d.ts +4 -5
- package/dist/crud/SqlStorage.d.ts.map +1 -1
- package/dist/crud/SqlStorage.js +33 -35
- package/dist/crud/SqlStorage.js.map +1 -1
- package/dist/ddl/SqlSink.d.ts +5 -2
- package/dist/ddl/SqlSink.d.ts.map +1 -1
- package/dist/ddl/SqlSink.js +19 -12
- package/dist/ddl/SqlSink.js.map +1 -1
- package/dist/dialect/Dialect.d.ts.map +1 -1
- package/dist/dialect/Dialect.js.map +1 -1
- package/dist/diff/Change.d.ts.map +1 -1
- package/dist/diff/Change.js.map +1 -1
- package/dist/diff/SchemaState.d.ts.map +1 -1
- package/dist/diff/SchemaState.js.map +1 -1
- package/dist/fields/Engine.d.ts +3 -3
- package/dist/fields/Engine.d.ts.map +1 -1
- package/dist/fields/Engine.js +2 -1
- package/dist/fields/Engine.js.map +1 -1
- package/dist/fields/SqlFields.d.ts +3 -3
- package/dist/fields/SqlFields.d.ts.map +1 -1
- package/dist/fields/SqlFields.js +10 -4
- package/dist/fields/SqlFields.js.map +1 -1
- package/dist/source/SqlSource.d.ts.map +1 -1
- package/dist/source/SqlSource.js.map +1 -1
- package/dist/sqlite/SqliteSource.d.ts.map +1 -1
- package/dist/sqlite/SqliteSource.js.map +1 -1
- package/dist/step/Plan.d.ts.map +1 -1
- package/dist/step/Plan.js.map +1 -1
- package/dist/table/TableDef.d.ts +2 -0
- package/dist/table/TableDef.d.ts.map +1 -1
- package/dist/table/TableDef.js +18 -11
- package/dist/table/TableDef.js.map +1 -1
- package/dist/values.d.ts.map +1 -1
- package/dist/values.js.map +1 -1
- package/package.json +4 -4
- package/src/check.ts +1 -1
- package/src/crud/SqlStorage.ts +59 -40
- package/src/ddl/SqlSink.ts +30 -12
- package/src/dialect/Dialect.ts +3 -0
- package/src/diff/Change.ts +8 -0
- package/src/diff/SchemaState.ts +1 -0
- package/src/fields/Engine.ts +10 -3
- package/src/fields/SqlFields.ts +13 -12
- package/src/source/SqlSource.ts +1 -0
- package/src/sqlite/SqliteSource.ts +1 -0
- package/src/step/Plan.ts +11 -0
- package/src/table/TableDef.ts +23 -11
- package/src/values.ts +2 -0
- package/dist/adapter.schema.json +0 -16
- package/src/adapter.schema.json +0 -16
package/dist/step/Plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plan.js","sourceRoot":"","sources":["../../src/step/Plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAiB,MAAM,sBAAsB,CAAC;AAc/E,oFAAoF;AACpF,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACpE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AAClG,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAmB,EAAE,MAAmB;IACvD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Plan.js","sourceRoot":"","sources":["../../src/step/Plan.ts"],"names":[],"mappings":"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"}
|
package/dist/table/TableDef.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface TableDef {
|
|
|
9
9
|
compositePrimary: string[];
|
|
10
10
|
/** Column groups unique together, from `entity(fields, { unique: [...] })`. */
|
|
11
11
|
uniqueGroups: string[][];
|
|
12
|
+
/** Column groups indexed together, from `entity(fields, { index: [...] })`. */
|
|
13
|
+
indexGroups: string[][];
|
|
12
14
|
}
|
|
13
15
|
/** camelCase → snake_case */
|
|
14
16
|
export declare function toSnakeCase(str: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableDef.d.ts","sourceRoot":"","sources":["../../src/table/TableDef.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"TableDef.d.ts","sourceRoot":"","sources":["../../src/table/TableDef.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIvG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC;IACzB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;CACzB;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAiGD,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,eAAe,GAAG,QAAQ,CAiCpG;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAOnE;AAID,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AA+BD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,CAQpF"}
|
package/dist/table/TableDef.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Lifecycle, Role } from '@fougere/schema';
|
|
2
|
-
import { Shapes, lowerFirst } from '@fougere/schema';
|
|
2
|
+
import { SchemaError, Shapes, dotted, lowerFirst } from '@fougere/schema';
|
|
3
3
|
import { boundsOf } from '../check.js';
|
|
4
4
|
import { sqlEntries } from '../fields/SqlFields.js';
|
|
5
5
|
/** camelCase → snake_case */
|
|
@@ -11,14 +11,14 @@ export function toSnakeCase(str) {
|
|
|
11
11
|
* other field becomes exactly one column.
|
|
12
12
|
*/
|
|
13
13
|
function isStored(field) {
|
|
14
|
-
return !Role.of(field).isCollection;
|
|
14
|
+
return !Role.of(field).isCollection();
|
|
15
15
|
}
|
|
16
16
|
/** The target's primary key column. */
|
|
17
17
|
function primaryColumnOf(target) {
|
|
18
18
|
if (typeof target.getFields !== 'function')
|
|
19
19
|
return 'id';
|
|
20
20
|
for (const [name, field] of Object.entries(target.getFields())) {
|
|
21
|
-
if (Role.of(field).isPrimary)
|
|
21
|
+
if (Role.of(field).isPrimary())
|
|
22
22
|
return toSnakeCase(name);
|
|
23
23
|
}
|
|
24
24
|
return 'id'; // declared no primary() field — defensive, shouldn't happen
|
|
@@ -26,7 +26,7 @@ function primaryColumnOf(target) {
|
|
|
26
26
|
/** The FK target for a `ref()` field. */
|
|
27
27
|
function referenceFor(field, resolve, tableNameOf, hosted) {
|
|
28
28
|
const role = Role.of(field);
|
|
29
|
-
if (!role.isReference)
|
|
29
|
+
if (!role.isReference())
|
|
30
30
|
return undefined;
|
|
31
31
|
const target = role.target;
|
|
32
32
|
const mapped = tableNameOf?.get(target);
|
|
@@ -67,7 +67,7 @@ function toColumn(fieldName, field, resolve, tableNameOf, hosted, stated) {
|
|
|
67
67
|
name: toSnakeCase(fieldName),
|
|
68
68
|
type: Shapes.typeOf(field.shape),
|
|
69
69
|
nullable,
|
|
70
|
-
primary: Role.of(field).isPrimary,
|
|
70
|
+
primary: Role.of(field).isPrimary(),
|
|
71
71
|
};
|
|
72
72
|
const bounds = boundsOf(base);
|
|
73
73
|
if (bounds)
|
|
@@ -79,9 +79,9 @@ function toColumn(fieldName, field, resolve, tableNameOf, hosted, stated) {
|
|
|
79
79
|
// redundant constraint on every engine. So would indexing what `unique` constrains.
|
|
80
80
|
// Only a constraint of ONE becomes a column constraint; a group of several is a table
|
|
81
81
|
// constraint, emitted once from `uniqueGroups` rather than once per member column.
|
|
82
|
-
if (Role.of(field).isUnique && !column.primary)
|
|
82
|
+
if (Role.of(field).isUnique() && !column.primary)
|
|
83
83
|
column.unique = true;
|
|
84
|
-
if (Role.of(field).isIndexed && !column.primary && !column.unique)
|
|
84
|
+
if (Role.of(field).isIndexed() && !column.primary && !column.unique)
|
|
85
85
|
column.index = true;
|
|
86
86
|
const references = referenceFor(field, resolve, tableNameOf, hosted);
|
|
87
87
|
if (references)
|
|
@@ -99,7 +99,11 @@ export function toTable(tableName, schema, relations) {
|
|
|
99
99
|
// Judged HERE and not at `entity()`: this runs at boot, after every import, so the
|
|
100
100
|
// format is always loaded. A validator registered with `schema` would depend on which
|
|
101
101
|
// module was imported first.
|
|
102
|
-
|
|
102
|
+
const refusal = configuration === undefined
|
|
103
|
+
? undefined
|
|
104
|
+
: sqlEntries.refusalOf(configuration, [`${schema.name}.adapters.sql`]);
|
|
105
|
+
if (refusal)
|
|
106
|
+
throw new SchemaError(`${dotted(refusal.path)}: ${refusal.message}`);
|
|
103
107
|
const columns = [];
|
|
104
108
|
for (const [fieldName, field] of Object.entries(fields)) {
|
|
105
109
|
if (!isStored(field))
|
|
@@ -111,14 +115,15 @@ export function toTable(tableName, schema, relations) {
|
|
|
111
115
|
// Declared in field names, realized in column names — and a group naming a field the
|
|
112
116
|
// storage does not keep is not enforceable, so it is dropped rather than emitted against
|
|
113
117
|
// a column that will not exist.
|
|
114
|
-
const
|
|
118
|
+
const realized = (groups) => groups
|
|
115
119
|
.map((group) => group.map(toSnakeCase))
|
|
116
120
|
.filter((members) => members.every((column) => stored.has(column)));
|
|
117
121
|
return {
|
|
118
122
|
name: tableName,
|
|
119
123
|
columns,
|
|
120
124
|
compositePrimary: primaries.length > 1 ? primaries : [],
|
|
121
|
-
uniqueGroups,
|
|
125
|
+
uniqueGroups: realized(schema.getUnique() ?? []),
|
|
126
|
+
indexGroups: realized(schema.getIndex() ?? []),
|
|
122
127
|
};
|
|
123
128
|
}
|
|
124
129
|
/**
|
|
@@ -129,7 +134,9 @@ export function isKeyed(table, column) {
|
|
|
129
134
|
return column.primary
|
|
130
135
|
|| column.unique === true
|
|
131
136
|
|| column.index === true
|
|
132
|
-
|| table.compositePrimary.includes(column.name)
|
|
137
|
+
|| table.compositePrimary.includes(column.name)
|
|
138
|
+
|| table.indexGroups.some((group) => group.includes(column.name))
|
|
139
|
+
|| table.uniqueGroups.some((group) => group.includes(column.name));
|
|
133
140
|
}
|
|
134
141
|
// ─── App-wide entity collection — shared by generateSQL and desiredTables ──
|
|
135
142
|
/** camelCase → snake_case + plural */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableDef.js","sourceRoot":"","sources":["../../src/table/TableDef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,UAAU,EAA+B,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"TableDef.js","sourceRoot":"","sources":["../../src/table/TableDef.ts"],"names":[],"mappings":"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"}
|
package/dist/values.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/B,gEAAgE;IAChE,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/B,gEAAgE;IAChE,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CAC/B;AAkED,wBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAErD;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAQhG"}
|
package/dist/values.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.js","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AAUA,MAAM,QAAQ,GAAe,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAEjE,MAAM,OAAO,GAAe;IAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,QAAQ,GAAe;IAC3B,sFAAsF;IACtF,wDAAwD;IACxD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,IAAI,GAAe;IACvB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7D,mFAAmF;IACnF,gFAAgF;IAChF,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzD,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,GAAe;IAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnD,CAAC;AAEF,SAAS,IAAI,CAAC,KAAa;IACzB,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,uFAAuF,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAEjD,4EAA4E;AAC5E,SAAS,QAAQ,CAAC,KAAiB;IACjC,MAAM,IAAI,GAAG,CAAC,EAA2B,EAAE,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE,CAC3D,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fougere/adapter-sql",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.2-alpha.0",
|
|
4
4
|
"description": "Entity → SQL tables through Kysely (SQLite, PostgreSQL, MySQL, SQL Server).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fougere",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"better-sqlite3": "^13.0.3",
|
|
41
41
|
"dequal": "^2.0.3",
|
|
42
|
-
"@fougere/core": "0.12.
|
|
43
|
-
"@fougere/schema": "0.12.
|
|
42
|
+
"@fougere/core": "0.12.2-alpha.0",
|
|
43
|
+
"@fougere/schema": "0.12.2-alpha.0"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"kysely": ">=0.28.17"
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@types/better-sqlite3": "^7.6.13",
|
|
50
50
|
"@types/node": "^22.0.0",
|
|
51
51
|
"kysely": "^0.28.17",
|
|
52
|
-
"@fougere/core": "0.12.
|
|
52
|
+
"@fougere/core": "0.12.2-alpha.0"
|
|
53
53
|
},
|
|
54
54
|
"publishConfig": {
|
|
55
55
|
"access": "public"
|
package/src/check.ts
CHANGED
|
@@ -42,7 +42,7 @@ export function boundsOf(shape: Record<string, unknown> | undefined): ShapeBound
|
|
|
42
42
|
if (!shape) return undefined;
|
|
43
43
|
|
|
44
44
|
const bounds: ShapeBounds = {};
|
|
45
|
-
if (Array.isArray(shape.enum) && shape.enum.length > 0) bounds.enum = shape.enum
|
|
45
|
+
if (Array.isArray(shape.enum) && shape.enum.length > 0) bounds.enum = shape.enum;
|
|
46
46
|
for (const key of ['minLength', 'maxLength', 'minimum', 'maximum'] as const) {
|
|
47
47
|
if (typeof shape[key] === 'number') bounds[key] = shape[key] as number;
|
|
48
48
|
}
|
package/src/crud/SqlStorage.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Role } from '@fougere/schema';
|
|
2
2
|
import { sql, type Kysely } from 'kysely';
|
|
3
3
|
import { applyCreate, applyUpdate, type Fields, type SchemaView } from '@fougere/schema';
|
|
4
4
|
import { toTable, toTableName, type TableDef } from '../table/TableDef.js';
|
|
@@ -37,7 +37,7 @@ interface PrimaryKeyInfo {
|
|
|
37
37
|
/** The primary key, read off the role axis. */
|
|
38
38
|
function analyzeFields(entity: SchemaView): { pk: PrimaryKeyInfo } {
|
|
39
39
|
const pkNames = Object.entries(entity.getFields())
|
|
40
|
-
.filter(([, field]) => Role.of(field).isPrimary)
|
|
40
|
+
.filter(([, field]) => Role.of(field).isPrimary())
|
|
41
41
|
.map(([name]) => name);
|
|
42
42
|
|
|
43
43
|
return { pk: { names: pkNames, isComposite: pkNames.length > 1 } };
|
|
@@ -48,6 +48,7 @@ function chunks<T>(values: T[], size: number): T[][] {
|
|
|
48
48
|
if (values.length <= size) return [values];
|
|
49
49
|
const out: T[][] = [];
|
|
50
50
|
for (let i = 0; i < values.length; i += size) out.push(values.slice(i, i + size));
|
|
51
|
+
|
|
51
52
|
return out;
|
|
52
53
|
}
|
|
53
54
|
|
|
@@ -57,6 +58,7 @@ const UNBOUNDED = 1_000_000_000;
|
|
|
57
58
|
function pick<T extends Record<string, unknown>>(obj: T, keys: Set<string>): T {
|
|
58
59
|
const result: Record<string, unknown> = {};
|
|
59
60
|
for (const key of keys) if (key in obj) result[key] = obj[key];
|
|
61
|
+
|
|
60
62
|
return result as T;
|
|
61
63
|
}
|
|
62
64
|
|
|
@@ -65,6 +67,7 @@ function pickList<T extends Record<string, unknown>>(list: ListResult<T>, keys:
|
|
|
65
67
|
result.total = list.total;
|
|
66
68
|
result.endCursor = list.endCursor;
|
|
67
69
|
result.hasMore = list.hasMore;
|
|
70
|
+
|
|
68
71
|
return result;
|
|
69
72
|
}
|
|
70
73
|
|
|
@@ -118,11 +121,13 @@ export class SqlStorage {
|
|
|
118
121
|
output(schema: SchemaView): SqlStorage {
|
|
119
122
|
const scoped = Object.create(this) as SqlStorage;
|
|
120
123
|
scoped.selectFields = new Set(Object.keys(schema.getFields()));
|
|
124
|
+
|
|
121
125
|
return scoped;
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
private resolveSelect(options?: SelectOption): Set<string> | undefined {
|
|
125
129
|
if (options?.select) return new Set(Object.keys(options.select.getFields()));
|
|
130
|
+
|
|
126
131
|
return this.selectFields;
|
|
127
132
|
}
|
|
128
133
|
|
|
@@ -139,6 +144,7 @@ export class SqlStorage {
|
|
|
139
144
|
private toRow(data: Record<string, unknown>): Record<string, unknown> {
|
|
140
145
|
const row: Record<string, unknown> = {};
|
|
141
146
|
for (const [key, value] of Object.entries(data)) row[this.column(key)] = this.write(key, value);
|
|
147
|
+
|
|
142
148
|
return row;
|
|
143
149
|
}
|
|
144
150
|
|
|
@@ -149,6 +155,7 @@ export class SqlStorage {
|
|
|
149
155
|
const field = this.toField.get(key) ?? key;
|
|
150
156
|
data[field] = this.codecs.get(field)?.read(value) ?? value;
|
|
151
157
|
}
|
|
158
|
+
|
|
152
159
|
return data;
|
|
153
160
|
}
|
|
154
161
|
|
|
@@ -156,9 +163,11 @@ export class SqlStorage {
|
|
|
156
163
|
private wherePk<Q extends { where(a: any, b: any, c: any): Q }>(query: Q, id: string | Record<string, unknown>): Q {
|
|
157
164
|
if (this.pk.isComposite) {
|
|
158
165
|
const composite = id as Record<string, unknown>;
|
|
166
|
+
|
|
159
167
|
return this.pk.names.reduce((q, name) => q.where(this.column(name), '=', this.write(name, composite[name])), query);
|
|
160
168
|
}
|
|
161
169
|
const name = this.pk.names[0];
|
|
170
|
+
|
|
162
171
|
return query.where(this.column(name), '=', this.write(name, id));
|
|
163
172
|
}
|
|
164
173
|
|
|
@@ -317,6 +326,7 @@ export class SqlStorage {
|
|
|
317
326
|
found.set(String(data[name]), sel ? pick(data, sel) : data);
|
|
318
327
|
}
|
|
319
328
|
}
|
|
329
|
+
|
|
320
330
|
return found;
|
|
321
331
|
}
|
|
322
332
|
|
|
@@ -334,6 +344,7 @@ export class SqlStorage {
|
|
|
334
344
|
const bucket = grouped.get(key);
|
|
335
345
|
if (bucket) bucket.push(row); else grouped.set(key, [row]);
|
|
336
346
|
}
|
|
347
|
+
|
|
337
348
|
return grouped;
|
|
338
349
|
}
|
|
339
350
|
|
|
@@ -349,22 +360,14 @@ export class SqlStorage {
|
|
|
349
360
|
// `update: 'now'`, so filling the creation side first leaves nothing for the
|
|
350
361
|
// update side to stamp — the row would carry the moment it was inserted forever.
|
|
351
362
|
const data = applyCreate(this.fields, applyUpdate(this.fields, input));
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
const frozen = this.frozenColumns();
|
|
356
|
-
const row = this.toRow(data);
|
|
357
|
-
const replaced = Object.fromEntries(Object.entries(row).filter(([column]) => !frozen.has(column)));
|
|
358
|
-
|
|
359
|
-
const insert = this.db.insertInto(this.table.name).values(row);
|
|
360
|
-
await (this.upsertClause === 'on conflict'
|
|
361
|
-
? insert.onConflict((oc: any) => oc.columns(this.pk.names.map((n) => this.column(n))).doUpdateSet(replaced))
|
|
362
|
-
: (insert as any).onDuplicateKeyUpdate(replaced)
|
|
363
|
-
).execute();
|
|
363
|
+
const replaced = this.toRow(applyUpdate(this.fields, input));
|
|
364
|
+
|
|
365
|
+
await this.onExisting(this.db.insertInto(this.table.name).values(this.toRow(data)), replaced).execute();
|
|
364
366
|
|
|
365
367
|
const id = this.pk.isComposite
|
|
366
368
|
? Object.fromEntries(this.pk.names.map((n) => [n, data[n]]))
|
|
367
369
|
: (data[this.pk.names[0]!] as string);
|
|
370
|
+
|
|
368
371
|
return (await this.findById(id as never, options))!;
|
|
369
372
|
}
|
|
370
373
|
|
|
@@ -378,38 +381,46 @@ export class SqlStorage {
|
|
|
378
381
|
}
|
|
379
382
|
if (inputs.length === 0) return 0;
|
|
380
383
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
const
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
384
|
+
// One statement replaces the same columns on every row it holds, so rows that name
|
|
385
|
+
// different fields go in different statements — or one row's gap erases another's value.
|
|
386
|
+
const pages = new Map<string, { replaced: string[]; rows: Record<string, unknown>[] }>();
|
|
387
|
+
for (const input of inputs) {
|
|
388
|
+
const replaced = Object.keys(this.toRow(applyUpdate(this.fields, input))).sort();
|
|
389
|
+
const page = pages.get(replaced.join()) ?? pages.set(replaced.join(), { replaced, rows: [] }).get(replaced.join())!;
|
|
390
|
+
page.rows.push(this.toRow(applyCreate(this.fields, applyUpdate(this.fields, input))));
|
|
391
|
+
}
|
|
389
392
|
|
|
390
393
|
let written = 0;
|
|
391
|
-
for (const
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
394
|
+
for (const { replaced, rows } of pages.values()) {
|
|
395
|
+
const incoming = Object.fromEntries(replaced.map((column) => [column, this.incoming(column)]));
|
|
396
|
+
// A statement binds VALUES: one row costs as many as it has columns.
|
|
397
|
+
const width = new Set(rows.flatMap((row) => Object.keys(row))).size;
|
|
398
|
+
const perStatement = Math.max(1, Math.floor(this.maxBindings / Math.max(1, width)));
|
|
399
|
+
|
|
400
|
+
for (const slice of chunks(rows, perStatement)) {
|
|
401
|
+
await this.onExisting(this.db.insertInto(this.table.name).values(slice), incoming).execute();
|
|
402
|
+
written += slice.length;
|
|
403
|
+
}
|
|
398
404
|
}
|
|
405
|
+
|
|
399
406
|
return written;
|
|
400
407
|
}
|
|
401
408
|
|
|
402
|
-
/**
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
409
|
+
/** The value a refused row brought for a column: `excluded` on SQLite and Postgres, `VALUES()` on MySQL. */
|
|
410
|
+
private incoming(column: string) {
|
|
411
|
+
return this.upsertClause === 'on conflict' ? sql.ref(`excluded.${column}`) : sql`values(${sql.ref(column)})`;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/** What a row that is already there becomes — and nothing, when the write replaces no column. */
|
|
415
|
+
private onExisting(insert: any, replaced: Record<string, unknown>) {
|
|
416
|
+
const keys = this.pk.names.map((n) => this.column(n));
|
|
417
|
+
const empty = Object.keys(replaced).length === 0;
|
|
418
|
+
|
|
419
|
+
if (this.upsertClause === 'on conflict') {
|
|
420
|
+
return insert.onConflict((oc: any) => (empty ? oc.columns(keys).doNothing() : oc.columns(keys).doUpdateSet(replaced)));
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return insert.onDuplicateKeyUpdate(empty ? { [keys[0]!]: sql.ref(keys[0]!) } : replaced);
|
|
413
424
|
}
|
|
414
425
|
|
|
415
426
|
async findById(id: string | Record<string, unknown>, options?: SelectOption): Promise<Record<string, unknown> | undefined> {
|
|
@@ -417,6 +428,7 @@ export class SqlStorage {
|
|
|
417
428
|
if (!row) return undefined;
|
|
418
429
|
const data = this.fromRow(row);
|
|
419
430
|
const sel = this.resolveSelect(options);
|
|
431
|
+
|
|
420
432
|
return sel ? pick(data, sel) : data;
|
|
421
433
|
}
|
|
422
434
|
|
|
@@ -427,6 +439,7 @@ export class SqlStorage {
|
|
|
427
439
|
if (!row) return undefined;
|
|
428
440
|
const data = this.fromRow(row);
|
|
429
441
|
const sel = this.resolveSelect(options);
|
|
442
|
+
|
|
430
443
|
return sel ? pick(data, sel) : data;
|
|
431
444
|
}
|
|
432
445
|
|
|
@@ -442,6 +455,7 @@ export class SqlStorage {
|
|
|
442
455
|
out.push(sel ? pick(data, sel) : data);
|
|
443
456
|
}
|
|
444
457
|
}
|
|
458
|
+
|
|
445
459
|
return out;
|
|
446
460
|
}
|
|
447
461
|
|
|
@@ -468,6 +482,7 @@ export class SqlStorage {
|
|
|
468
482
|
);
|
|
469
483
|
}
|
|
470
484
|
const [key, values] = oversized[0]!;
|
|
485
|
+
|
|
471
486
|
return chunks([...new Set(values as unknown[])], this.maxBindings)
|
|
472
487
|
.map((slice) => ({ ...criteria, [key]: slice }));
|
|
473
488
|
}
|
|
@@ -488,6 +503,7 @@ export class SqlStorage {
|
|
|
488
503
|
const created = id !== undefined ? await this.findById(id) : undefined;
|
|
489
504
|
const result = created ?? data;
|
|
490
505
|
const sel = this.resolveSelect(options);
|
|
506
|
+
|
|
491
507
|
return sel ? pick(result, sel) : result;
|
|
492
508
|
}
|
|
493
509
|
|
|
@@ -499,6 +515,7 @@ export class SqlStorage {
|
|
|
499
515
|
const updated = await this.findById(id);
|
|
500
516
|
const result = updated ?? (typeof id === 'string' ? { id, ...data } : { ...id, ...data });
|
|
501
517
|
const sel = this.resolveSelect(options);
|
|
518
|
+
|
|
502
519
|
return sel ? pick(result, sel) : result;
|
|
503
520
|
}
|
|
504
521
|
|
|
@@ -523,6 +540,7 @@ export class SqlStorage {
|
|
|
523
540
|
const before = await this.findById(id);
|
|
524
541
|
if (!before) return false;
|
|
525
542
|
await this.wherePk(this.db.deleteFrom(this.table.name) as any, id).execute();
|
|
543
|
+
|
|
526
544
|
return true;
|
|
527
545
|
}
|
|
528
546
|
}
|
|
@@ -530,5 +548,6 @@ export class SqlStorage {
|
|
|
530
548
|
/** Create a StorageFactory backed by Kysely — same call shape on every engine. */
|
|
531
549
|
export function createStorageFactory(db: Kysely<any>, options?: StorageFactoryOptions, dialect: DialectName = 'sqlite') {
|
|
532
550
|
const resolve = options?.tableName ?? toTableName;
|
|
551
|
+
|
|
533
552
|
return (entity: SchemaView, name: string) => new SqlStorage(db, entity, resolve(name), undefined, dialect);
|
|
534
553
|
}
|
package/src/ddl/SqlSink.ts
CHANGED
|
@@ -40,6 +40,7 @@ export function compiler(name: DialectName): Kysely<any> {
|
|
|
40
40
|
},
|
|
41
41
|
});
|
|
42
42
|
engines.set(name, engine);
|
|
43
|
+
|
|
43
44
|
return engine;
|
|
44
45
|
}
|
|
45
46
|
|
|
@@ -83,25 +84,39 @@ export function createTableSQL(
|
|
|
83
84
|
return builder.compile().sql;
|
|
84
85
|
}
|
|
85
86
|
|
|
86
|
-
/** `CREATE INDEX` for
|
|
87
|
+
/** `CREATE INDEX` for one column that asked for one. */
|
|
87
88
|
export function indexSQL(table: TableDef, column: ColumnDef, dialectName: DialectName): string {
|
|
88
|
-
let builder = compiler(dialectName)
|
|
89
|
-
.schema.createIndex(`${table.name}_${column.name}_idx`)
|
|
90
|
-
.on(table.name)
|
|
91
|
-
.column(column.name);
|
|
92
89
|
// A `unique()` on a table that already exists has nowhere else to land: `createTable`
|
|
93
90
|
// writes it as a column constraint, and no engine here can ALTER one in. As an index it
|
|
94
91
|
// arrives — or the statement fails on the rows that already break it, which is the answer.
|
|
95
|
-
|
|
96
|
-
if (dialectName !== 'mssql') builder = builder.ifNotExists();
|
|
97
|
-
return builder.compile().sql;
|
|
92
|
+
return indexOver(table, [column.name], dialectName, column.unique === true);
|
|
98
93
|
}
|
|
99
94
|
|
|
100
|
-
/**
|
|
95
|
+
/**
|
|
96
|
+
* Every index one table asks for — one statement each. A GROUP is not the same thing as its
|
|
97
|
+
* members indexed apart: an index on `(a, b)` serves a filter on `a` alone and never on `b`.
|
|
98
|
+
*/
|
|
101
99
|
export function createIndexSQL(table: TableDef, dialectName: DialectName): string[] {
|
|
102
|
-
return
|
|
103
|
-
.filter((column) => column.index)
|
|
104
|
-
.map((
|
|
100
|
+
return [
|
|
101
|
+
...table.columns.filter((column) => column.index).map((column) => indexSQL(table, column, dialectName)),
|
|
102
|
+
...table.indexGroups.map((group) => indexOver(table, group, dialectName)),
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function indexOver(
|
|
107
|
+
table: TableDef,
|
|
108
|
+
columns: readonly string[],
|
|
109
|
+
dialectName: DialectName,
|
|
110
|
+
unique = false,
|
|
111
|
+
): string {
|
|
112
|
+
let builder = compiler(dialectName)
|
|
113
|
+
.schema.createIndex(`${table.name}_${columns.join('_')}_idx`)
|
|
114
|
+
.on(table.name)
|
|
115
|
+
.columns([...columns]);
|
|
116
|
+
if (unique) builder = builder.unique();
|
|
117
|
+
if (dialectName !== 'mssql') builder = builder.ifNotExists();
|
|
118
|
+
|
|
119
|
+
return builder.compile().sql;
|
|
105
120
|
}
|
|
106
121
|
|
|
107
122
|
/**
|
|
@@ -115,6 +130,7 @@ export function addForeignKeyConstraintSQL(table: TableDef, column: ColumnDef, d
|
|
|
115
130
|
.schema.alterTable(table.name)
|
|
116
131
|
.addForeignKeyConstraint(name, [column.name], ref.table, [ref.column]);
|
|
117
132
|
if (ref.onDelete) builder = builder.onDelete(ref.onDelete);
|
|
133
|
+
|
|
118
134
|
return builder.compile().sql;
|
|
119
135
|
}
|
|
120
136
|
|
|
@@ -151,6 +167,7 @@ export function generateSQL(app: AppLike, options?: GenerateOptions): string[] {
|
|
|
151
167
|
// Indexes last: every table exists by then, and an index on a table that does not is
|
|
152
168
|
// the one ordering mistake this pass can make.
|
|
153
169
|
const indexes = ordered.flatMap((table) => createIndexSQL(table, dialect));
|
|
170
|
+
|
|
154
171
|
return [...creates, ...constraints, ...indexes];
|
|
155
172
|
}
|
|
156
173
|
|
|
@@ -171,6 +188,7 @@ export function autoMigrate(app: AppLike, sink: SqlSink, options?: GenerateOptio
|
|
|
171
188
|
const pending = generateSQL(app, options)
|
|
172
189
|
.map((statement) => runOn(sink, statement))
|
|
173
190
|
.filter((result): result is Promise<unknown> => typeof (result as any)?.then === 'function');
|
|
191
|
+
|
|
174
192
|
return pending.length ? Promise.all(pending).then(() => undefined) : undefined;
|
|
175
193
|
}
|
|
176
194
|
|
package/src/dialect/Dialect.ts
CHANGED
|
@@ -22,6 +22,7 @@ export interface Dialect {
|
|
|
22
22
|
function messageOf(error: unknown): string {
|
|
23
23
|
const e = error as { message?: unknown; code?: unknown; cause?: unknown } | null;
|
|
24
24
|
const own = `${typeof e?.message === 'string' ? e.message : ''} ${typeof e?.code === 'string' ? e.code : ''}`;
|
|
25
|
+
|
|
25
26
|
// Kysely wraps a driver error, and D1 wraps it again: the wording is often one level down.
|
|
26
27
|
return e?.cause ? `${own} ${messageOf(e.cause)}` : own;
|
|
27
28
|
}
|
|
@@ -31,6 +32,7 @@ const KEY_LENGTH = 255;
|
|
|
31
32
|
|
|
32
33
|
function keyLength(column: ColumnDef): number {
|
|
33
34
|
const declared = column.bounds?.maxLength;
|
|
35
|
+
|
|
34
36
|
return declared !== undefined && declared > 0 && declared <= KEY_LENGTH ? declared : KEY_LENGTH;
|
|
35
37
|
}
|
|
36
38
|
|
|
@@ -147,6 +149,7 @@ export const dialects: Record<DialectName, Dialect> = {
|
|
|
147
149
|
export function resolveDialect(name: DialectName): Dialect {
|
|
148
150
|
const dialect = dialects[name];
|
|
149
151
|
if (!dialect) throw new Error(`Unknown SQL dialect '${name}'. Known: ${Object.keys(dialects).join(', ')}`);
|
|
152
|
+
|
|
150
153
|
return dialect;
|
|
151
154
|
}
|
|
152
155
|
|