@owlmeans/postgres-resource 0.1.15
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 +219 -0
- package/agent-meta/instructions/postgres-resource.instructions.md +60 -0
- package/agent-meta/manifest.json +23 -0
- package/agent-meta/skills/postgres-resource/SKILL.md +186 -0
- package/build/consts.d.ts +81 -0
- package/build/consts.d.ts.map +1 -0
- package/build/consts.js +86 -0
- package/build/consts.js.map +1 -0
- package/build/declarations.d.ts +12 -0
- package/build/declarations.d.ts.map +1 -0
- package/build/declarations.js +28 -0
- package/build/declarations.js.map +1 -0
- package/build/errors.d.ts +70 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +201 -0
- package/build/errors.js.map +1 -0
- package/build/helper.d.ts +4 -0
- package/build/helper.d.ts.map +1 -0
- package/build/helper.js +5 -0
- package/build/helper.js.map +1 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +7 -0
- package/build/index.js.map +1 -0
- package/build/resource.d.ts +4 -0
- package/build/resource.d.ts.map +1 -0
- package/build/resource.js +395 -0
- package/build/resource.js.map +1 -0
- package/build/types.d.ts +273 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/utils/criteria.d.ts +24 -0
- package/build/utils/criteria.d.ts.map +1 -0
- package/build/utils/criteria.js +209 -0
- package/build/utils/criteria.js.map +1 -0
- package/build/utils/diff.d.ts +24 -0
- package/build/utils/diff.d.ts.map +1 -0
- package/build/utils/diff.js +330 -0
- package/build/utils/diff.js.map +1 -0
- package/build/utils/index.d.ts +12 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +12 -0
- package/build/utils/index.js.map +1 -0
- package/build/utils/introspect.d.ts +7 -0
- package/build/utils/introspect.d.ts.map +1 -0
- package/build/utils/introspect.js +70 -0
- package/build/utils/introspect.js.map +1 -0
- package/build/utils/life-cycle.d.ts +39 -0
- package/build/utils/life-cycle.d.ts.map +1 -0
- package/build/utils/life-cycle.js +119 -0
- package/build/utils/life-cycle.js.map +1 -0
- package/build/utils/marshal.d.ts +36 -0
- package/build/utils/marshal.d.ts.map +1 -0
- package/build/utils/marshal.js +152 -0
- package/build/utils/marshal.js.map +1 -0
- package/build/utils/migrations.d.ts +16 -0
- package/build/utils/migrations.d.ts.map +1 -0
- package/build/utils/migrations.js +108 -0
- package/build/utils/migrations.js.map +1 -0
- package/build/utils/name.d.ts +39 -0
- package/build/utils/name.d.ts.map +1 -0
- package/build/utils/name.js +63 -0
- package/build/utils/name.js.map +1 -0
- package/build/utils/schema.d.ts +28 -0
- package/build/utils/schema.d.ts.map +1 -0
- package/build/utils/schema.js +356 -0
- package/build/utils/schema.js.map +1 -0
- package/build/utils/sql.d.ts +22 -0
- package/build/utils/sql.d.ts.map +1 -0
- package/build/utils/sql.js +0 -0
- package/build/utils/sql.js.map +1 -0
- package/build/utils/sync.d.ts +21 -0
- package/build/utils/sync.d.ts.map +1 -0
- package/build/utils/sync.js +93 -0
- package/build/utils/sync.js.map +1 -0
- package/build/utils/table.d.ts +8 -0
- package/build/utils/table.d.ts.map +1 -0
- package/build/utils/table.js +68 -0
- package/build/utils/table.js.map +1 -0
- package/package.json +50 -0
- package/src/consts.ts +95 -0
- package/src/declarations.ts +41 -0
- package/src/errors.ts +242 -0
- package/src/helper.ts +7 -0
- package/src/index.ts +7 -0
- package/src/resource.ts +524 -0
- package/src/types.ts +310 -0
- package/src/utils/criteria.ts +246 -0
- package/src/utils/diff.ts +363 -0
- package/src/utils/index.ts +11 -0
- package/src/utils/introspect.ts +87 -0
- package/src/utils/life-cycle.ts +155 -0
- package/src/utils/marshal.ts +175 -0
- package/src/utils/migrations.ts +135 -0
- package/src/utils/name.ts +79 -0
- package/src/utils/schema.ts +426 -0
- package/src/utils/sql.ts +0 -0
- package/src/utils/sync.ts +106 -0
- package/src/utils/table.ts +76 -0
- package/tests/errors.spec.ts +121 -0
- package/tests/name.spec.ts +75 -0
- package/tests/schema.spec.ts +258 -0
- package/tests/sql.spec.ts +104 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { appendContextual, assertContext } from '@owlmeans/context';
|
|
2
|
+
import { MisshapedRecord, RecordExists, RecordUpdateFailed, UnknownRecordError, UnsupportedArgumentError, prepareListOptions } from '@owlmeans/resource';
|
|
3
|
+
import { eq, sql } from 'drizzle-orm';
|
|
4
|
+
import { DEFAULT_DB_ALIAS, DEFAULT_PAGE_SIZE, ID_FIELD } from './consts.js';
|
|
5
|
+
import { getDeclaration } from './declarations.js';
|
|
6
|
+
import { pgErrorToResourceError } from './errors.js';
|
|
7
|
+
import { getSchemaSecureFeilds } from './helper.js';
|
|
8
|
+
import { criteriaToSql, sortToSql } from './utils/criteria.js';
|
|
9
|
+
import { initializeTable } from './utils/life-cycle.js';
|
|
10
|
+
import { recordToFullValues, recordToValues, resultToRecord, rowToRecord } from './utils/marshal.js';
|
|
11
|
+
import { makeTx } from './utils/migrations.js';
|
|
12
|
+
import { refOf, resolvePlaceholders } from './utils/sql.js';
|
|
13
|
+
const fieldOf = (opts) => typeof opts === 'string' ? opts : opts?.field;
|
|
14
|
+
const ttlOf = (opts) => typeof opts === 'object' ? opts.ttl : undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Hand a runtime built table to Drizzle's query builder.
|
|
17
|
+
*
|
|
18
|
+
* {@link PgRuntimeTable} is deliberately untyped — the table is compiled from a JSON schema
|
|
19
|
+
* at runtime, so there is no static shape to infer. Naming the erased `PgTable` here is what
|
|
20
|
+
* keeps the builder's *result* types usable; casting the argument to `never` instead would
|
|
21
|
+
* silently collapse every returned row to `never`.
|
|
22
|
+
*/
|
|
23
|
+
const pgTable = (table) => table;
|
|
24
|
+
export const makePostgresResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlias = DEFAULT_DB_ALIAS, makeCustomResource, tableName) => {
|
|
25
|
+
const location = `postgres-resource:${alias}`;
|
|
26
|
+
const declaration = getDeclaration(alias);
|
|
27
|
+
/** Set by `init()`; every data method goes through `ensure()`, which guarantees them. */
|
|
28
|
+
let spec;
|
|
29
|
+
let entity;
|
|
30
|
+
let initializing;
|
|
31
|
+
const service = () => {
|
|
32
|
+
const context = assertContext(resource.ctx, location);
|
|
33
|
+
return context.service(serviceAlias ?? dbAlias);
|
|
34
|
+
};
|
|
35
|
+
const handle = async () => {
|
|
36
|
+
const postgres = service();
|
|
37
|
+
await postgres.ready();
|
|
38
|
+
return postgres.db(dbAlias);
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Resources are normally initialized by the context, but a resource registered after
|
|
42
|
+
* `init()` — or reached from a spec that never ran one — would otherwise fail with an
|
|
43
|
+
* opaque "undefined table". Initializing on demand, once, keeps both paths working.
|
|
44
|
+
*/
|
|
45
|
+
const ensure = async () => {
|
|
46
|
+
const db = await handle();
|
|
47
|
+
if (spec == null || entity == null) {
|
|
48
|
+
initializing = initializing ?? resource.init();
|
|
49
|
+
await initializing;
|
|
50
|
+
}
|
|
51
|
+
if (spec == null || entity == null) {
|
|
52
|
+
throw new SyntaxError(`Postgres resource not initialized: ${alias}`);
|
|
53
|
+
}
|
|
54
|
+
return { db, spec, entity };
|
|
55
|
+
};
|
|
56
|
+
const columnOf = (table, property) => {
|
|
57
|
+
const column = table.byProperty[property];
|
|
58
|
+
if (column == null) {
|
|
59
|
+
throw new UnsupportedArgumentError(`field:${property}`);
|
|
60
|
+
}
|
|
61
|
+
return column;
|
|
62
|
+
};
|
|
63
|
+
const identify = (table, property, value) => {
|
|
64
|
+
const column = columnOf(table, property);
|
|
65
|
+
return eq(entity[column.property], value);
|
|
66
|
+
};
|
|
67
|
+
const raw = async (text, params) => {
|
|
68
|
+
const { db, spec: table } = await ensure();
|
|
69
|
+
const context = assertContext(resource.ctx, location);
|
|
70
|
+
try {
|
|
71
|
+
const result = await db.pool.query(resolvePlaceholders(text, context, table), params);
|
|
72
|
+
return { rows: result.rows, count: result.rowCount ?? 0 };
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw pgErrorToResourceError(error);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const resource = appendContextual(alias, {
|
|
79
|
+
get: async (id, field, opts) => {
|
|
80
|
+
const record = await resource.load(id, field, opts);
|
|
81
|
+
if (record == null) {
|
|
82
|
+
throw new UnknownRecordError(id);
|
|
83
|
+
}
|
|
84
|
+
return record;
|
|
85
|
+
},
|
|
86
|
+
load: async (id, field, opts) => {
|
|
87
|
+
if (typeof field === 'object') {
|
|
88
|
+
opts = field;
|
|
89
|
+
field = field.field;
|
|
90
|
+
}
|
|
91
|
+
if (ttlOf(opts) != null) {
|
|
92
|
+
/** Postgres has no row expiry — silently ignoring a TTL would lose data. */
|
|
93
|
+
throw new UnsupportedArgumentError('ttl');
|
|
94
|
+
}
|
|
95
|
+
const { db, spec: table, entity: from } = await ensure();
|
|
96
|
+
const rows = await db.drizzle.select().from(pgTable(from))
|
|
97
|
+
.where(identify(table, field ?? ID_FIELD, id)).limit(1);
|
|
98
|
+
return rows.length < 1 ? null : resultToRecord(rows[0], table);
|
|
99
|
+
},
|
|
100
|
+
list: async (criteria, opts) => {
|
|
101
|
+
const { db, spec: table, entity: from } = await ensure();
|
|
102
|
+
const options = prepareListOptions(DEFAULT_PAGE_SIZE, criteria, opts);
|
|
103
|
+
const pager = options.pager ?? {};
|
|
104
|
+
const size = pager.size ?? DEFAULT_PAGE_SIZE;
|
|
105
|
+
const where = criteriaToSql(options.criteria, table, from);
|
|
106
|
+
const totals = await db.drizzle
|
|
107
|
+
.select({ total: sql `count(*)::int` }).from(pgTable(from)).where(where);
|
|
108
|
+
const total = Number(totals[0]?.total ?? 0);
|
|
109
|
+
pager.total = total;
|
|
110
|
+
const skip = (pager.page ?? 0) * size;
|
|
111
|
+
if (total === 0 || skip >= total) {
|
|
112
|
+
return { items: [], pager };
|
|
113
|
+
}
|
|
114
|
+
const rows = await db.drizzle.select().from(pgTable(from)).where(where)
|
|
115
|
+
.orderBy(...sortToSql(pager.sort, table, from)).limit(size).offset(skip);
|
|
116
|
+
return { pager, items: rows.map(row => resultToRecord(row, table)) };
|
|
117
|
+
},
|
|
118
|
+
save: async (record, opts) => {
|
|
119
|
+
const field = fieldOf(opts);
|
|
120
|
+
const present = field != null
|
|
121
|
+
? record[field] != null
|
|
122
|
+
: record.id != null;
|
|
123
|
+
return present
|
|
124
|
+
? resource.update(record, opts)
|
|
125
|
+
: resource.create(record, typeof opts !== 'string' ? opts : undefined);
|
|
126
|
+
},
|
|
127
|
+
create: async (record, opts) => {
|
|
128
|
+
if (ID_FIELD in record && record.id == null) {
|
|
129
|
+
delete record.id;
|
|
130
|
+
}
|
|
131
|
+
if (record.id != null) {
|
|
132
|
+
throw new RecordExists('id-present');
|
|
133
|
+
}
|
|
134
|
+
if (opts?.ttl != null) {
|
|
135
|
+
throw new UnsupportedArgumentError('ttl');
|
|
136
|
+
}
|
|
137
|
+
return resource.insert(record);
|
|
138
|
+
},
|
|
139
|
+
insert: async (record) => {
|
|
140
|
+
const { db, spec: table, entity: into } = await ensure();
|
|
141
|
+
const values = recordToValues({ ...resource.getDefaults(), ...record }, table);
|
|
142
|
+
try {
|
|
143
|
+
const rows = await db.drizzle.insert(pgTable(into)).values(values).returning();
|
|
144
|
+
if (rows.length < 1) {
|
|
145
|
+
throw new RecordUpdateFailed('creation');
|
|
146
|
+
}
|
|
147
|
+
return resultToRecord(rows[0], table);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
throw pgErrorToResourceError(error);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
upsert: async (record, conflict) => {
|
|
154
|
+
const { db, spec: table, entity: into } = await ensure();
|
|
155
|
+
const values = recordToValues({ ...resource.getDefaults(), ...record }, table);
|
|
156
|
+
/** `conflict` names properties; the primary key is the default arbiter. */
|
|
157
|
+
const properties = conflict ?? table.primaryKey
|
|
158
|
+
.map(column => table.byColumn[column]?.property)
|
|
159
|
+
.filter((property) => property != null);
|
|
160
|
+
const target = properties.map(property => into[columnOf(table, property).property]);
|
|
161
|
+
if (target.length < 1) {
|
|
162
|
+
throw new UnsupportedArgumentError('upsert:no-conflict-target');
|
|
163
|
+
}
|
|
164
|
+
/** The arbiter columns identify the row — updating them to themselves is noise. */
|
|
165
|
+
const set = { ...values };
|
|
166
|
+
for (const property of properties) {
|
|
167
|
+
delete set[property];
|
|
168
|
+
}
|
|
169
|
+
if (Object.keys(set).length < 1) {
|
|
170
|
+
throw new UnsupportedArgumentError('upsert:nothing-to-update');
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
const rows = await db.drizzle.insert(pgTable(into)).values(values)
|
|
174
|
+
.onConflictDoUpdate({ target: target, set: set }).returning();
|
|
175
|
+
if (rows.length < 1) {
|
|
176
|
+
throw new RecordUpdateFailed('upsert');
|
|
177
|
+
}
|
|
178
|
+
return resultToRecord(rows[0], table);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
throw pgErrorToResourceError(error);
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
update: async (record, opts) => {
|
|
185
|
+
const { db, spec: table, entity: target } = await ensure();
|
|
186
|
+
const field = fieldOf(opts) ?? ID_FIELD;
|
|
187
|
+
const key = record[field];
|
|
188
|
+
if (key == null) {
|
|
189
|
+
throw new MisshapedRecord(field === ID_FIELD ? ID_FIELD : 'no-field-value');
|
|
190
|
+
}
|
|
191
|
+
/** Replace, not merge — the semantics mongo's `replaceOne` gives. `patch()` merges. */
|
|
192
|
+
const values = recordToFullValues(record, table);
|
|
193
|
+
try {
|
|
194
|
+
const rows = await db.drizzle.update(pgTable(target)).set(values)
|
|
195
|
+
.where(identify(table, field, key)).returning();
|
|
196
|
+
if (rows.length < 1) {
|
|
197
|
+
throw new UnknownRecordError(`${field}:${key}`);
|
|
198
|
+
}
|
|
199
|
+
return resultToRecord(rows[0], table);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
throw pgErrorToResourceError(error);
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
patch: async (record, opts) => {
|
|
206
|
+
const { db, spec: table, entity: target } = await ensure();
|
|
207
|
+
const field = (typeof opts === 'string' ? opts : opts?.field) ?? ID_FIELD;
|
|
208
|
+
const key = record[field];
|
|
209
|
+
if (key == null) {
|
|
210
|
+
throw new MisshapedRecord(field === ID_FIELD ? ID_FIELD : 'no-field-value');
|
|
211
|
+
}
|
|
212
|
+
const values = recordToValues(record, table);
|
|
213
|
+
for (const column of table.primaryKey) {
|
|
214
|
+
delete values[table.byColumn[column]?.property ?? column];
|
|
215
|
+
}
|
|
216
|
+
if (Object.keys(values).length < 1) {
|
|
217
|
+
return resource.get(`${key}`, field);
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const rows = await db.drizzle.update(pgTable(target)).set(values)
|
|
221
|
+
.where(identify(table, field, key)).returning();
|
|
222
|
+
if (rows.length < 1) {
|
|
223
|
+
throw new UnknownRecordError(`${field}:${key}`);
|
|
224
|
+
}
|
|
225
|
+
return resultToRecord(rows[0], table);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw pgErrorToResourceError(error);
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
delete: async (id, opts) => {
|
|
232
|
+
const { db, spec: table, entity: from } = await ensure();
|
|
233
|
+
const field = fieldOf(opts) ?? ID_FIELD;
|
|
234
|
+
const key = typeof id === 'object' ? id[field] : id;
|
|
235
|
+
if (key == null) {
|
|
236
|
+
throw new MisshapedRecord(field === ID_FIELD ? ID_FIELD : 'no-field-value');
|
|
237
|
+
}
|
|
238
|
+
/** One statement — mongo's read-then-delete can lose the record between the two. */
|
|
239
|
+
const rows = await db.drizzle.delete(pgTable(from))
|
|
240
|
+
.where(identify(table, field, key)).returning();
|
|
241
|
+
return rows.length < 1 ? null : resultToRecord(rows[0], table);
|
|
242
|
+
},
|
|
243
|
+
pick: async (id, opts) => {
|
|
244
|
+
const record = await resource.delete(id, opts);
|
|
245
|
+
if (record == null) {
|
|
246
|
+
throw new UnknownRecordError(typeof id === 'string' ? id : (id.id ?? 'unknown'));
|
|
247
|
+
}
|
|
248
|
+
return record;
|
|
249
|
+
},
|
|
250
|
+
purge: async (criteria) => {
|
|
251
|
+
const { db, spec: table, entity: from } = await ensure();
|
|
252
|
+
const where = criteriaToSql(criteria, table, from);
|
|
253
|
+
if (where == null) {
|
|
254
|
+
/** An empty criteria object here would silently truncate the table. */
|
|
255
|
+
throw new UnsupportedArgumentError('purge:no-criteria');
|
|
256
|
+
}
|
|
257
|
+
const rows = await db.drizzle.delete(pgTable(from)).where(where).returning();
|
|
258
|
+
return rows.length;
|
|
259
|
+
},
|
|
260
|
+
count: async (criteria) => {
|
|
261
|
+
const { db, spec: table, entity: from } = await ensure();
|
|
262
|
+
const options = prepareListOptions(DEFAULT_PAGE_SIZE, criteria);
|
|
263
|
+
const rows = await db.drizzle.select({ total: sql `count(*)::int` })
|
|
264
|
+
.from(pgTable(from)).where(criteriaToSql(options.criteria, table, from));
|
|
265
|
+
return Number(rows[0]?.total ?? 0);
|
|
266
|
+
},
|
|
267
|
+
getDefaults: () => {
|
|
268
|
+
const schema = resource.schema;
|
|
269
|
+
if (schema == null) {
|
|
270
|
+
return {};
|
|
271
|
+
}
|
|
272
|
+
return Object.entries(schema.properties ?? {}).reduce((defaults, [key, value]) => {
|
|
273
|
+
const property = value;
|
|
274
|
+
if (property.default === undefined) {
|
|
275
|
+
return defaults;
|
|
276
|
+
}
|
|
277
|
+
return { ...defaults, [key]: property.default };
|
|
278
|
+
}, {});
|
|
279
|
+
},
|
|
280
|
+
query: async (text, params) => (await raw(text, params)).rows,
|
|
281
|
+
queryOne: async (text, params) => (await raw(text, params)).rows[0] ?? null,
|
|
282
|
+
execute: async (text, params) => (await raw(text, params)).count,
|
|
283
|
+
select: async (text, params) => {
|
|
284
|
+
const { spec: table } = await ensure();
|
|
285
|
+
const result = await raw(text, params);
|
|
286
|
+
return result.rows.map(row => rowToRecord(row, table));
|
|
287
|
+
},
|
|
288
|
+
selectOne: async (text, params) => {
|
|
289
|
+
const { spec: table } = await ensure();
|
|
290
|
+
const result = await raw(text, params);
|
|
291
|
+
return result.rows.length < 1 ? null : rowToRecord(result.rows[0], table);
|
|
292
|
+
},
|
|
293
|
+
ref: resourceAlias => {
|
|
294
|
+
const context = assertContext(resource.ctx, location);
|
|
295
|
+
if (spec == null) {
|
|
296
|
+
throw new SyntaxError(`Postgres resource not initialized: ${alias}`);
|
|
297
|
+
}
|
|
298
|
+
return refOf(context, spec, resourceAlias);
|
|
299
|
+
},
|
|
300
|
+
transaction: async (fn) => {
|
|
301
|
+
const { db, spec: table } = await ensure();
|
|
302
|
+
const context = assertContext(resource.ctx, location);
|
|
303
|
+
const client = await db.pool.connect();
|
|
304
|
+
try {
|
|
305
|
+
await client.query('BEGIN');
|
|
306
|
+
const result = await fn(makeTx(client, text => resolvePlaceholders(text, context, table), resourceAlias => refOf(context, table, resourceAlias)));
|
|
307
|
+
await client.query('COMMIT');
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
312
|
+
throw pgErrorToResourceError(error);
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
client.release();
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
lock: async (record, fields) => {
|
|
319
|
+
fields ??= getSchemaSecureFeilds(resource.schema ?? {});
|
|
320
|
+
if (fields.length < 1) {
|
|
321
|
+
throw new SyntaxError(`No fields to lock: ${JSON.stringify(record)}`);
|
|
322
|
+
}
|
|
323
|
+
return service().lock(dbAlias, record, fields);
|
|
324
|
+
},
|
|
325
|
+
unlock: async (record, fields) => {
|
|
326
|
+
fields ??= getSchemaSecureFeilds(resource.schema ?? {});
|
|
327
|
+
if (fields.length < 1) {
|
|
328
|
+
throw new SyntaxError(`No fields to unlock: ${JSON.stringify(record)}`);
|
|
329
|
+
}
|
|
330
|
+
return service().unlock(dbAlias, record, fields);
|
|
331
|
+
},
|
|
332
|
+
db: async () => handle(),
|
|
333
|
+
client: async () => {
|
|
334
|
+
const postgres = service();
|
|
335
|
+
await postgres.ready();
|
|
336
|
+
return postgres.client(dbAlias);
|
|
337
|
+
},
|
|
338
|
+
index: (name, index) => {
|
|
339
|
+
declaration.indexes.push({ ...index, name });
|
|
340
|
+
return resource;
|
|
341
|
+
},
|
|
342
|
+
migration: (name, apply, stage) => {
|
|
343
|
+
declaration.migrations.register(name, apply, stage);
|
|
344
|
+
return resource;
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
/**
|
|
348
|
+
* The AJV schema is stored per alias rather than on the object, so it survives
|
|
349
|
+
* `reinitializeContext` — which rebuilds the resource and would otherwise drop a schema
|
|
350
|
+
* the app assigned after construction, silently taking the table's structure with it.
|
|
351
|
+
*/
|
|
352
|
+
Object.defineProperty(resource, 'schema', {
|
|
353
|
+
enumerable: true,
|
|
354
|
+
get: () => declaration.schema,
|
|
355
|
+
set: (schema) => { declaration.schema = schema; }
|
|
356
|
+
});
|
|
357
|
+
Object.defineProperty(resource, 'table', {
|
|
358
|
+
enumerable: true,
|
|
359
|
+
get: () => spec
|
|
360
|
+
});
|
|
361
|
+
Object.defineProperty(resource, 'entity', {
|
|
362
|
+
enumerable: true,
|
|
363
|
+
get: () => entity
|
|
364
|
+
});
|
|
365
|
+
Object.defineProperty(resource, 'migrations', {
|
|
366
|
+
enumerable: true,
|
|
367
|
+
get: () => declaration.migrations
|
|
368
|
+
});
|
|
369
|
+
/**
|
|
370
|
+
* Explicit table name override, decoupled from the registration alias — an alias may
|
|
371
|
+
* carry characters no identifier allows. Threaded back through the recursive maker call
|
|
372
|
+
* below so it survives a context switch.
|
|
373
|
+
*/
|
|
374
|
+
if (tableName != null) {
|
|
375
|
+
resource.name = tableName;
|
|
376
|
+
}
|
|
377
|
+
resource.init = async () => {
|
|
378
|
+
const context = assertContext(resource.ctx, location);
|
|
379
|
+
const postgres = service();
|
|
380
|
+
await postgres.ready();
|
|
381
|
+
const db = await postgres.db(dbAlias);
|
|
382
|
+
const config = postgres.config(dbAlias);
|
|
383
|
+
const initialized = await initializeTable(db, config, resource, context, task => postgres.defer(dbAlias, task));
|
|
384
|
+
spec = initialized.spec;
|
|
385
|
+
entity = initialized.entity;
|
|
386
|
+
};
|
|
387
|
+
resource.reinitializeContext = (context) => {
|
|
388
|
+
const replacement = (makeCustomResource?.(dbAlias, serviceAlias)
|
|
389
|
+
?? makePostgresResource(alias, dbAlias, serviceAlias, makeCustomResource, tableName));
|
|
390
|
+
replacement.ctx = context;
|
|
391
|
+
return replacement;
|
|
392
|
+
};
|
|
393
|
+
return resource;
|
|
394
|
+
};
|
|
395
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|