@owlmeans/postgres-resource 0.1.18-rc.4 → 0.1.18-rc.41
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/README.md +185 -101
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/postgres-resource/SKILL.md +110 -21
- package/build/consts.d.ts +8 -1
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +8 -1
- package/build/consts.js.map +1 -1
- package/build/declarations.js +5 -5
- package/build/errors.d.ts +3 -1
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +4 -2
- package/build/errors.js.map +1 -1
- package/build/resource.d.ts +2 -2
- package/build/resource.d.ts.map +1 -1
- package/build/resource.js +112 -108
- package/build/resource.js.map +1 -1
- package/build/types.d.ts +34 -19
- package/build/types.d.ts.map +1 -1
- package/build/utils/criteria.d.ts +10 -6
- package/build/utils/criteria.d.ts.map +1 -1
- package/build/utils/criteria.js +156 -11
- package/build/utils/criteria.js.map +1 -1
- package/build/utils/diff.d.ts +13 -0
- package/build/utils/diff.d.ts.map +1 -1
- package/build/utils/diff.js +60 -6
- package/build/utils/diff.js.map +1 -1
- package/build/utils/migrations.d.ts +2 -2
- package/build/utils/migrations.d.ts.map +1 -1
- package/build/utils/migrations.js +11 -8
- package/build/utils/migrations.js.map +1 -1
- package/build/utils/name.d.ts +3 -3
- package/build/utils/name.js +3 -3
- package/build/utils/sql.d.ts +10 -2
- package/build/utils/sql.d.ts.map +1 -1
- package/build/utils/sql.js.map +1 -1
- package/build/utils/table.d.ts +4 -0
- package/build/utils/table.d.ts.map +1 -1
- package/build/utils/table.js +4 -0
- package/build/utils/table.js.map +1 -1
- package/package.json +7 -7
- package/src/consts.ts +8 -1
- package/src/declarations.ts +5 -5
- package/src/errors.ts +4 -2
- package/src/resource.ts +139 -135
- package/src/types.ts +36 -18
- package/src/utils/criteria.ts +202 -23
- package/src/utils/diff.ts +62 -7
- package/src/utils/migrations.ts +11 -8
- package/src/utils/name.ts +3 -3
- package/src/utils/sql.ts +0 -0
- package/src/utils/table.ts +5 -1
- package/tests/criteria.spec.ts +237 -0
- package/tests/diff.spec.ts +111 -0
- package/tests/errors.spec.ts +11 -0
- package/tests/name.spec.ts +3 -3
- package/tests/sql.spec.ts +4 -3
package/build/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Criteria, DbLocker, LockableResource, MigratableResource, Resource, ResourceDbService, ResourceRecord, WriteOptions } from '@owlmeans/resource';
|
|
2
2
|
import type { AnySchema } from 'ajv';
|
|
3
3
|
import type { Pool, PoolClient, QueryResultRow } from 'pg';
|
|
4
4
|
import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
|
5
|
+
import type { PgColumn, PgTable } from 'drizzle-orm/pg-core';
|
|
5
6
|
import type { PgAutoSync, PgIndexMethod, PgReferentialAction } from './consts.js';
|
|
6
7
|
/**
|
|
7
8
|
* The handle {@link PostgresDbService.db} resolves to. Carries the pool alongside the
|
|
@@ -12,9 +13,9 @@ export interface PostgresDb {
|
|
|
12
13
|
/** Drizzle bound to this config alias' pool. */
|
|
13
14
|
drizzle: NodePgDatabase<Record<string, never>>;
|
|
14
15
|
pool: Pool;
|
|
15
|
-
/** The Postgres SCHEMA — i.e. `service.name(alias)
|
|
16
|
+
/** The Postgres SCHEMA this config alias' resources live in — i.e. `service.name(alias)`. */
|
|
16
17
|
schema: string;
|
|
17
|
-
/** The Postgres DATABASE — i.e. `config.meta.database`.
|
|
18
|
+
/** The Postgres DATABASE the pool is connected to — i.e. `config.meta.database`. */
|
|
18
19
|
database: string;
|
|
19
20
|
}
|
|
20
21
|
export interface PostgresDbService extends ResourceDbService<PostgresDb, Pool>, DbLocker<ResourceRecord> {
|
|
@@ -61,7 +62,15 @@ export interface PostgresTx {
|
|
|
61
62
|
/** Fully qualified identifier of a registered resource; omit for the owning resource. */
|
|
62
63
|
ref: (resourceAlias?: string) => string;
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
+
/**
|
|
66
|
+
* A `Resource<T>` over one Postgres table.
|
|
67
|
+
*
|
|
68
|
+
* Every method beyond the base contract exists because a table has structure a document
|
|
69
|
+
* store does not: identity supplied by the caller, conflict arbiters, partial writes, and
|
|
70
|
+
* SQL that no criteria object can express. Type the resource once —
|
|
71
|
+
* `context.resource<PostgresResource<Project>>(alias)` — rather than per call.
|
|
72
|
+
*/
|
|
73
|
+
export interface PostgresResource<T extends ResourceRecord> extends Resource<T>, LockableResource<T>, MigratableResource<PostgresTx, PostgresResource<T>> {
|
|
65
74
|
/** Physical table name override. Defaults to the resource alias, sanitized. */
|
|
66
75
|
name?: string;
|
|
67
76
|
/** The AJV schema — single source of truth for the table structure. */
|
|
@@ -73,7 +82,7 @@ export interface PostgresResource<T extends ResourceRecord> extends Resource<T>,
|
|
|
73
82
|
db: () => Promise<PostgresDb>;
|
|
74
83
|
client: () => Promise<Pool>;
|
|
75
84
|
/** Declare an index the JSON schema can't express. Chainable. */
|
|
76
|
-
index:
|
|
85
|
+
index: (name: string, spec: PgIndexSpec) => PostgresResource<T>;
|
|
77
86
|
getDefaults: () => Partial<T>;
|
|
78
87
|
/** Raw rows, no marshalling. */
|
|
79
88
|
query: <Row extends QueryResultRow = QueryResultRow>(text: string, params?: unknown[]) => Promise<Row[]>;
|
|
@@ -81,22 +90,24 @@ export interface PostgresResource<T extends ResourceRecord> extends Resource<T>,
|
|
|
81
90
|
/** Returns the affected row count. */
|
|
82
91
|
execute: (text: string, params?: unknown[]) => Promise<number>;
|
|
83
92
|
/** Rows marshalled back into `T` through the table spec. */
|
|
84
|
-
select:
|
|
85
|
-
selectOne:
|
|
93
|
+
select: (text: string, params?: unknown[]) => Promise<T[]>;
|
|
94
|
+
selectOne: (text: string, params?: unknown[]) => Promise<T | null>;
|
|
86
95
|
/** Fully qualified `"schema"."table"`; pass an alias to reference another resource. */
|
|
87
96
|
ref: (resourceAlias?: string) => string;
|
|
88
97
|
transaction: <R>(fn: (tx: PostgresTx) => Promise<R>) => Promise<R>;
|
|
89
98
|
/** Create with a caller supplied id — `create()` refuses one, mirroring mongo. */
|
|
90
|
-
insert:
|
|
99
|
+
insert: (record: Partial<T>) => Promise<T>;
|
|
91
100
|
/** `INSERT ... ON CONFLICT (...) DO UPDATE`. Defaults to conflicting on the primary key. */
|
|
92
|
-
upsert:
|
|
101
|
+
upsert: (record: Partial<T>, conflict?: string[]) => Promise<T>;
|
|
93
102
|
/** Merge semantics — `update()` replaces the whole record, mirroring mongo's `replaceOne`. */
|
|
94
|
-
patch:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
patch: (record: Partial<T>, opts?: WriteOptions) => Promise<T>;
|
|
104
|
+
/**
|
|
105
|
+
* `count(*)` of the rows matching `criteria`, per distinct combination of `fields` — one
|
|
106
|
+
* `GROUP BY` round trip. Each answer carries the group's values (by property name) and `count`.
|
|
107
|
+
*/
|
|
108
|
+
countBy: (criteria: Criteria<T> | undefined, fields: Array<keyof T & string>) => Promise<Array<Record<string, unknown> & {
|
|
109
|
+
count: number;
|
|
110
|
+
}>>;
|
|
100
111
|
}
|
|
101
112
|
/** Compiled, database ready description of a resource's table. */
|
|
102
113
|
export interface TableSpec {
|
|
@@ -219,11 +230,15 @@ export interface PgReferenceSpec {
|
|
|
219
230
|
onUpdate?: PgReferentialAction | `${PgReferentialAction}`;
|
|
220
231
|
}
|
|
221
232
|
/**
|
|
222
|
-
* The Drizzle table
|
|
223
|
-
*
|
|
224
|
-
*
|
|
233
|
+
* The Drizzle table `specToTable` compiles from a {@link TableSpec}.
|
|
234
|
+
*
|
|
235
|
+
* Both halves are load bearing. `PgTable` is what the query builder accepts and what keeps
|
|
236
|
+
* the rows it hands back usable — erasing it to `never` would collapse every result row.
|
|
237
|
+
* The index signature is how a column is reached: the columns are keyed by schema property
|
|
238
|
+
* name and only known at runtime, so `eq(entity[column.property], value)` is a plain lookup
|
|
239
|
+
* rather than a cast.
|
|
225
240
|
*/
|
|
226
|
-
export type PgRuntimeTable = Record<string,
|
|
241
|
+
export type PgRuntimeTable = PgTable & Record<string, PgColumn>;
|
|
227
242
|
/** One column as Postgres currently reports it. */
|
|
228
243
|
export interface LiveColumn {
|
|
229
244
|
name: string;
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Criteria, Sort } from '@owlmeans/resource';
|
|
2
2
|
import type { SQL } from 'drizzle-orm';
|
|
3
3
|
import type { PgRuntimeTable, TableSpec } from '../types.js';
|
|
4
4
|
/**
|
|
5
|
-
* Translate
|
|
5
|
+
* Translate a {@link Criteria} into a WHERE clause. `undefined` means "no constraint at
|
|
6
|
+
* all" — the caller decides whether that is a full scan or a refusal.
|
|
6
7
|
*
|
|
7
8
|
* An unknown key raises rather than being skipped: a typo silently widening a query to
|
|
8
9
|
* the whole table is the failure mode worth being loud about.
|
|
9
10
|
*
|
|
10
11
|
* @throws {UnsupportedArgumentError}
|
|
11
12
|
*/
|
|
12
|
-
export declare const criteriaToSql: (criteria:
|
|
13
|
+
export declare const criteriaToSql: <T>(criteria: Criteria<T> | undefined, spec: TableSpec, table: PgRuntimeTable) => SQL | undefined;
|
|
13
14
|
/**
|
|
14
|
-
* Translate
|
|
15
|
-
* `
|
|
15
|
+
* Translate a {@link Sort} list into ORDER BY. A bare field name is ascending;
|
|
16
|
+
* `{ field, order: 'desc' }` reverses it — the same meaning every backend gives it.
|
|
16
17
|
*
|
|
17
18
|
* The primary key is always appended as a tiebreak. Postgres has no implicit row order, so
|
|
18
19
|
* paginating on a non-unique sort key silently duplicates and skips rows between pages —
|
|
19
20
|
* a difference from mongo that would otherwise surface as a data bug rather than an error.
|
|
20
21
|
*
|
|
22
|
+
* A dotted path is a column this table does not have: criteria can reach into jsonb, ORDER BY
|
|
23
|
+
* cannot, and refusing is better than ordering by something the caller did not name.
|
|
24
|
+
*
|
|
21
25
|
* @throws {UnsupportedArgumentError}
|
|
22
26
|
*/
|
|
23
|
-
export declare const sortToSql: (sort:
|
|
27
|
+
export declare const sortToSql: <T>(sort: Sort<T>[] | undefined, spec: TableSpec, table: PgRuntimeTable) => SQL[];
|
|
24
28
|
//# sourceMappingURL=criteria.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAkB,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAExE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,KAAK,EAAc,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAoSxE;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,YACnB,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,QAAQ,SAAS,SAAS,cAAc,KACxE,GAAG,GAAG,SAIR,CAAA;AAuED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,QACnB,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,QAAQ,SAAS,SAAS,cAAc,KAClE,GAAG,EA0BL,CAAA"}
|
package/build/utils/criteria.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { UnsupportedArgumentError } from '@owlmeans/resource';
|
|
2
|
-
import { and, asc, desc, or, sql } from 'drizzle-orm';
|
|
2
|
+
import { and, asc, desc, or, param, sql } from 'drizzle-orm';
|
|
3
3
|
const COMPARISON = {
|
|
4
4
|
$eq: '=', $ne: '<>', $gt: '>', $gte: '>=', $lt: '<', $lte: '<='
|
|
5
5
|
};
|
|
@@ -10,6 +10,46 @@ const value = (raw, column) => {
|
|
|
10
10
|
}
|
|
11
11
|
return sql `${raw}`;
|
|
12
12
|
};
|
|
13
|
+
/** The operand of an array operator as a list — a scalar is the list of itself. */
|
|
14
|
+
const listOf = (operand) => Array.isArray(operand) ? operand : [operand];
|
|
15
|
+
const isPlainObject = (raw) => raw != null && typeof raw === 'object' && !Array.isArray(raw) && !(raw instanceof Date);
|
|
16
|
+
/** A JSON value as a bound `jsonb` literal. */
|
|
17
|
+
const json = (raw) => sql `${JSON.stringify(raw instanceof Date ? raw.toISOString() : raw)}::jsonb`;
|
|
18
|
+
/** `ARRAY[$1, $2]::jsonb[]` — one bound JSON literal per value. */
|
|
19
|
+
const jsonList = (values) => values.length === 0
|
|
20
|
+
? sql `ARRAY[]::jsonb[]`
|
|
21
|
+
: sql `ARRAY[${sql.join(values.map(entry => sql `${JSON.stringify(entry instanceof Date ? entry.toISOString() : entry)}`), sql `, `)}]::jsonb[]`;
|
|
22
|
+
/**
|
|
23
|
+
* `@>` / `<@` against a jsonb value: an object is contained as an object, anything else as the
|
|
24
|
+
* JSON array it is (or the array of the one value it is).
|
|
25
|
+
*/
|
|
26
|
+
const jsonContainment = (target, operator, operand) => sql `${target} ${sql.raw(operator)} ${json(isPlainObject(operand) ? operand : listOf(operand))}`;
|
|
27
|
+
/**
|
|
28
|
+
* `&&` has no jsonb form: an array value overlaps when one of its elements is one of the operands,
|
|
29
|
+
* and a scalar value — like every other store reads it — when it is one of them.
|
|
30
|
+
*/
|
|
31
|
+
const jsonOverlap = (target, operand) => {
|
|
32
|
+
const values = listOf(operand);
|
|
33
|
+
return sql `(CASE WHEN jsonb_typeof(${target}) = 'array' THEN EXISTS (SELECT 1 FROM jsonb_array_elements(${target}) AS element WHERE element = ANY(${jsonList(values)})) ELSE ${target} = ANY(${jsonList(values)}) END)`;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* `@>` / `<@` / `&&` on a column. A native array column takes ONE bound array parameter cast to the
|
|
37
|
+
* column's own type (a bare JS array in a template would expand into a row constructor), a jsonb
|
|
38
|
+
* column takes JSON, and a scalar operand is the one-element list either way.
|
|
39
|
+
*/
|
|
40
|
+
const arrayOperator = (table, column, operator, operand) => {
|
|
41
|
+
const target = columnRef(table, column);
|
|
42
|
+
if (column.jsonb) {
|
|
43
|
+
return operator === '$overlaps'
|
|
44
|
+
? jsonOverlap(target, operand)
|
|
45
|
+
: jsonContainment(target, operator === '$contains' ? '@>' : '<@', operand);
|
|
46
|
+
}
|
|
47
|
+
const symbol = sql.raw(operator === '$contains' ? '@>' : operator === '$contained' ? '<@' : '&&');
|
|
48
|
+
if (column.array) {
|
|
49
|
+
return sql `${target} ${symbol} ${param(listOf(operand))}::${sql.raw(column.sqlType)}`;
|
|
50
|
+
}
|
|
51
|
+
return sql `${target} ${symbol} ${value(operand, column)}`;
|
|
52
|
+
};
|
|
13
53
|
const inList = (table, column, values, negate) => {
|
|
14
54
|
const present = values.filter(entry => entry != null);
|
|
15
55
|
const hasNull = present.length !== values.length;
|
|
@@ -81,13 +121,91 @@ const operators = (table, column, spec) => {
|
|
|
81
121
|
break;
|
|
82
122
|
}
|
|
83
123
|
case '$contains':
|
|
84
|
-
|
|
124
|
+
case '$contained':
|
|
125
|
+
case '$overlaps':
|
|
126
|
+
conditions.push(arrayOperator(table, column, operator, operand));
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
throw new UnsupportedArgumentError(`criteria-operator:${operator}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return conditions;
|
|
133
|
+
};
|
|
134
|
+
const escapeLike = (value) => value.replace(/[\\%_]/g, match => `\\${match}`);
|
|
135
|
+
const pathTarget = (table, column, path) => {
|
|
136
|
+
const value = sql `(${columnRef(table, column)} #> ${param(path)}::text[])`;
|
|
137
|
+
return {
|
|
138
|
+
value,
|
|
139
|
+
text: sql `(${columnRef(table, column)} #>> ${param(path)}::text[])`,
|
|
140
|
+
missing: sql `(${value} IS NULL OR ${value} = 'null'::jsonb)`,
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
/** `$in` / `$nin` / a bare list at a path — the column rules: a `null` entry widens to absence. */
|
|
144
|
+
const pathList = (target, values, negate) => {
|
|
145
|
+
const present = values.filter(entry => entry != null);
|
|
146
|
+
const hasNull = present.length !== values.length;
|
|
147
|
+
if (present.length < 1) {
|
|
148
|
+
return hasNull
|
|
149
|
+
? negate ? sql `NOT ${target.missing}` : target.missing
|
|
150
|
+
: negate ? sql `TRUE` : sql `FALSE`;
|
|
151
|
+
}
|
|
152
|
+
const membership = sql `${target.value} = ANY(${jsonList(present)})`;
|
|
153
|
+
if (negate) {
|
|
154
|
+
return sql `(NOT ${target.missing} AND NOT (${membership}))`;
|
|
155
|
+
}
|
|
156
|
+
return hasNull ? sql `(${membership} OR ${target.missing})` : membership;
|
|
157
|
+
};
|
|
158
|
+
/** The operators at a path, each read as the same operator reads on a column. */
|
|
159
|
+
const pathOperators = (target, spec, key) => {
|
|
160
|
+
const conditions = [];
|
|
161
|
+
for (const [operator, operand] of Object.entries(spec)) {
|
|
162
|
+
if (operator in COMPARISON) {
|
|
163
|
+
conditions.push(operand == null
|
|
164
|
+
? operator === '$ne' ? sql `NOT ${target.missing}` : target.missing
|
|
165
|
+
: sql `${target.value} ${sql.raw(COMPARISON[operator])} ${json(operand)}`);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
switch (operator) {
|
|
169
|
+
case '$in':
|
|
170
|
+
case '$nin':
|
|
171
|
+
conditions.push(pathList(target, listOf(operand), operator === '$nin'));
|
|
172
|
+
break;
|
|
173
|
+
case '$exists':
|
|
174
|
+
conditions.push(operand === false ? target.missing : sql `NOT ${target.missing}`);
|
|
175
|
+
break;
|
|
176
|
+
case '$null':
|
|
177
|
+
conditions.push(operand === false ? sql `NOT ${target.missing}` : target.missing);
|
|
178
|
+
break;
|
|
179
|
+
case '$like':
|
|
180
|
+
conditions.push(sql `${target.text} LIKE ${operand}`);
|
|
181
|
+
break;
|
|
182
|
+
case '$ilike':
|
|
183
|
+
conditions.push(sql `${target.text} ILIKE ${operand}`);
|
|
184
|
+
break;
|
|
185
|
+
case '$regex':
|
|
186
|
+
conditions.push(sql `${target.text} ~ ${operand}`);
|
|
187
|
+
break;
|
|
188
|
+
case '$startsWith':
|
|
189
|
+
conditions.push(sql `${target.text} LIKE ${`${escapeLike(`${operand}`)}%`}`);
|
|
190
|
+
break;
|
|
191
|
+
case '$endsWith':
|
|
192
|
+
conditions.push(sql `${target.text} LIKE ${`%${escapeLike(`${operand}`)}`}`);
|
|
193
|
+
break;
|
|
194
|
+
case '$between': {
|
|
195
|
+
if (!Array.isArray(operand) || operand.length !== 2) {
|
|
196
|
+
throw new UnsupportedArgumentError(`criteria:$between:${key}`);
|
|
197
|
+
}
|
|
198
|
+
conditions.push(sql `${target.value} BETWEEN ${json(operand[0])} AND ${json(operand[1])}`);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case '$contains':
|
|
202
|
+
conditions.push(jsonContainment(target.value, '@>', operand));
|
|
85
203
|
break;
|
|
86
204
|
case '$contained':
|
|
87
|
-
conditions.push(
|
|
205
|
+
conditions.push(jsonContainment(target.value, '<@', operand));
|
|
88
206
|
break;
|
|
89
207
|
case '$overlaps':
|
|
90
|
-
conditions.push(
|
|
208
|
+
conditions.push(jsonOverlap(target.value, operand));
|
|
91
209
|
break;
|
|
92
210
|
default:
|
|
93
211
|
throw new UnsupportedArgumentError(`criteria-operator:${operator}`);
|
|
@@ -95,11 +213,35 @@ const operators = (table, column, spec) => {
|
|
|
95
213
|
}
|
|
96
214
|
return conditions;
|
|
97
215
|
};
|
|
98
|
-
|
|
216
|
+
/**
|
|
217
|
+
* A criteria value at a dotted path, with the meaning it has on a column: a bare value is typed
|
|
218
|
+
* JSON equality (a number is not its text), a bare list is membership, `null` is absence, an object
|
|
219
|
+
* of operators applies each, and a plain object is containment.
|
|
220
|
+
*/
|
|
221
|
+
const pathCondition = (target, raw, key) => {
|
|
222
|
+
if (raw === null) {
|
|
223
|
+
return [target.missing];
|
|
224
|
+
}
|
|
225
|
+
if (isOperatorSpec(raw)) {
|
|
226
|
+
return pathOperators(target, raw, key);
|
|
227
|
+
}
|
|
228
|
+
if (Array.isArray(raw)) {
|
|
229
|
+
return [pathList(target, raw, false)];
|
|
230
|
+
}
|
|
231
|
+
if (isPlainObject(raw)) {
|
|
232
|
+
return [jsonContainment(target.value, '@>', raw)];
|
|
233
|
+
}
|
|
234
|
+
return [sql `${target.value} = ${json(raw)}`];
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* An object naming at least one `$` key is a spec, not a value to compare against.
|
|
238
|
+
* A Date and an array are values even though both are objects.
|
|
239
|
+
*/
|
|
99
240
|
const isOperatorSpec = (value) => value != null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)
|
|
100
241
|
&& Object.keys(value).some(key => key.startsWith('$'));
|
|
101
242
|
/**
|
|
102
|
-
* Translate
|
|
243
|
+
* Translate a {@link Criteria} into a WHERE clause. `undefined` means "no constraint at
|
|
244
|
+
* all" — the caller decides whether that is a full scan or a refusal.
|
|
103
245
|
*
|
|
104
246
|
* An unknown key raises rather than being skipped: a typo silently widening a query to
|
|
105
247
|
* the whole table is the failure mode worth being loud about.
|
|
@@ -145,7 +287,7 @@ const build = (criteria, spec, table) => {
|
|
|
145
287
|
if (!column.jsonb) {
|
|
146
288
|
throw new UnsupportedArgumentError(`criteria-path:${key}`);
|
|
147
289
|
}
|
|
148
|
-
conditions.push(
|
|
290
|
+
conditions.push(...pathCondition(pathTarget(table, column, path), raw, key));
|
|
149
291
|
continue;
|
|
150
292
|
}
|
|
151
293
|
if (raw === null) {
|
|
@@ -173,21 +315,24 @@ const build = (criteria, spec, table) => {
|
|
|
173
315
|
return conditions;
|
|
174
316
|
};
|
|
175
317
|
/**
|
|
176
|
-
* Translate
|
|
177
|
-
* `
|
|
318
|
+
* Translate a {@link Sort} list into ORDER BY. A bare field name is ascending;
|
|
319
|
+
* `{ field, order: 'desc' }` reverses it — the same meaning every backend gives it.
|
|
178
320
|
*
|
|
179
321
|
* The primary key is always appended as a tiebreak. Postgres has no implicit row order, so
|
|
180
322
|
* paginating on a non-unique sort key silently duplicates and skips rows between pages —
|
|
181
323
|
* a difference from mongo that would otherwise surface as a data bug rather than an error.
|
|
182
324
|
*
|
|
325
|
+
* A dotted path is a column this table does not have: criteria can reach into jsonb, ORDER BY
|
|
326
|
+
* cannot, and refusing is better than ordering by something the caller did not name.
|
|
327
|
+
*
|
|
183
328
|
* @throws {UnsupportedArgumentError}
|
|
184
329
|
*/
|
|
185
330
|
export const sortToSql = (sort, spec, table) => {
|
|
186
331
|
const order = [];
|
|
187
332
|
const seen = [];
|
|
188
333
|
for (const entry of sort ?? []) {
|
|
189
|
-
|
|
190
|
-
const
|
|
334
|
+
const property = typeof entry === 'string' ? entry : entry.field;
|
|
335
|
+
const descending = typeof entry !== 'string' && entry.order === 'desc';
|
|
191
336
|
const column = spec.byProperty[property];
|
|
192
337
|
if (column == null) {
|
|
193
338
|
throw new UnsupportedArgumentError(`sort:${property}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criteria.js","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"criteria.js","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"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"}
|
package/build/utils/diff.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import type { BasicContext } from '@owlmeans/context';
|
|
2
2
|
import type { DdlPlan, DdlStatement, LiveTable, TableSpec } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The form an index or constraint definition is compared in, so the statement this package emits
|
|
5
|
+
* and the text Postgres reports for the object it created compare equal.
|
|
6
|
+
*
|
|
7
|
+
* Postgres deparses what it stores: it leaves an identifier unquoted when it can, casts every
|
|
8
|
+
* literal (`''::text`), casts a `varchar` column inside an expression, wraps a partial predicate and
|
|
9
|
+
* each of its operator expressions in parentheses, and rewrites `x IN (…)` as `x = ANY (ARRAY[…])`.
|
|
10
|
+
* Comparing the raw texts made every boot drop and recreate every declared index and every enum
|
|
11
|
+
* `CHECK`. So both sides lose case, quotes, casts, whitespace and parentheses, and `= ANY (ARRAY[…])`
|
|
12
|
+
* reads as `IN (…)`. What that cannot tell apart — two definitions differing only in how their
|
|
13
|
+
* operators group — is a change to make under a new name.
|
|
14
|
+
*/
|
|
15
|
+
export declare const canonicalDefinition: (definition: string) => string;
|
|
3
16
|
/**
|
|
4
17
|
* Foreign keys are planned separately from the rest of the table, and applied only once
|
|
5
18
|
* every resource has initialized: a key points at a table another resource owns, and that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,OAAO,KAAK,EACE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAiC,SAAS,EACvF,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,OAAO,KAAK,EACE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAiC,SAAS,EACvF,MAAM,aAAa,CAAA;AAoCpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,eAAgB,MAAM,KAAG,MAKb,CAAA;AAyB5C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,SACpB,SAAS,YAAY,YAAY,CAAC,GAAG,CAAC,KAC3C,YAAY,EAwCb,CAAA;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ,SACb,SAAS,QAAQ,SAAS,aAAY,OAAO,KAClD,OAqPF,CAAA"}
|
package/build/utils/diff.js
CHANGED
|
@@ -17,17 +17,41 @@ const defaultExpression = (column) => {
|
|
|
17
17
|
return literal(column.defaultLiteral);
|
|
18
18
|
return undefined;
|
|
19
19
|
};
|
|
20
|
+
/** A type cast as `pg_get_expr` / `pg_get_indexdef` print one: `::text`, `::character varying(64)[]`. */
|
|
21
|
+
const CAST = /::(?:character varying|double precision|bit varying|timestamp with(?:out)? time zone|time with(?:out)? time zone|[a-z_][a-z0-9_]*)(?:\(\d+(?:\s*,\s*\d+)?\))?(?:\[\])?/g;
|
|
20
22
|
/**
|
|
21
|
-
* Postgres echoes defaults back with
|
|
22
|
-
*
|
|
23
|
-
*
|
|
23
|
+
* Postgres echoes defaults back with explicit casts — a declared `'active'` comes back as
|
|
24
|
+
* `'active'::text`. Compare without them, so an unchanged default doesn't look like drift on
|
|
25
|
+
* every boot.
|
|
24
26
|
*/
|
|
25
27
|
const normalizeDefault = (expression) => {
|
|
26
28
|
if (expression == null)
|
|
27
29
|
return null;
|
|
28
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Casts anywhere (a `varchar` id's `gen_random_uuid()::text` is stored as
|
|
32
|
+
* `(gen_random_uuid())::character varying`) and the parentheses Postgres adds around them.
|
|
33
|
+
*/
|
|
34
|
+
return expression.toLowerCase().replace(CAST, '').replace(/[()]/g, '').replace(/\s+/g, ' ').trim();
|
|
29
35
|
};
|
|
30
|
-
|
|
36
|
+
/**
|
|
37
|
+
* The form an index or constraint definition is compared in, so the statement this package emits
|
|
38
|
+
* and the text Postgres reports for the object it created compare equal.
|
|
39
|
+
*
|
|
40
|
+
* Postgres deparses what it stores: it leaves an identifier unquoted when it can, casts every
|
|
41
|
+
* literal (`''::text`), casts a `varchar` column inside an expression, wraps a partial predicate and
|
|
42
|
+
* each of its operator expressions in parentheses, and rewrites `x IN (…)` as `x = ANY (ARRAY[…])`.
|
|
43
|
+
* Comparing the raw texts made every boot drop and recreate every declared index and every enum
|
|
44
|
+
* `CHECK`. So both sides lose case, quotes, casts, whitespace and parentheses, and `= ANY (ARRAY[…])`
|
|
45
|
+
* reads as `IN (…)`. What that cannot tell apart — two definitions differing only in how their
|
|
46
|
+
* operators group — is a change to make under a new name.
|
|
47
|
+
*/
|
|
48
|
+
export const canonicalDefinition = (definition) => definition
|
|
49
|
+
.toLowerCase()
|
|
50
|
+
.replace(/"/g, '')
|
|
51
|
+
.replace(CAST, '')
|
|
52
|
+
.replace(/[\s()]/g, '')
|
|
53
|
+
.replace(/=anyarray\[([^\]]*)\]/g, 'in$1');
|
|
54
|
+
const normalizeDefinition = canonicalDefinition;
|
|
31
55
|
const columnList = (columns) => columns.map(quoteIdent).join(', ');
|
|
32
56
|
const indexStatement = (spec, entry) => {
|
|
33
57
|
const target = entry.expression != null
|
|
@@ -168,7 +192,31 @@ export const planSync = (spec, live, additive = false) => {
|
|
|
168
192
|
if (existing == null) {
|
|
169
193
|
continue;
|
|
170
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* A retype drops the column's default first.
|
|
197
|
+
*
|
|
198
|
+
* Postgres refuses `ALTER COLUMN … TYPE` outright when the column carries a DEFAULT it cannot
|
|
199
|
+
* cast to the new type — `42804 default for column "x" cannot be cast automatically` — and it
|
|
200
|
+
* refuses it before looking at a single row, so the `USING` clause never gets a chance to
|
|
201
|
+
* help. The whole plan runs in one transaction, so that refusal aborts the entire
|
|
202
|
+
* reconciliation: the table keeps its old shape and the resource fails every boot with an
|
|
203
|
+
* error about a column it is trying to fix. The standard remedy is to take the default out of
|
|
204
|
+
* the way, retype, and put it back — which is what the default-drift block below does, from
|
|
205
|
+
* the spec rather than from whatever the column happened to be carrying.
|
|
206
|
+
*
|
|
207
|
+
* The `id` column is the one that meets this in practice: it is created with a
|
|
208
|
+
* `gen_random_uuid()::text` default, so any change to its declared type hits this path.
|
|
209
|
+
*/
|
|
210
|
+
let defaultDropped = false;
|
|
171
211
|
if (!additive && existing.type !== column.sqlType) {
|
|
212
|
+
if (existing.defaultExpr != null) {
|
|
213
|
+
statements.push({
|
|
214
|
+
kind: 'set-default',
|
|
215
|
+
target: column.column,
|
|
216
|
+
sql: `ALTER TABLE ${spec.qualified} ALTER COLUMN ${quoteIdent(column.column)} DROP DEFAULT`
|
|
217
|
+
});
|
|
218
|
+
defaultDropped = true;
|
|
219
|
+
}
|
|
172
220
|
const using = column.using ?? `${quoteIdent(column.column)}::${column.sqlType}`;
|
|
173
221
|
statements.push({
|
|
174
222
|
kind: 'alter-type',
|
|
@@ -178,7 +226,13 @@ export const planSync = (spec, live, additive = false) => {
|
|
|
178
226
|
});
|
|
179
227
|
}
|
|
180
228
|
const expression = defaultExpression(column);
|
|
181
|
-
|
|
229
|
+
// Once the retype has dropped it, the default has to be re-stated even when it matches what
|
|
230
|
+
// the column used to carry: the comparison is against the pre-plan introspection, which stops
|
|
231
|
+
// describing the column the moment the plan drops its default.
|
|
232
|
+
const defaultDrifted = defaultDropped
|
|
233
|
+
? expression != null
|
|
234
|
+
: normalizeDefault(expression) !== normalizeDefault(existing.defaultExpr);
|
|
235
|
+
if (defaultDrifted) {
|
|
182
236
|
statements.push(expression != null
|
|
183
237
|
? {
|
|
184
238
|
kind: 'set-default',
|