@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/mutate.js ADDED
@@ -0,0 +1,128 @@
1
+ /**
2
+ * ЄДИНИЙ ШЛЯХ ЗАПИСУ. Усі мутації проходять тут.
3
+ * validate (Zod) → транзакція → append-only audit (_events).
4
+ */
5
+ import { randomUUID } from 'node:crypto';
6
+ import { serialize } from '@mikro-orm/core';
7
+ import { buildZodObject, buildZodObjectPartial } from '@coffer-org/sdk/module';
8
+ import { getEm } from './db.js';
9
+ import { encodeTemporal, decodeTemporal } from './temporal.js';
10
+ import { splitCollections, writeCollections, deleteCollections, flattenEmbedded, nestEmbedded, readCollections, } from './collection-io.js';
11
+ function nowIso() {
12
+ return new Date().toISOString();
13
+ }
14
+ export class ValidationError extends Error {
15
+ issues;
16
+ constructor(issues) {
17
+ super('validation');
18
+ this.issues = issues;
19
+ this.name = 'ValidationError';
20
+ }
21
+ }
22
+ export class NotFoundError extends Error {
23
+ constructor() {
24
+ super('Не знайдено');
25
+ this.name = 'NotFoundError';
26
+ }
27
+ }
28
+ function toIssue(i) {
29
+ const field = String(i.path[0] ?? '');
30
+ try {
31
+ const m = JSON.parse(i.message);
32
+ if (typeof m.code === 'string')
33
+ return { field, code: m.code, params: m.params };
34
+ }
35
+ catch {
36
+ /* не-vmsg повідомлення від zod */
37
+ }
38
+ return { field, code: 'invalid' };
39
+ }
40
+ function writeEvent(em, actor, op, type, recordId, before, after) {
41
+ em.create('_Event', {
42
+ id: randomUUID(),
43
+ ts: nowIso(),
44
+ actor,
45
+ op,
46
+ type,
47
+ record_id: recordId,
48
+ before: before == null ? null : JSON.stringify(before),
49
+ after: after == null ? null : JSON.stringify(after),
50
+ });
51
+ }
52
+ // ─── READ ─────────────────────────────────────────────────────────────────────
53
+ export async function listRecords(entityName) {
54
+ const fork = getEm().fork();
55
+ const rows = await fork.findAll(entityName);
56
+ return serialize(rows);
57
+ }
58
+ export async function getRecord(m, entityName, id) {
59
+ const fork = getEm().fork();
60
+ const row = await fork.findOne(entityName, { id });
61
+ if (!row)
62
+ return undefined;
63
+ const flat = decodeTemporal(m, serialize(row));
64
+ const nested = nestEmbedded(m, flat);
65
+ const collections = await readCollections(fork, m, id);
66
+ return { ...nested, ...collections };
67
+ }
68
+ // ─── CREATE ───────────────────────────────────────────────────────────────────
69
+ export async function createRecord(m, entityName, input, ctx) {
70
+ const rawInput = (input ?? {});
71
+ const parsed = buildZodObject(m).safeParse(input);
72
+ if (!parsed.success)
73
+ throw new ValidationError(parsed.error.issues.map(toIssue));
74
+ const id = typeof rawInput.id === 'string' && rawInput.id ? rawInput.id : randomUUID();
75
+ const ts = nowIso();
76
+ const { base, collections } = splitCollections(m, { ...parsed.data });
77
+ const row = flattenEmbedded(m, { id, ...base, created_at: ts, updated_at: ts });
78
+ const dbRow = encodeTemporal(m, row);
79
+ await getEm()
80
+ .fork()
81
+ .transactional(async (tx) => {
82
+ await tx.upsert(entityName, dbRow);
83
+ await writeCollections(tx, m, id, collections);
84
+ writeEvent(tx, ctx.actor, 'create', `${m.vault}/${m.module}`, id, null, { ...parsed.data, id });
85
+ });
86
+ return { ...parsed.data, id, created_at: ts, updated_at: ts };
87
+ }
88
+ // ─── UPDATE ───────────────────────────────────────────────────────────────────
89
+ export async function updateRecord(m, entityName, id, input, ctx) {
90
+ const parsed = buildZodObjectPartial(m).safeParse(input);
91
+ if (!parsed.success)
92
+ throw new ValidationError(parsed.error.issues.map(toIssue));
93
+ let result;
94
+ await getEm()
95
+ .fork()
96
+ .transactional(async (tx) => {
97
+ const found = await tx.findOne(entityName, { id });
98
+ if (!found)
99
+ throw new NotFoundError();
100
+ const existingFlat = decodeTemporal(m, serialize(found));
101
+ const existing = nestEmbedded(m, existingFlat);
102
+ const ts = nowIso();
103
+ const { base, collections } = splitCollections(m, { ...parsed.data });
104
+ const merged = { ...existing, ...base };
105
+ const dbRow = encodeTemporal(m, flattenEmbedded(m, { ...merged, updated_at: ts }));
106
+ await tx.upsert(entityName, dbRow);
107
+ await writeCollections(tx, m, id, collections);
108
+ const after = { ...merged, ...collections, updated_at: ts };
109
+ writeEvent(tx, ctx.actor, 'update', `${m.vault}/${m.module}`, id, existing, after);
110
+ result = after;
111
+ });
112
+ return result;
113
+ }
114
+ // ─── DELETE ───────────────────────────────────────────────────────────────────
115
+ export async function deleteRecord(m, entityName, id, ctx) {
116
+ await getEm()
117
+ .fork()
118
+ .transactional(async (tx) => {
119
+ const found = await tx.findOne(entityName, { id });
120
+ if (!found)
121
+ throw new NotFoundError();
122
+ const existing = serialize(found);
123
+ await deleteCollections(tx, m, id);
124
+ tx.remove(found);
125
+ writeEvent(tx, ctx.actor, 'delete', `${m.vault}/${m.module}`, id, existing, null);
126
+ });
127
+ }
128
+ //# sourceMappingURL=mutate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.js","sourceRoot":"","sources":["../src/mutate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { PluginManifest } from '@coffer-org/sdk/plugin';
2
+ import type { PluginHooks } from './plugin-hooks.js';
3
+ export interface PluginAssetPaths {
4
+ schema: string;
5
+ web?: string;
6
+ css?: string;
7
+ }
8
+ export interface PluginAssetUrls {
9
+ schema: string;
10
+ web?: string;
11
+ css?: string;
12
+ }
13
+ /** Maps a plugin's published `coffer` asset paths to host-served URLs.
14
+ * The relative path's basename is fixed by convention (schema.js/web.js/web.css);
15
+ * the actual file is read from node_modules by the static handler. */
16
+ export declare function resolveAssetUrls(id: string, coffer: PluginAssetPaths): PluginAssetUrls;
17
+ export interface PluginAssetRecord {
18
+ id: string;
19
+ version: string;
20
+ dependsOn: string[];
21
+ packageName: string;
22
+ schema: string;
23
+ web?: string;
24
+ css?: string;
25
+ }
26
+ export declare function discoverPluginAssets(): Promise<PluginAssetRecord[]>;
27
+ /** Усі знайдені плагіни. Порядок неважливий — composeRegistry резолвить за dependsOn. */
28
+ export declare function discoverPlugins(): Promise<PluginManifest[]>;
29
+ /**
30
+ * Збирає серверні хуки наявних плагінів. Плагін із runtime-входом
31
+ * (package.json `coffer.server` або `exports["./runtime"]`) може експортувати
32
+ * `serverHooks: PluginHooks`. Імпорт — через ЗМІННИЙ специфікатор, тож tsc НЕ тягне
33
+ * plugin-src у серверну програму (розрив циклу server↔плагіни).
34
+ */
35
+ export declare function loadServerHooks(): Promise<Record<string, PluginHooks>>;
36
+ //# sourceMappingURL=plugin-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-discovery.d.ts","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqBrD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;uEAEuE;AACvE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAMtF;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6BzE;AAkBD,yFAAyF;AACzF,wBAAsB,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAYjE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAqB5E"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Рантайм-виявлення плагінів: скан node_modules на @coffer-org/plugin-* та
3
+ * coffer-plugin-*. Кожен пакет постачає PluginManifest (default-export schema-entry).
4
+ * Один битий плагін логиться й пропускається — інстанс не падає (trust=none маркетплейс).
5
+ */
6
+ import { readdir, readFile } from 'node:fs/promises';
7
+ import { join } from 'node:path';
8
+ import { pathToFileURL } from 'node:url';
9
+ async function pkgNames(nm) {
10
+ const names = [];
11
+ try {
12
+ for (const d of await readdir(join(nm, '@coffer-org'))) {
13
+ if (d.startsWith('plugin-'))
14
+ names.push(`@coffer-org/${d}`);
15
+ }
16
+ }
17
+ catch {
18
+ /* немає @coffer-скоупу — ок */
19
+ }
20
+ try {
21
+ for (const d of await readdir(nm)) {
22
+ if (d.startsWith('coffer-plugin-'))
23
+ names.push(d);
24
+ }
25
+ }
26
+ catch {
27
+ /* немає node_modules — ок */
28
+ }
29
+ return names;
30
+ }
31
+ /** Maps a plugin's published `coffer` asset paths to host-served URLs.
32
+ * The relative path's basename is fixed by convention (schema.js/web.js/web.css);
33
+ * the actual file is read from node_modules by the static handler. */
34
+ export function resolveAssetUrls(id, coffer) {
35
+ const base = `/plugins/${id}`;
36
+ const out = { schema: `${base}/schema.js` };
37
+ if (coffer.web)
38
+ out.web = `${base}/web.js`;
39
+ if (coffer.css)
40
+ out.css = `${base}/web.css`;
41
+ return out;
42
+ }
43
+ export async function discoverPluginAssets() {
44
+ const nm = join(process.cwd(), 'node_modules');
45
+ const names = await pkgNames(nm);
46
+ const out = [];
47
+ for (const name of names) {
48
+ try {
49
+ const pkg = JSON.parse(await readFile(join(nm, name, 'package.json'), 'utf8'));
50
+ if (!pkg.coffer?.schema)
51
+ continue;
52
+ const spec = pathToFileURL(join(nm, name, pkg.coffer.schema)).href;
53
+ const manifest = (await import(spec)).default;
54
+ if (!manifest?.id)
55
+ continue;
56
+ const urls = resolveAssetUrls(manifest.id, pkg.coffer);
57
+ out.push({
58
+ id: manifest.id,
59
+ version: pkg.version ?? '0.0.0',
60
+ dependsOn: manifest.dependsOn ?? [],
61
+ packageName: name,
62
+ schema: urls.schema,
63
+ web: urls.web,
64
+ css: urls.css,
65
+ });
66
+ }
67
+ catch (e) {
68
+ console.error(`[discovery] ${name}: asset scan skip — ${e.message}`);
69
+ }
70
+ }
71
+ return out;
72
+ }
73
+ async function loadManifest(nm, name) {
74
+ try {
75
+ const pkg = JSON.parse(await readFile(join(nm, name, 'package.json'), 'utf8'));
76
+ const schemaRel = pkg?.coffer?.schema;
77
+ const spec = schemaRel ? pathToFileURL(join(nm, name, schemaRel)).href : name;
78
+ const mod = (await import(spec));
79
+ const manifest = mod.default;
80
+ if (manifest && typeof manifest.id === 'string')
81
+ return manifest;
82
+ console.warn(`[discovery] ${name}: немає валідного default-маніфесту, пропуск`);
83
+ return null;
84
+ }
85
+ catch (e) {
86
+ console.error(`[discovery] ${name}: збій імпорту, пропуск — ${e.message}`);
87
+ return null;
88
+ }
89
+ }
90
+ /** Усі знайдені плагіни. Порядок неважливий — composeRegistry резолвить за dependsOn. */
91
+ export async function discoverPlugins() {
92
+ // Скануємо node_modules коренем інстансу (cwd): сервер запускається з кореня,
93
+ // npm workspaces хостить пакети у корене́вий node_modules. Запуск із packages/server
94
+ // дивився б у локальний node_modules і не побачив би хостовані плагіни.
95
+ const nm = join(process.cwd(), 'node_modules');
96
+ const names = await pkgNames(nm);
97
+ const manifests = [];
98
+ for (const name of names) {
99
+ const m = await loadManifest(nm, name);
100
+ if (m)
101
+ manifests.push(m);
102
+ }
103
+ return manifests;
104
+ }
105
+ /**
106
+ * Збирає серверні хуки наявних плагінів. Плагін із runtime-входом
107
+ * (package.json `coffer.server` або `exports["./runtime"]`) може експортувати
108
+ * `serverHooks: PluginHooks`. Імпорт — через ЗМІННИЙ специфікатор, тож tsc НЕ тягне
109
+ * plugin-src у серверну програму (розрив циклу server↔плагіни).
110
+ */
111
+ export async function loadServerHooks() {
112
+ const nm = join(process.cwd(), 'node_modules');
113
+ const names = await pkgNames(nm);
114
+ const hooks = {};
115
+ for (const name of names) {
116
+ try {
117
+ const pkg = JSON.parse(await readFile(join(nm, name, 'package.json'), 'utf8'));
118
+ const serverRel = pkg?.coffer?.server;
119
+ const hasRuntime = Boolean(serverRel) || Boolean(pkg?.exports?.['./runtime']);
120
+ if (!hasRuntime)
121
+ continue;
122
+ const manifest = (await import(name)).default;
123
+ const id = manifest?.id;
124
+ if (!id)
125
+ continue;
126
+ const spec = serverRel ? pathToFileURL(join(nm, name, serverRel)).href : `${name}/runtime`;
127
+ const mod = (await import(spec));
128
+ if (mod.serverHooks)
129
+ hooks[id] = mod.serverHooks;
130
+ }
131
+ catch (e) {
132
+ console.error(`[discovery] ${name}: серверні хуки не завантажено — ${e.message}`);
133
+ }
134
+ }
135
+ return hooks;
136
+ }
137
+ //# sourceMappingURL=plugin-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Серверні хуки життєвого циклу плагінів (server-only).
3
+ *
4
+ * Маніфест плагіна (@coffer-org/sdk/plugin) — ізоморфний і НЕ містить функцій (щоб не тягнути
5
+ * серверні залежності у чисте ядро). Усе, що стосується сервера — міграції/seed/init/teardown —
6
+ * реєструється тут, по id плагіна.
7
+ *
8
+ * pluginHooks['people'] = {
9
+ * seed: async (ctx) => { ... ідемпотентне наповнення ... },
10
+ * init: async (ctx) => { ... запуск воркерів/перевірки ... },
11
+ * teardown: async (ctx) => { ... зняття (м'яке: лише cleanup стану) ... },
12
+ * };
13
+ *
14
+ * teardown за рішенням — М'ЯКЕ: таблиці/дані лишаються в БД,
15
+ * плагін лише вимикається. ctx.em — fork-нутий EntityManager для seed/init операцій.
16
+ *
17
+ * Реальні хуки оголошуються у самих плагінах (serverHooks) і збираються
18
+ * генерично через loadServerHooks() — тут лише контракт і порожній реєстр.
19
+ */
20
+ import type { EntityManager } from '@mikro-orm/core';
21
+ export interface PluginCtx {
22
+ /** Fork-нутий EntityManager для seed/init операцій. */
23
+ em: EntityManager;
24
+ }
25
+ export interface PluginHooks {
26
+ /** Ідемпотентне наповнення даними після міграцій. */
27
+ seed?(ctx: PluginCtx): Promise<void> | void;
28
+ /** Довільна ініціалізація після seed (воркери, перевірки). */
29
+ init?(ctx: PluginCtx): Promise<void> | void;
30
+ /** Зняття плагіна (м'яке): cleanup рантайм-стану. Дані НЕ дропаються. */
31
+ teardown?(ctx: PluginCtx): Promise<void> | void;
32
+ }
33
+ /** Реєстр серверних хуків по id плагіна. Порожньо = плагін без серверної логіки. */
34
+ export declare const pluginHooks: Record<string, PluginHooks>;
35
+ //# sourceMappingURL=plugin-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-hooks.d.ts","sourceRoot":"","sources":["../src/plugin-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,EAAE,EAAE,aAAa,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,8DAA8D;IAC9D,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,yEAAyE;IACzE,QAAQ,CAAC,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjD;AAED,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Реєстр серверних хуків по id плагіна. Порожньо = плагін без серверної логіки. */
2
+ export const pluginHooks = {};
3
+ //# sourceMappingURL=plugin-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-hooks.js","sourceRoot":"","sources":["../src/plugin-hooks.ts"],"names":[],"mappings":"AAmCA,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAgC,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type Registry } from '@coffer-org/core/compose';
2
+ import type { PluginManifest } from '@coffer-org/sdk/plugin';
3
+ export declare function getPlugins(): Promise<PluginManifest[]>;
4
+ /** Прочитати множину вимкнених плагінів із _plugins (core ніколи не вимкнено). */
5
+ export declare function readDisabled(): Promise<Set<string>>;
6
+ /**
7
+ * Прочитати налаштування плагіна (singleton-запис у _settings__<id>).
8
+ * Повертає {} якщо запис ще не збережено.
9
+ */
10
+ export declare function getPluginSettings(pluginId: string): Promise<Record<string, unknown>>;
11
+ /**
12
+ * Двофазний bootstrap БД. Повертає множину вимкнених плагінів.
13
+ * Викликається сервером (через initPlugins) і CLI-скриптами напряму.
14
+ */
15
+ export declare function initStorage(): Promise<Set<string>>;
16
+ export declare function initPlugins(): Promise<Registry>;
17
+ /**
18
+ * Graceful-зупинка воркерів активних плагінів (виклик teardown) на shutdown сервера.
19
+ * Зворотний порядок відносно init. Помилки окремого плагіна не зупиняють решту.
20
+ */
21
+ export declare function teardownPlugins(): Promise<void>;
22
+ /** М'яке зняття плагіна: лише cleanup-хук. Таблиці/дані НЕ дропаються. */
23
+ export declare function teardownPlugin(id: string): Promise<void>;
24
+ /**
25
+ * ЯВНЕ видалення даних плагіна (безповоротне):
26
+ * teardown-хук → DROP TABLE (модулі + extends) → enabled=0 → аудит.
27
+ * Ідемпотентно: повторний виклик безпечний (IF EXISTS, findOne).
28
+ * DDL у SQLite через knex виконується в авто-комміті, тому атомарності
29
+ * між дропами нема — натомість послідовність безпечно перезапускається.
30
+ */
31
+ export declare function purgePluginData(p: PluginManifest, actor: string): Promise<void>;
32
+ /** Pure filter: drop disabled ids, preserve input order. */
33
+ export declare function filterEnabled<T extends {
34
+ id: string;
35
+ }>(all: T[], disabled: Set<string>): T[];
36
+ //# sourceMappingURL=plugin-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-runtime.d.ts","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAU7D,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAE5D;AAED,kFAAkF;AAClF,wBAAsB,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAMzD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAc1F;AAeD;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAcxD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CA0BrD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD;AAED,0EAA0E;AAC1E,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9D;AAUD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrF;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAE5F"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Оркестрація життєвого циклу плагінів на старті сервера (Рівень 1: набір — з БД).
3
+ *
4
+ * initStorage() — двофазний bootstrap БД:
5
+ * 1. initDb(системні схеми) → syncSchema() — _events/_folders/_plugins існують;
6
+ * 2. seed рядків _plugins (нові → enabled=1) → читання вимкнених;
7
+ * 3. discoverEntity(схеми АКТИВНИХ плагінів) → syncSchema() — таблиці плагінів.
8
+ * Entities вимкнених плагінів НЕ реєструються: їхні таблиці невідомі ORM,
9
+ * тому dropTables:false гарантує збереження даних (м'яке вимкнення).
10
+ *
11
+ * initPlugins() = initStorage() + composeRegistry + seed/init хуки.
12
+ * purgePluginData() — ЯВНЕ видалення даних плагіна (DROP TABLE + _folders + enabled=0).
13
+ *
14
+ * core вимкнути не можна.
15
+ */
16
+ import { randomUUID } from 'node:crypto';
17
+ import { serialize } from '@mikro-orm/core';
18
+ import { composeRegistry } from '@coffer-org/core/compose';
19
+ import { initDb, getOrm, getEm } from './db.js';
20
+ import { syncSchema } from './schema-sync.js';
21
+ import { systemEntities, buildPluginEntities, moduleTableName } from './entity-schema.js';
22
+ import { pluginHooks } from './plugin-hooks.js';
23
+ import { discoverPlugins, loadServerHooks } from './plugin-discovery.js';
24
+ import { setActiveRegistry } from './registry-context.js';
25
+ /** Кеш discovered-набору: discovery виконується раз на процес (перший виклик — на bootstrap). */
26
+ let _plugins = null;
27
+ export async function getPlugins() {
28
+ return (_plugins ??= await discoverPlugins());
29
+ }
30
+ /** Прочитати множину вимкнених плагінів із _plugins (core ніколи не вимкнено). */
31
+ export async function readDisabled() {
32
+ const fork = getEm().fork();
33
+ const rows = await fork.find('_Plugin', { enabled: 0 });
34
+ const disabled = new Set(rows.map((r) => r.id));
35
+ disabled.delete('core');
36
+ return disabled;
37
+ }
38
+ /**
39
+ * Прочитати налаштування плагіна (singleton-запис у _settings__<id>).
40
+ * Повертає {} якщо запис ще не збережено.
41
+ */
42
+ export async function getPluginSettings(pluginId) {
43
+ try {
44
+ const fork = getEm().fork();
45
+ const row = await fork.findOne(`_settings__${pluginId}`, {
46
+ plugin_id: pluginId,
47
+ });
48
+ if (!row)
49
+ return {};
50
+ return serialize(row);
51
+ }
52
+ catch {
53
+ return {};
54
+ }
55
+ }
56
+ /** Зареєструвати рядки _plugins для всіх відомих плагінів (нові → enabled=1). */
57
+ async function seedPluginRows() {
58
+ const fork = getEm().fork();
59
+ const existing = new Set((await fork.find('_Plugin', {})).map((r) => r.id));
60
+ const now = new Date().toISOString();
61
+ for (const p of await getPlugins()) {
62
+ if (!existing.has(p.id)) {
63
+ fork.create('_Plugin', { id: p.id, enabled: 1, updated_at: now });
64
+ }
65
+ }
66
+ await fork.flush();
67
+ }
68
+ /**
69
+ * Двофазний bootstrap БД. Повертає множину вимкнених плагінів.
70
+ * Викликається сервером (через initPlugins) і CLI-скриптами напряму.
71
+ */
72
+ export async function initStorage() {
73
+ await initDb(systemEntities);
74
+ await syncSchema(); // системні таблиці
75
+ // Legacy-зачистка: folder-інфраструктура прибрана. Колонку folder_id у таблицях
76
+ // модулів дропає syncSchema (safe:false); таблицю _folders — лише явний DROP
77
+ // (dropTables:false таблиці не чіпає). Ідемпотентно (IF EXISTS).
78
+ await getEm().fork().getConnection().execute('DROP TABLE IF EXISTS "_folders"');
79
+ await seedPluginRows();
80
+ const disabled = await readDisabled();
81
+ const active = (await getPlugins()).filter((p) => !disabled.has(p.id));
82
+ const pluginEntities = buildPluginEntities(active);
83
+ if (pluginEntities.length)
84
+ getOrm().discoverEntity(pluginEntities);
85
+ await syncSchema(); // таблиці/колонки активних плагінів
86
+ return disabled;
87
+ }
88
+ export async function initPlugins() {
89
+ const disabled = await initStorage();
90
+ const reg = composeRegistry(await getPlugins(), { disabled });
91
+ setActiveRegistry(reg);
92
+ Object.assign(pluginHooks, await loadServerHooks());
93
+ for (const p of reg.order) {
94
+ const h = pluginHooks[p.id];
95
+ try {
96
+ if (h?.seed) {
97
+ await h.seed({ em: getEm().fork() });
98
+ console.log(`[plugin] ${p.id}: seed ✓`);
99
+ }
100
+ if (h?.init) {
101
+ await h.init({ em: getEm().fork() });
102
+ console.log(`[plugin] ${p.id}: init ✓`);
103
+ }
104
+ }
105
+ catch (err) {
106
+ console.error(`[plugin] ${p.id}: збій при ініціалізації`, err);
107
+ throw err;
108
+ }
109
+ }
110
+ console.log(`[plugin] активні: ${reg.order.map((p) => p.id).join(' ')}` +
111
+ (disabled.size ? ` | вимкнені: ${[...disabled].join(' ')}` : ''));
112
+ return reg;
113
+ }
114
+ /**
115
+ * Graceful-зупинка воркерів активних плагінів (виклик teardown) на shutdown сервера.
116
+ * Зворотний порядок відносно init. Помилки окремого плагіна не зупиняють решту.
117
+ */
118
+ export async function teardownPlugins() {
119
+ Object.assign(pluginHooks, await loadServerHooks());
120
+ const disabled = await readDisabled();
121
+ const reg = composeRegistry(await getPlugins(), { disabled });
122
+ for (const p of [...reg.order].reverse()) {
123
+ const h = pluginHooks[p.id];
124
+ if (!h?.teardown)
125
+ continue;
126
+ try {
127
+ await h.teardown({ em: getEm().fork() });
128
+ console.log(`[plugin] ${p.id}: teardown ✓`);
129
+ }
130
+ catch (e) {
131
+ console.warn(`[plugin] ${p.id}: teardown ✗ ${e.message}`);
132
+ }
133
+ }
134
+ }
135
+ /** М'яке зняття плагіна: лише cleanup-хук. Таблиці/дані НЕ дропаються. */
136
+ export async function teardownPlugin(id) {
137
+ const h = pluginHooks[id];
138
+ if (h?.teardown) {
139
+ await h.teardown({ em: getEm().fork() });
140
+ console.log(`[plugin] ${id}: teardown ✓`);
141
+ }
142
+ }
143
+ /** Пари (vault, module) усіх модулів плагіна — власні vault'и + vaultModules. */
144
+ function pluginModules(p) {
145
+ return [
146
+ ...(p.vaults ?? []).flatMap((v) => v.modules.map((m) => ({ vault: m.vault, module: m.module }))),
147
+ ...(p.vaultModules ?? []).map((m) => ({ vault: m.vault, module: m.module })),
148
+ ];
149
+ }
150
+ /**
151
+ * ЯВНЕ видалення даних плагіна (безповоротне):
152
+ * teardown-хук → DROP TABLE (модулі + extends) → enabled=0 → аудит.
153
+ * Ідемпотентно: повторний виклик безпечний (IF EXISTS, findOne).
154
+ * DDL у SQLite через knex виконується в авто-комміті, тому атомарності
155
+ * між дропами нема — натомість послідовність безпечно перезапускається.
156
+ */
157
+ export async function purgePluginData(p, actor) {
158
+ await teardownPlugin(p.id);
159
+ const tables = [
160
+ ...pluginModules(p).map(({ vault, module }) => moduleTableName(vault, module)),
161
+ ...(p.extends_ ?? []).map((e) => `extend__${e.id}`),
162
+ ...(p.settings && p.settings.fields.length > 0 ? [`_settings__${p.id}`] : []),
163
+ ];
164
+ const conn = getEm().fork().getConnection();
165
+ for (const t of tables) {
166
+ await conn.execute(`DROP TABLE IF EXISTS "${t}"`);
167
+ }
168
+ // enabled=0 + аудит — однією транзакцією.
169
+ await getEm()
170
+ .fork()
171
+ .transactional(async (tx) => {
172
+ const now = new Date().toISOString();
173
+ const row = await tx.findOne('_Plugin', { id: p.id });
174
+ if (row)
175
+ tx.assign(row, { enabled: 0, updated_at: now });
176
+ else
177
+ tx.create('_Plugin', { id: p.id, enabled: 0, updated_at: now });
178
+ tx.create('_Event', {
179
+ id: randomUUID(),
180
+ ts: now,
181
+ actor,
182
+ op: 'purge',
183
+ type: p.id,
184
+ record_id: p.id,
185
+ before: null,
186
+ after: null,
187
+ });
188
+ });
189
+ console.log(`[plugin] ${p.id}: purge ✓ (${tables.length} табл.)`);
190
+ }
191
+ /** Pure filter: drop disabled ids, preserve input order. */
192
+ export function filterEnabled(all, disabled) {
193
+ return all.filter((p) => !disabled.has(p.id));
194
+ }
195
+ //# sourceMappingURL=plugin-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-runtime.js","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function registerPluginsApi(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=plugins-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins-api.d.ts","sourceRoot":"","sources":["../src/plugins-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAW/C,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C5E"}