@coffer-org/server 1.1.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.
Files changed (61) hide show
  1. package/dist/collection-io.d.ts +20 -0
  2. package/dist/collection-io.d.ts.map +1 -0
  3. package/dist/collection-io.js +111 -0
  4. package/dist/collection-io.js.map +1 -0
  5. package/dist/db.d.ts +6 -0
  6. package/dist/db.d.ts.map +1 -0
  7. package/dist/db.js +45 -0
  8. package/dist/db.js.map +1 -0
  9. package/dist/entity-schema.d.ts +32 -0
  10. package/dist/entity-schema.d.ts.map +1 -0
  11. package/dist/entity-schema.js +147 -0
  12. package/dist/entity-schema.js.map +1 -0
  13. package/dist/extend-io.d.ts +8 -0
  14. package/dist/extend-io.d.ts.map +1 -0
  15. package/dist/extend-io.js +34 -0
  16. package/dist/extend-io.js.map +1 -0
  17. package/dist/extend-table.d.ts +6 -0
  18. package/dist/extend-table.d.ts.map +1 -0
  19. package/dist/extend-table.js +28 -0
  20. package/dist/extend-table.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +420 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/local-api.d.ts +6 -0
  26. package/dist/local-api.d.ts.map +1 -0
  27. package/dist/local-api.js +46 -0
  28. package/dist/local-api.js.map +1 -0
  29. package/dist/mutate.d.ts +22 -0
  30. package/dist/mutate.d.ts.map +1 -0
  31. package/dist/mutate.js +128 -0
  32. package/dist/mutate.js.map +1 -0
  33. package/dist/plugin-discovery.d.ts +36 -0
  34. package/dist/plugin-discovery.d.ts.map +1 -0
  35. package/dist/plugin-discovery.js +137 -0
  36. package/dist/plugin-discovery.js.map +1 -0
  37. package/dist/plugin-hooks.d.ts +35 -0
  38. package/dist/plugin-hooks.d.ts.map +1 -0
  39. package/dist/plugin-hooks.js +3 -0
  40. package/dist/plugin-hooks.js.map +1 -0
  41. package/dist/plugin-runtime.d.ts +36 -0
  42. package/dist/plugin-runtime.d.ts.map +1 -0
  43. package/dist/plugin-runtime.js +195 -0
  44. package/dist/plugin-runtime.js.map +1 -0
  45. package/dist/plugins-api.d.ts +3 -0
  46. package/dist/plugins-api.d.ts.map +1 -0
  47. package/dist/plugins-api.js +53 -0
  48. package/dist/plugins-api.js.map +1 -0
  49. package/dist/registry-context.d.ts +11 -0
  50. package/dist/registry-context.d.ts.map +1 -0
  51. package/dist/registry-context.js +13 -0
  52. package/dist/registry-context.js.map +1 -0
  53. package/dist/schema-sync.d.ts +2 -0
  54. package/dist/schema-sync.d.ts.map +1 -0
  55. package/dist/schema-sync.js +13 -0
  56. package/dist/schema-sync.js.map +1 -0
  57. package/dist/temporal.d.ts +21 -0
  58. package/dist/temporal.d.ts.map +1 -0
  59. package/dist/temporal.js +39 -0
  60. package/dist/temporal.js.map +1 -0
  61. package/package.json +34 -0
