@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.
- package/dist/collection-io.d.ts +20 -0
- package/dist/collection-io.d.ts.map +1 -0
- package/dist/collection-io.js +111 -0
- package/dist/collection-io.js.map +1 -0
- package/dist/db.d.ts +6 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +45 -0
- package/dist/db.js.map +1 -0
- package/dist/entity-schema.d.ts +32 -0
- package/dist/entity-schema.d.ts.map +1 -0
- package/dist/entity-schema.js +147 -0
- package/dist/entity-schema.js.map +1 -0
- package/dist/extend-io.d.ts +8 -0
- package/dist/extend-io.d.ts.map +1 -0
- package/dist/extend-io.js +34 -0
- package/dist/extend-io.js.map +1 -0
- package/dist/extend-table.d.ts +6 -0
- package/dist/extend-table.d.ts.map +1 -0
- package/dist/extend-table.js +28 -0
- package/dist/extend-table.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +420 -0
- package/dist/index.js.map +1 -0
- package/dist/local-api.d.ts +6 -0
- package/dist/local-api.d.ts.map +1 -0
- package/dist/local-api.js +46 -0
- package/dist/local-api.js.map +1 -0
- package/dist/mutate.d.ts +22 -0
- package/dist/mutate.d.ts.map +1 -0
- package/dist/mutate.js +128 -0
- package/dist/mutate.js.map +1 -0
- package/dist/plugin-discovery.d.ts +36 -0
- package/dist/plugin-discovery.d.ts.map +1 -0
- package/dist/plugin-discovery.js +137 -0
- package/dist/plugin-discovery.js.map +1 -0
- package/dist/plugin-hooks.d.ts +35 -0
- package/dist/plugin-hooks.d.ts.map +1 -0
- package/dist/plugin-hooks.js +3 -0
- package/dist/plugin-hooks.js.map +1 -0
- package/dist/plugin-runtime.d.ts +36 -0
- package/dist/plugin-runtime.d.ts.map +1 -0
- package/dist/plugin-runtime.js +195 -0
- package/dist/plugin-runtime.js.map +1 -0
- package/dist/plugins-api.d.ts +3 -0
- package/dist/plugins-api.d.ts.map +1 -0
- package/dist/plugins-api.js +53 -0
- package/dist/plugins-api.js.map +1 -0
- package/dist/registry-context.d.ts +11 -0
- package/dist/registry-context.d.ts.map +1 -0
- package/dist/registry-context.js +13 -0
- package/dist/registry-context.js.map +1 -0
- package/dist/schema-sync.d.ts +2 -0
- package/dist/schema-sync.d.ts.map +1 -0
- package/dist/schema-sync.js +13 -0
- package/dist/schema-sync.js.map +1 -0
- package/dist/temporal.d.ts +21 -0
- package/dist/temporal.d.ts.map +1 -0
- package/dist/temporal.js +39 -0
- package/dist/temporal.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createReadStream, existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { discoverPluginAssets } from './plugin-discovery.js';
|
|
4
|
+
import { getPlugins, readDisabled } from './plugin-runtime.js';
|
|
5
|
+
const nmRoot = () => join(process.cwd(), 'node_modules');
|
|
6
|
+
// requested filename → key in package.json#coffer
|
|
7
|
+
const ASSET_KEY = { 'schema.js': 'schema', 'web.js': 'web', 'web.css': 'css' };
|
|
8
|
+
export async function registerPluginsApi(app) {
|
|
9
|
+
// Single /api/plugins manifest serving TWO consumers:
|
|
10
|
+
// • the web federation loader — reads `enabled` + `schema`/`web`/`css` URLs;
|
|
11
|
+
// • the admin SettingsPage — reads `enabled`/`vaults`/`extends`/`hasSettings`.
|
|
12
|
+
// Returns ALL discovered plugins (loader filters by `enabled` itself). Toggling
|
|
13
|
+
// is the canonical PATCH /api/plugins/:id (dependency-validated, in index.ts).
|
|
14
|
+
app.get('/api/plugins', async () => {
|
|
15
|
+
const [plugins, assets, disabled] = await Promise.all([getPlugins(), discoverPluginAssets(), readDisabled()]);
|
|
16
|
+
const assetById = new Map(assets.map((a) => [a.id, a]));
|
|
17
|
+
return plugins.map((p) => {
|
|
18
|
+
const a = assetById.get(p.id);
|
|
19
|
+
return {
|
|
20
|
+
id: p.id,
|
|
21
|
+
version: p.version,
|
|
22
|
+
dependsOn: p.dependsOn,
|
|
23
|
+
enabled: !disabled.has(p.id),
|
|
24
|
+
vaults: (p.vaults ?? []).map((v) => v.meta.id),
|
|
25
|
+
extends: (p.extends_ ?? []).map((e) => e.id),
|
|
26
|
+
hasSettings: Boolean(p.settings && p.settings.fields.length > 0),
|
|
27
|
+
schema: a?.schema,
|
|
28
|
+
web: a?.web,
|
|
29
|
+
css: a?.css,
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
// Serve a plugin's built asset from node_modules: /plugins/<id>/<file>
|
|
34
|
+
app.get('/plugins/:id/:file', async (req, reply) => {
|
|
35
|
+
const { id, file } = req.params;
|
|
36
|
+
const key = ASSET_KEY[file];
|
|
37
|
+
if (!key)
|
|
38
|
+
return reply.code(404).send({ error: 'unknown_asset' });
|
|
39
|
+
const rec = (await discoverPluginAssets()).find((a) => a.id === id);
|
|
40
|
+
if (!rec)
|
|
41
|
+
return reply.code(404).send({ error: 'unknown_plugin' });
|
|
42
|
+
const pkg = JSON.parse(readFileSync(join(nmRoot(), rec.packageName, 'package.json'), 'utf8'));
|
|
43
|
+
const rel = pkg.coffer?.[key];
|
|
44
|
+
if (!rel)
|
|
45
|
+
return reply.code(404).send({ error: 'asset_not_built' });
|
|
46
|
+
const abs = join(nmRoot(), rec.packageName, rel);
|
|
47
|
+
if (!existsSync(abs))
|
|
48
|
+
return reply.code(404).send({ error: 'asset_missing' });
|
|
49
|
+
reply.type(file.endsWith('.css') ? 'text/css' : 'text/javascript');
|
|
50
|
+
return reply.send(createReadStream(abs));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=plugins-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins-api.js","sourceRoot":"","sources":["../src/plugins-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Серверний реєстр-контекст: активний composeRegistry, заданий на boot (initPlugins).
|
|
3
|
+
* Розриває цикл server→@registry(app root)→plugins→server. getModule/getExtendsFor
|
|
4
|
+
* беруться звідси (делегують у рантайм-реєстр), а не зі статичного src/registry.ts.
|
|
5
|
+
*/
|
|
6
|
+
import type { Registry } from '@coffer-org/core/compose';
|
|
7
|
+
/** Встановлюється раз на boot із initPlugins(). */
|
|
8
|
+
export declare function setActiveRegistry(reg: Registry): void;
|
|
9
|
+
export declare const getModule: Registry['getModule'];
|
|
10
|
+
export declare const getExtendsFor: Registry['getExtendsFor'];
|
|
11
|
+
//# sourceMappingURL=registry-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-context.d.ts","sourceRoot":"","sources":["../src/registry-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAIzD,mDAAmD;AACnD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAErD;AAOD,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAyD,CAAC;AACtG,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,eAAe,CAA6D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
let active = null;
|
|
2
|
+
/** Встановлюється раз на boot із initPlugins(). */
|
|
3
|
+
export function setActiveRegistry(reg) {
|
|
4
|
+
active = reg;
|
|
5
|
+
}
|
|
6
|
+
function current() {
|
|
7
|
+
if (!active)
|
|
8
|
+
throw new Error('[registry-context] реєстр ще не ініціалізовано (виклич setActiveRegistry)');
|
|
9
|
+
return active;
|
|
10
|
+
}
|
|
11
|
+
export const getModule = (vault, module) => current().getModule(vault, module);
|
|
12
|
+
export const getExtendsFor = (vault, module) => current().getExtendsFor(vault, module);
|
|
13
|
+
//# sourceMappingURL=registry-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-context.js","sourceRoot":"","sources":["../src/registry-context.ts"],"names":[],"mappings":"AAOA,IAAI,MAAM,GAAoB,IAAI,CAAC;AAEnC,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,GAAa;IAC7C,MAAM,GAAG,GAAG,CAAC;AACf,CAAC;AAED,SAAS,OAAO;IACd,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC1G,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACtG,MAAM,CAAC,MAAM,aAAa,GAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sync.d.ts","sourceRoot":"","sources":["../src/schema-sync.ts"],"names":[],"mappings":"AAUA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Синхронізація схеми БД зі схемами сутностей у рантаймі (без міграцій).
|
|
3
|
+
*
|
|
4
|
+
* safe:false — повний синк колонок ВІДОМИХ таблиць (додавання + видалення);
|
|
5
|
+
* видалене з f.* поле → колонка дропається при наступному старті.
|
|
6
|
+
* dropTables:false — таблиці, невідомі ORM (purge-нуті/вимкнені плагіни, legacy),
|
|
7
|
+
* не чіпаються ніколи. Дроп таблиць — лише явний purge.
|
|
8
|
+
*/
|
|
9
|
+
import { getOrm } from './db.js';
|
|
10
|
+
export async function syncSchema() {
|
|
11
|
+
await getOrm().schema.update({ safe: false, dropTables: false });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=schema-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sync.js","sourceRoot":"","sources":["../src/schema-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date-маршалінг для datetime-полів (ColumnType 'datetime' → MikroORM DateTimeType).
|
|
3
|
+
*
|
|
4
|
+
* MikroORM DateTimeType у runtime оперує JS Date; клієнт/zod працюють із рядком
|
|
5
|
+
* 'YYYY-MM-DDTHH:MM'. Тут — єдина точка перетворення в обидва боки.
|
|
6
|
+
*
|
|
7
|
+
* УВАГА: round-trip тримається у UTC. encode інтерпретує вхідний рядок як UTC
|
|
8
|
+
* ('…:00Z'), decode читає UTC-компоненти Date. Тому серверна TZ не зсуває значення.
|
|
9
|
+
* Стосується ЛИШЕ single datetime (column === 'datetime'); multiple → column 'text'
|
|
10
|
+
* (JSON-масив рядків) і тут не зачіпається.
|
|
11
|
+
*/
|
|
12
|
+
import type { ModuleDef } from '@coffer-org/sdk/module';
|
|
13
|
+
/** 'YYYY-MM-DDTHH:MM' → Date (UTC). */
|
|
14
|
+
export declare function dtStringToDate(s: string): Date;
|
|
15
|
+
/** Date (будь-який ISO) → 'YYYY-MM-DDTHH:MM' за UTC-компонентами. */
|
|
16
|
+
export declare function dateToDtString(d: Date): string;
|
|
17
|
+
/** Рядок→Date для datetime-полів перед записом (ідемпотентно: Date лишається Date). */
|
|
18
|
+
export declare function encodeTemporal(m: ModuleDef, row: Record<string, unknown>): Record<string, unknown>;
|
|
19
|
+
/** Date→рядок для datetime-полів після читання (ідемпотентно: рядок лишається рядком). */
|
|
20
|
+
export declare function decodeTemporal(m: ModuleDef, row: Record<string, unknown>): Record<string, unknown>;
|
|
21
|
+
//# sourceMappingURL=temporal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.d.ts","sourceRoot":"","sources":["../src/temporal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAM9C;AAQD,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOlG;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQlG"}
|
package/dist/temporal.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { fieldMap } from '@coffer-org/sdk/module';
|
|
2
|
+
/** 'YYYY-MM-DDTHH:MM' → Date (UTC). */
|
|
3
|
+
export function dtStringToDate(s) {
|
|
4
|
+
return new Date(`${s}:00Z`);
|
|
5
|
+
}
|
|
6
|
+
/** Date (будь-який ISO) → 'YYYY-MM-DDTHH:MM' за UTC-компонентами. */
|
|
7
|
+
export function dateToDtString(d) {
|
|
8
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
9
|
+
return (`${d.getUTCFullYear()}-${p(d.getUTCMonth() + 1)}-${p(d.getUTCDate())}` +
|
|
10
|
+
`T${p(d.getUTCHours())}:${p(d.getUTCMinutes())}`);
|
|
11
|
+
}
|
|
12
|
+
/** Ключі single-datetime полів модуля. */
|
|
13
|
+
function datetimeKeys(m) {
|
|
14
|
+
const fm = fieldMap(m.fields);
|
|
15
|
+
return Object.keys(fm).filter((k) => fm[k]?.column === 'datetime');
|
|
16
|
+
}
|
|
17
|
+
/** Рядок→Date для datetime-полів перед записом (ідемпотентно: Date лишається Date). */
|
|
18
|
+
export function encodeTemporal(m, row) {
|
|
19
|
+
const out = { ...row };
|
|
20
|
+
for (const k of datetimeKeys(m)) {
|
|
21
|
+
const v = out[k];
|
|
22
|
+
if (typeof v === 'string' && v)
|
|
23
|
+
out[k] = dtStringToDate(v);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
/** Date→рядок для datetime-полів після читання (ідемпотентно: рядок лишається рядком). */
|
|
28
|
+
export function decodeTemporal(m, row) {
|
|
29
|
+
const out = { ...row };
|
|
30
|
+
for (const k of datetimeKeys(m)) {
|
|
31
|
+
const v = out[k];
|
|
32
|
+
if (v instanceof Date)
|
|
33
|
+
out[k] = dateToDtString(v);
|
|
34
|
+
else if (typeof v === 'string' && v.length > 16)
|
|
35
|
+
out[k] = dateToDtString(new Date(v));
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","sourceRoot":"","sources":["../src/temporal.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,uCAAuC;AACvC,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,CAAO;IACpC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CACL,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE;QACtE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,EAAE,CACjD,CAAC;AACJ,CAAC;AAED,0CAA0C;AAC1C,SAAS,YAAY,CAAC,CAAY;IAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC;AACrE,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,CAAY,EAAE,GAA4B;IACvE,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,CAAY,EAAE,GAA4B;IACvE,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,YAAY,IAAI;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;aAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@coffer-org/server",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist"
|
|
7
|
+
],
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./*": {
|
|
14
|
+
"types": "./dist/*.d.ts",
|
|
15
|
+
"default": "./dist/*.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -b tsconfig.build.json",
|
|
20
|
+
"prepack": "npm run build && node ../../scripts/swap-exports.mjs dist",
|
|
21
|
+
"postpack": "node ../../scripts/swap-exports.mjs src"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@coffer-org/sdk": "^1.1.0",
|
|
25
|
+
"@coffer-org/core": "^1.1.0",
|
|
26
|
+
"fastify": "^5.2.1",
|
|
27
|
+
"@fastify/cors": "^11.2.0",
|
|
28
|
+
"@fastify/multipart": "^10.0.0",
|
|
29
|
+
"@fastify/static": "^9.1.3",
|
|
30
|
+
"@mikro-orm/core": "^7.1.4",
|
|
31
|
+
"@mikro-orm/sqlite": "^7.1.4",
|
|
32
|
+
"zod": "^4.4.3"
|
|
33
|
+
}
|
|
34
|
+
}
|