package/dist/index.js ADDED
@@ -0,0 +1,420 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createWriteStream, mkdirSync, existsSync } from 'node:fs';
3
+ import { pipeline } from 'node:stream/promises';
4
+ import { extname, join } from 'node:path';
5
+ import Fastify from 'fastify';
6
+ import cors from '@fastify/cors';
7
+ import multipart from '@fastify/multipart';
8
+ import fastifyStatic from '@fastify/static';
9
+ import { serialize } from '@mikro-orm/core';
10
+ import { moduleToClient, fieldMap, textSearchKeys, titleKey, recordTitle, buildZodObject } from '@coffer-org/sdk/module';
11
+ import { tokenize, matchScoreFolded, foldText } from '@coffer-org/core/search';
12
+ import { extendToClient } from '@coffer-org/sdk/extend';
13
+ import { extendEntityName, getExtendRecord } from './extend-table.js';
14
+ import { moduleTableName } from './entity-schema.js';
15
+ import { splitBody, saveExtends } from './extend-io.js';
16
+ import { getEm } from './db.js';
17
+ import { createRecord, getRecord, updateRecord, deleteRecord, ValidationError, NotFoundError } from './mutate.js';
18
+ import { decodeTemporal, dtStringToDate } from './temporal.js';
19
+ import { initPlugins, teardownPlugins, readDisabled, purgePluginData, getPluginSettings, getPlugins, } from './plugin-runtime.js';
20
+ import { registerPluginsApi } from './plugins-api.js';
21
+ // Завантажити app/.env (креденшели Telegram-бота тощо) ДО будь-чого, що читає env.
22
+ // Робить app незалежним від ~/.profile. Наявні env-змінні мають пріоритет.
23
+ const ENV_FILE = join(process.cwd(), '.env');
24
+ if (existsSync(ENV_FILE))
25
+ process.loadEnvFile(ENV_FILE);
26
+ const PORT = Number(process.env.PORT ?? 7023);
27
+ // initPlugins() сам ініціалізує ORM (двофазний bootstrap: системні таблиці →
28
+ // _plugins → discoverEntity активних плагінів → syncSchema).
29
+ // Життєвий цикл плагінів → АКТИВНИЙ реєстр (набір з БД _plugins).
30
+ const reg = await initPlugins();
31
+ const { vaults, modules, getModule, extends_, getExtendsFor } = reg;
32
+ // Мапи: vault/type → ім'я сутності MikroORM (== ім'я таблиці) + ModuleDef.
33
+ const entityNames = new Map();
34
+ const moduleDefs = new Map();
35
+ for (const m of modules) {
36
+ entityNames.set(`${m.vault}/${m.module}`, moduleTableName(m.vault, m.module));
37
+ moduleDefs.set(`${m.vault}/${m.module}`, m);
38
+ }
39
+ // Сховище медіа
40
+ const UPLOADS = process.env.UPLOADS ?? join(process.cwd(), 'data', 'uploads');
41
+ mkdirSync(UPLOADS, { recursive: true });
42
+ const app = Fastify({ logger: true });
43
+ await app.register(cors, { origin: true });
44
+ await app.register(multipart, { limits: { fileSize: 25 * 1024 * 1024 } });
45
+ await app.register(fastifyStatic, { root: UPLOADS, prefix: '/uploads/' });
46
+ // Завантаження файлу → повертає ім'я в /uploads
47
+ app.post('/api/upload', async (req, reply) => {
48
+ const data = await req.file();
49
+ if (!data)
50
+ return reply.code(400).send({ error: 'no_file' });
51
+ const ext = extname(data.filename).toLowerCase();
52
+ const name = `${randomUUID()}${ext}`;
53
+ await pipeline(data.file, createWriteStream(join(UPLOADS, name)));
54
+ return reply.send({ filename: name });
55
+ });
56
+ function key(vault, type) {
57
+ return `${vault}/${type}`;
58
+ }
59
+ // ─── Error helper ─────────────────────────────────────────────────────────────
60
+ async function guard(reply, fn) {
61
+ try {
62
+ return await fn();
63
+ }
64
+ catch (e) {
65
+ if (e instanceof ValidationError)
66
+ return reply.code(422).send({ error: 'validation', issues: e.issues });
67
+ if (e instanceof NotFoundError)
68
+ return reply.code(404).send({ error: 'not_found' });
69
+ app.log.error(e);
70
+ return reply.code(500).send({ error: 'internal' });
71
+ }
72
+ }
73
+ // ─── Helper: додати _extends до запису ────────────────────────────────────────
74
+ async function withExtends(record, vault, module) {
75
+ const matchedExtends = getExtendsFor(vault, module);
76
+ if (!matchedExtends.length)
77
+ return record;
78
+ const _extends = {};
79
+ await Promise.all(matchedExtends.map(async (e) => {
80
+ const data = await getExtendRecord(extendEntityName(e), String(record.id));
81
+ _extends[e.id] = data ?? null;
82
+ }));
83
+ return { ...record, _extends };
84
+ }
85
+ // ─── Vaults / schema ──────────────────────────────────────────────────────────
86
+ app.get('/api/vaults', () => vaults.map((v) => ({
87
+ ...v.meta,
88
+ modules: v.modules.map(moduleToClient),
89
+ extends: extends_.filter((e) => e.attachTo.some((r) => r.vault === v.meta.id)).map(extendToClient),
90
+ })));
91
+ // ─── Лічильники записів для Dashboard (усі standalone-модулі активних плагінів) ──
92
+ app.get('/api/counts', async () => {
93
+ const fork = getEm().fork();
94
+ const out = {};
95
+ for (const [k, mdef] of moduleDefs) {
96
+ if (mdef.standalone === false)
97
+ continue;
98
+ const ename = entityNames.get(k);
99
+ if (!ename)
100
+ continue;
101
+ out[k] = await fork.count(ename);
102
+ }
103
+ return out;
104
+ });
105
+ /**
106
+ * Матч запису модуля проти токенів пошуку — спільне для глобального та спискового
107
+ * пошуку. Заголовок (titleKey) важить більше за інші текстові поля. Повертає
108
+ * score + сниппет (перше «інше» поле з токеном, інакше заголовок), або null якщо
109
+ * не матч. Поля згортаються один раз і перевикористовуються (score + сниппет).
110
+ */
111
+ function rowMatch(mdef, row, tokens) {
112
+ const textKeys = textSearchKeys(mdef);
113
+ if (!textKeys.length)
114
+ return null;
115
+ const tk = titleKey(mdef);
116
+ const otherKeys = textKeys.filter((key) => key !== tk);
117
+ const label = recordTitle(mdef, row);
118
+ const otherRaw = otherKeys.map((key) => String(row[key] ?? ''));
119
+ const foldedOthers = otherRaw.map(foldText);
120
+ const score = matchScoreFolded(foldText(label), foldedOthers, tokens);
121
+ if (score === null)
122
+ return null;
123
+ const hitIdx = foldedOthers.findIndex((f) => tokens.some((t) => f.includes(t)));
124
+ const raw = (hitIdx >= 0 ? otherRaw[hitIdx] : label) ?? label;
125
+ const snippet = raw.length > 120 ? raw.slice(0, 120) + '…' : raw;
126
+ return { score, snippet };
127
+ }
128
+ // ─── Глобальний пошук ─────────────────────────────────────────────────────────
129
+ app.get('/api/search', async (req) => {
130
+ const { q = '', limit = '20' } = req.query;
131
+ const tokens = tokenize(q);
132
+ if (tokens.length === 0 || q.trim().length < 2)
133
+ return [];
134
+ const lim = Math.min(Number(limit) || 20, 100);
135
+ const fork = getEm().fork();
136
+ const scored = [];
137
+ for (const [k, mdef] of moduleDefs) {
138
+ if (mdef.standalone === false)
139
+ continue;
140
+ const ename = entityNames.get(k);
141
+ if (!ename)
142
+ continue;
143
+ if (!textSearchKeys(mdef).length)
144
+ continue;
145
+ const [vault, type] = k.split('/');
146
+ // Cap на модуль — захист від великих таблиць (персональний масштаб).
147
+ const rows = (await fork.find(ename, {}, { limit: 1000 })).map((r) => serialize(r));
148
+ for (const row of rows) {
149
+ const m = rowMatch(mdef, row, tokens);
150
+ if (!m)
151
+ continue;
152
+ const label = recordTitle(mdef, row);
153
+ scored.push({
154
+ score: m.score,
155
+ result: { vault, type, id: String(row.id), label, snippet: m.snippet },
156
+ });
157
+ }
158
+ }
159
+ scored.sort((a, b) => b.score - a.score);
160
+ return scored.slice(0, lim).map((s) => s.result);
161
+ });
162
+ // ─── Plugins (дашборд: набір активних плагінів живе в _plugins) ───────────────
163
+ // NB: GET /api/plugins тепер постачає registerPluginsApi (web-federation маніфест
164
+ // з asset-URL). Решта plugin-management ендпоінтів (PATCH/DELETE/settings) лишаються тут.
165
+ app.patch('/api/plugins/:id', async (req, reply) => {
166
+ const { id } = req.params;
167
+ const { enabled } = (req.body ?? {});
168
+ const plugins = await getPlugins();
169
+ const p = plugins.find((x) => x.id === id);
170
+ if (!p)
171
+ return reply.code(404).send({ error: 'unknown_plugin' });
172
+ if (id === 'core')
173
+ return reply.code(400).send({ error: 'core_required' });
174
+ const disabled = await readDisabled();
175
+ if (!enabled) {
176
+ const dependents = plugins.filter((x) => !disabled.has(x.id) && x.id !== id && x.dependsOn.includes(id));
177
+ if (dependents.length) {
178
+ return reply.code(409).send({ error: 'has_dependents', dependents: dependents.map((d) => d.id) });
179
+ }
180
+ }
181
+ else {
182
+ const missing = p.dependsOn.filter((d) => disabled.has(d));
183
+ if (missing.length)
184
+ return reply.code(409).send({ error: 'missing_deps', deps: missing });
185
+ }
186
+ const fork = getEm().fork();
187
+ const existing = await fork.findOne('_Plugin', { id });
188
+ if (existing) {
189
+ fork.assign(existing, { enabled: enabled ? 1 : 0, updated_at: new Date().toISOString() });
190
+ }
191
+ else {
192
+ fork.create('_Plugin', { id, enabled: enabled ? 1 : 0, updated_at: new Date().toISOString() });
193
+ }
194
+ await fork.flush();
195
+ // Зміна набору активних плагінів застосовується на наступному старті сервера.
196
+ return { ok: true, restartRequired: true };
197
+ });
198
+ // ЯВНЕ видалення даних плагіна (безповоротне): DROP таблиць + enabled=0.
199
+ // Toggle (PATCH) даних не чіпає — це окрема свідома дія.
200
+ app.delete('/api/plugins/:id/data', async (req, reply) => {
201
+ const { id } = req.params;
202
+ const plugins = await getPlugins();
203
+ const p = plugins.find((x) => x.id === id);
204
+ if (!p)
205
+ return reply.code(404).send({ error: 'unknown_plugin' });
206
+ if (id === 'core')
207
+ return reply.code(400).send({ error: 'core_required' });
208
+ const disabled = await readDisabled();
209
+ const dependents = plugins.filter((x) => !disabled.has(x.id) && x.id !== id && x.dependsOn.includes(id));
210
+ if (dependents.length) {
211
+ return reply.code(409).send({ error: 'has_dependents', dependents: dependents.map((d) => d.id) });
212
+ }
213
+ await purgePluginData(p, 'gui');
214
+ return { ok: true, restartRequired: true };
215
+ });
216
+ app.get('/api/plugins/:id/settings', async (req, reply) => {
217
+ const { id } = req.params;
218
+ const plugins = await getPlugins();
219
+ const p = plugins.find((x) => x.id === id);
220
+ if (!p || !p.settings || p.settings.fields.length === 0) {
221
+ return reply.code(404).send({ error: 'no_settings' });
222
+ }
223
+ const row = await getPluginSettings(id);
224
+ return row;
225
+ });
226
+ app.put('/api/plugins/:id/settings', (req, reply) => guard(reply, async () => {
227
+ const { id } = req.params;
228
+ const plugins = await getPlugins();
229
+ const p = plugins.find((x) => x.id === id);
230
+ if (!p || !p.settings || p.settings.fields.length === 0) {
231
+ return reply.code(404).send({ error: 'no_settings' });
232
+ }
233
+ const syntheticMod = {
234
+ vault: '_settings',
235
+ module: id,
236
+ label: `${id}.plugin.label`,
237
+ fields: p.settings.fields,
238
+ };
239
+ const parsed = buildZodObject(syntheticMod).safeParse(req.body ?? {});
240
+ if (!parsed.success) {
241
+ throw new ValidationError(parsed.error.issues.map((i) => {
242
+ const field = String(i.path[0] ?? '');
243
+ try {
244
+ const m = JSON.parse(i.message);
245
+ if (typeof m.code === 'string')
246
+ return { field, code: m.code, params: m.params };
247
+ }
248
+ catch {
249
+ /* */
250
+ }
251
+ return { field, code: 'invalid' };
252
+ }));
253
+ }
254
+ const entityName = `_settings__${id}`;
255
+ const row = { plugin_id: id, ...parsed.data };
256
+ await getEm()
257
+ .fork()
258
+ .upsert(entityName, row);
259
+ return { ok: true, row };
260
+ }));
261
+ // ─── Nextcloud: test connection ───────────────────────────────────────────────
262
+ app.post('/api/plugins/nextcloud/test', async (_req, reply) => {
263
+ const settings = await getPluginSettings('nextcloud');
264
+ const url = settings['nextcloud_url'];
265
+ const login = settings['login'];
266
+ const password = settings['password'];
267
+ if (!url || !login || !password) {
268
+ return reply.code(400).send({ error: 'Nextcloud settings not configured. Save them first.' });
269
+ }
270
+ // Змінний специфікатор (не літерал): server не тягне @coffer-org/plugin-nextcloud у свою
271
+ // tsc-програму (розрив циклу server↔плагіни). Generic plugin-routes — окреме питання.
272
+ const ncRuntime = '@coffer-org/plugin-nextcloud/runtime';
273
+ const { checkNextcloudConnection } = (await import(ncRuntime));
274
+ const result = await checkNextcloudConnection(url, login, password);
275
+ if (result.ok)
276
+ return { ok: true };
277
+ return reply.code(400).send({ error: result.error });
278
+ });
279
+ // ─── Records CRUD ─────────────────────────────────────────────────────────────
280
+ /** Привести значення фільтра (з query — завжди рядок) до типу колонки MikroORM. */
281
+ function coerceFilter(v, column) {
282
+ if (column === 'integer' || column === 'real') {
283
+ const n = Number(v);
284
+ return Number.isNaN(n) ? v : n;
285
+ }
286
+ if (column === 'boolean')
287
+ return v === 'true' || v === '1';
288
+ if (column === 'datetime')
289
+ return dtStringToDate(v); // фільтр-рядок → Date під тип колонки
290
+ return v; // date/time лишаються рядками
291
+ }
292
+ app.get('/api/:vault/:type', async (req, reply) => {
293
+ const { vault, type } = req.params;
294
+ const query = req.query;
295
+ const { q, ...filterParams } = query;
296
+ const ename = entityNames.get(key(vault, type));
297
+ const mdef = moduleDefs.get(key(vault, type));
298
+ if (!ename)
299
+ return reply.code(404).send({ error: 'unknown_type' });
300
+ // Збираємо фільтри за полями модуля (наприклад: trip_id=xxx, brand=Apple).
301
+ const where = {};
302
+ // Значення з query — рядки,
303
+ // тому приводимо до типу колонки (boolean/number) під типи сутності.
304
+ if (mdef) {
305
+ const fm = fieldMap(mdef.fields);
306
+ for (const [k, v] of Object.entries(filterParams)) {
307
+ const fieldDef = fm[k];
308
+ if (fieldDef && !fieldDef.virtual)
309
+ where[k] = coerceFilter(v, fieldDef.column);
310
+ }
311
+ }
312
+ // Точкова вибірка за id (comma-separated): резолв relation-цілей,
313
+ // зокрема standalone:false-модулів, що не перелічуються глобально.
314
+ if (filterParams.id) {
315
+ const ids = String(filterParams.id)
316
+ .split(',')
317
+ .map((s) => s.trim())
318
+ .filter(Boolean);
319
+ if (ids.length)
320
+ where['id'] = ids.length === 1 ? ids[0] : { $in: ids };
321
+ }
322
+ // standalone:false-модулі не перелічуються глобально — лише точкова вибірка
323
+ // (за полем-фільтром або id). Порожній where → порожній список.
324
+ if (mdef?.standalone === false && Object.keys(where).length === 0)
325
+ return [];
326
+ const fork = getEm().fork();
327
+ let rows = (await fork.find(ename, where)).map((r) => serialize(r));
328
+ // Текстовий пошук — у JS (SQLite LIKE не сворачивает кириличний регістр).
329
+ // Порядок/сортування лишаємо клієнту (TypeView сортує по колонках) — без ранжування.
330
+ const tokens = q ? tokenize(q) : [];
331
+ if (tokens.length > 0 && mdef) {
332
+ rows = rows.filter((row) => rowMatch(mdef, row, tokens) !== null);
333
+ }
334
+ const decoded = mdef ? rows.map((r) => decodeTemporal(mdef, r)) : rows;
335
+ return Promise.all(decoded.map((row) => withExtends(row, vault, type)));
336
+ });
337
+ app.get('/api/:vault/:type/:id', async (req, reply) => {
338
+ const { vault, type, id } = req.params;
339
+ const ename = entityNames.get(key(vault, type));
340
+ const mdef = moduleDefs.get(key(vault, type));
341
+ if (!ename || mdef?.standalone === false)
342
+ return reply.code(404).send({ error: 'unknown_type' });
343
+ if (!mdef)
344
+ return reply.code(404).send({ error: 'unknown_type' });
345
+ const row = await getRecord(mdef, ename, id);
346
+ if (!row)
347
+ return reply.code(404).send({ error: 'not_found' });
348
+ return withExtends(row, vault, type);
349
+ });
350
+ app.post('/api/:vault/:type', (req, reply) => guard(reply, async () => {
351
+ const { vault, type } = req.params;
352
+ const m = getModule(vault, type);
353
+ const ename = entityNames.get(key(vault, type));
354
+ if (!m || !ename)
355
+ return reply.code(404).send({ error: 'unknown_type' });
356
+ const { base, extData } = splitBody(req.body);
357
+ const row = await createRecord(m, ename, base, { actor: 'gui' });
358
+ await saveExtends(vault, type, String(row.id), extData);
359
+ return reply.code(201).send(await withExtends(row, vault, type));
360
+ }));
361
+ app.patch('/api/:vault/:type/:id', (req, reply) => guard(reply, async () => {
362
+ const { vault, type, id } = req.params;
363
+ const m = getModule(vault, type);
364
+ const ename = entityNames.get(key(vault, type));
365
+ if (!m || !ename)
366
+ return reply.code(404).send({ error: 'unknown_type' });
367
+ const { base, extData } = splitBody(req.body);
368
+ const row = await updateRecord(m, ename, id, base, { actor: 'gui' });
369
+ await saveExtends(vault, type, id, extData);
370
+ return withExtends(row, vault, type);
371
+ }));
372
+ app.delete('/api/:vault/:type/:id', (req, reply) => guard(reply, async () => {
373
+ const { vault, type, id } = req.params;
374
+ const m = getModule(vault, type);
375
+ const ename = entityNames.get(key(vault, type));
376
+ if (!m || !ename)
377
+ return reply.code(404).send({ error: 'unknown_type' });
378
+ await deleteRecord(m, ename, id, { actor: 'gui' });
379
+ return reply.code(204).send();
380
+ }));
381
+ // ─── Web-federation: маніфест активних плагінів + статичні asset'и з node_modules ─
382
+ await registerPluginsApi(app);
383
+ // ─── Serve-режим (продакшн): віддавати зібраний web + SPA-fallback ─────────────
384
+ // Вмикається коли WEB_DIST вказує на packages/web/dist (через `coffer start`).
385
+ const WEB_DIST = process.env.WEB_DIST;
386
+ if (WEB_DIST && existsSync(join(WEB_DIST, 'index.html'))) {
387
+ await app.register(fastifyStatic, { root: WEB_DIST, prefix: '/', decorateReply: false });
388
+ // Vendor singletons (react/react-dom/jsx-runtime/i18next/web-sdk) — sibling of dist/,
389
+ // served at /vendor/ so the importmap in index.html resolves plugin bare imports.
390
+ const VENDOR_DIST = join(WEB_DIST, '..', 'dist-vendor');
391
+ if (existsSync(VENDOR_DIST)) {
392
+ await app.register(fastifyStatic, { root: VENDOR_DIST, prefix: '/vendor/', decorateReply: false });
393
+ }
394
+ app.setNotFoundHandler((req, reply) => {
395
+ // API/uploads/vendor — справжні 404; решта GET → index.html (клієнтський роутинг)
396
+ if (req.method === 'GET' &&
397
+ !req.url.startsWith('/api') &&
398
+ !req.url.startsWith('/uploads') &&
399
+ !req.url.startsWith('/vendor')) {
400
+ return reply.sendFile('index.html', WEB_DIST);
401
+ }
402
+ return reply.code(404).send({ error: 'not_found' });
403
+ });
404
+ app.log.info(`serving web from ${WEB_DIST}`);
405
+ }
406
+ app
407
+ .listen({ port: PORT, host: '0.0.0.0' })
408
+ .then(() => app.log.info(`vault-server :${PORT}`))
409
+ .catch((e) => {
410
+ app.log.error(e);
411
+ process.exit(1);
412
+ });
413
+ // Graceful shutdown — дає tsx watch час закрити порт перед рестартом
414
+ const shutdown = () => Promise.resolve(teardownPlugins())
415
+ .then(() => app.close())
416
+ .then(() => process.exit(0))
417
+ .catch(() => process.exit(1));
418
+ process.on('SIGTERM', shutdown);
419
+ process.on('SIGINT', shutdown);
420
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class UnknownTypeError extends Error {
2
+ }
3
+ export declare function localExists(vault: string, type: string, id: string): Promise<boolean>;
4
+ export declare function localPost(vault: string, type: string, body: unknown): Promise<Record<string, unknown>>;
5
+ export declare function localPatch(vault: string, type: string, id: string, body: unknown): Promise<Record<string, unknown>>;
6
+ //# sourceMappingURL=local-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-api.d.ts","sourceRoot":"","sources":["../src/local-api.ts"],"names":[],"mappings":"AAoBA,qBAAa,gBAAiB,SAAQ,KAAK;CAAG;AAE9C,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI3F;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQ5G;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQlC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * In-process API — той самий запис, що й REST-роути, але без HTTP.
3
+ * Потрібен для імпорту/сидів у середовищах, де піднятий сервер не годиться
4
+ * (напр. пісочниця, що скидає overlay вбитого процесу): процес-писар сам
5
+ * мутує БД і чисто завершується → дані персистяться.
6
+ *
7
+ * Повторює логіку app.post/app.patch з index.ts: split _extend_<id> → base,
8
+ * createRecord/updateRecord (mutate), upsert extends.
9
+ */
10
+ import { getModule } from './registry-context.js';
11
+ import { createRecord, updateRecord, getRecord } from './mutate.js';
12
+ import { moduleTableName } from './entity-schema.js';
13
+ import { splitBody, saveExtends } from './extend-io.js';
14
+ /** Ім'я таблиці для (vault, type), якщо модуль відомий. Реєстр in-memory — без кешу. */
15
+ function enameFor(vault, type) {
16
+ const m = getModule(vault, type);
17
+ return m ? moduleTableName(m.vault, m.module) : undefined;
18
+ }
19
+ export class UnknownTypeError extends Error {
20
+ }
21
+ export async function localExists(vault, type, id) {
22
+ const m = getModule(vault, type);
23
+ const ename = enameFor(vault, type);
24
+ return m && ename ? Boolean(await getRecord(m, ename, id)) : false;
25
+ }
26
+ export async function localPost(vault, type, body) {
27
+ const m = getModule(vault, type);
28
+ const ename = enameFor(vault, type);
29
+ if (!m || !ename)
30
+ throw new UnknownTypeError(`unknown_type ${vault}/${type}`);
31
+ const { base, extData } = splitBody(body);
32
+ const row = await createRecord(m, ename, base, { actor: 'import' });
33
+ await saveExtends(vault, type, String(row.id), extData);
34
+ return row;
35
+ }
36
+ export async function localPatch(vault, type, id, body) {
37
+ const m = getModule(vault, type);
38
+ const ename = enameFor(vault, type);
39
+ if (!m || !ename)
40
+ throw new UnknownTypeError(`unknown_type ${vault}/${type}`);
41
+ const { base, extData } = splitBody(body);
42
+ const row = await updateRecord(m, ename, id, base, { actor: 'import' });
43
+ await saveExtends(vault, type, id, extData);
44
+ return row;
45
+ }
46
+ //# sourceMappingURL=local-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-api.js","sourceRoot":"","sources":["../src/local-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAExD,wFAAwF;AACxF,SAAS,QAAQ,CAAC,KAAa,EAAE,IAAY;IAC3C,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;CAAG;AAE9C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,IAAY,EAAE,EAAU;IACvE,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa;IACxE,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,IAAY,EACZ,EAAU,EACV,IAAa;IAEb,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ModuleDef } from '@coffer-org/sdk/module';
2
+ export interface MutateCtx {
3
+ actor: string;
4
+ }
5
+ export interface ValidationIssue {
6
+ field: string;
7
+ code: string;
8
+ params?: Record<string, unknown>;
9
+ }
10
+ export declare class ValidationError extends Error {
11
+ issues: ValidationIssue[];
12
+ constructor(issues: ValidationIssue[]);
13
+ }
14
+ export declare class NotFoundError extends Error {
15
+ constructor();
16
+ }
17
+ export declare function listRecords(entityName: string): Promise<Record<string, unknown>[]>;
18
+ export declare function getRecord(m: ModuleDef, entityName: string, id: string): Promise<Record<string, unknown> | undefined>;
19
+ export declare function createRecord(m: ModuleDef, entityName: string, input: unknown, ctx: MutateCtx): Promise<Record<string, unknown>>;
20
+ export declare function updateRecord(m: ModuleDef, entityName: string, id: string, input: unknown, ctx: MutateCtx): Promise<Record<string, unknown>>;
21
+ export declare function deleteRecord(m: ModuleDef, entityName: string, id: string, ctx: MutateCtx): Promise<void>;
22
+ //# sourceMappingURL=mutate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../src/mutate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAkBxD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACrB,MAAM,EAAE,eAAe,EAAE;gBAAzB,MAAM,EAAE,eAAe,EAAE;CAI7C;AACD,qBAAa,aAAc,SAAQ,KAAK;;CAKvC;AAuCD,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAIxF;AAED,wBAAsB,SAAS,CAC7B,CAAC,EAAE,SAAS,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAQ9C;AAID,wBAAsB,YAAY,CAChC,CAAC,EAAE,SAAS,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmBlC;AAID,wBAAsB,YAAY,CAChC,CAAC,EAAE,SAAS,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuBlC;AAID,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9G"}