Closes the architecture item from the #119 review: drop the "vendored from docmost-sync" framing and the CJS↔ESM `Function('import()')` bridge so the engine is a normal first-class gitmost package. Part 1 — vendoring markers removed (prose only, zero behavior change): reworded "VENDORED into gitmost" / "vendored from docmost-sync" / "Engine LOGIC is byte-identical" / "it's a port" comments across the engine. Behavior-bearing strings are untouched: BOT_AUTHOR_NAME/EMAIL and the `Docmost-Sync-Source:` provenance trailers (changing them would break git authorship + the loop-guard). Part 2 — the package is now ESM (matching the sibling @docmost/mcp): `type: module`, tsconfig Node16, `.js` extensions on relative imports, and a static `import { marked }` replacing the `new Function('return import(...)')` / `loadMarked` hack — the bridge is GONE from the package. The CommonJS NestJS server loads the now-ESM engine via a new `git-sync.loader.ts` that mirrors the existing `docmost-client.loader.ts` mcp loader exactly (Function-indirected dynamic import + cached promise + retry-on-reject). The 4 server consumers (orchestrator/datasource/vault-registry/git-http-backend) call `await loadGitSync()` for value exports; types stay `import type` (erased). The converter-gate spec — which needs the real converter — loads the package's TS source via a jest moduleNameMapper + isolatedModules (documented in that spec); the other git-sync specs mock the loader. Verified: engine builds pure ESM (no Function/require leftover), vitest 614, editor-ext build, server + client tsc, full server jest 1397/0. Live stand smoke-test: server starts clean on the ESM engine (no ERR_REQUIRE_ESM), a real sync cycle runs through the loader, and the basic e2e suite is 12/12 (clone via git-http-backend, push, pull, delete, 3-way merge — all through the new loader). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
69 lines
2.6 KiB
TypeScript
69 lines
2.6 KiB
TypeScript
/**
|
|
* Engine settings.
|
|
*
|
|
* The engine is driven IN-PROCESS by the NestJS server, which builds the
|
|
* `Settings` object from `EnvironmentService` — so this module must NOT reach
|
|
* into `process.env`. It exposes only:
|
|
* - the `Settings` type the engine consumes, and
|
|
* - `parseSettings(env)` as a PURE function (validate a raw env object -> typed
|
|
* `Settings`), kept for unit tests and for the server to reuse if it wants
|
|
* to validate an env-shaped object.
|
|
* There is no `.env`-loading side-effecting entry point.
|
|
*/
|
|
import { z } from 'zod';
|
|
|
|
// Schema keyed by the real ENV variable names so validation errors name the
|
|
// exact variable. Credentials and the address of our OWN Docmost instance have
|
|
// NO default — a missing value must fail at startup, never silently fall back.
|
|
export const envSchema = z.object({
|
|
// Docmost connection — address of our own instance, no default.
|
|
DOCMOST_API_URL: z.string().url(),
|
|
// Credentials for /auth/login — no default, never hardcoded.
|
|
DOCMOST_EMAIL: z.string().min(1),
|
|
DOCMOST_PASSWORD: z.string().min(1),
|
|
// Which Docmost space to mirror.
|
|
DOCMOST_SPACE_ID: z.string().min(1),
|
|
|
|
// Local git vault (state store) — kept under data/ so the volume persists it.
|
|
VAULT_PATH: z.string().min(1).default('data/vault'),
|
|
// Optional git remote the vault pushes to. Empty string is treated as unset.
|
|
GIT_REMOTE: z.preprocess(
|
|
(v) => (v === '' ? undefined : v),
|
|
z.string().min(1).optional(),
|
|
),
|
|
|
|
// Non-secret tunables — sensible defaults are fine.
|
|
POLL_INTERVAL_MS: z.coerce.number().int().positive().default(15000),
|
|
DEBOUNCE_MS: z.coerce.number().int().positive().default(2000),
|
|
LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
});
|
|
|
|
export type Settings = {
|
|
docmostApiUrl: string;
|
|
docmostEmail: string;
|
|
docmostPassword: string;
|
|
docmostSpaceId: string;
|
|
vaultPath: string;
|
|
gitRemote?: string;
|
|
pollIntervalMs: number;
|
|
debounceMs: number;
|
|
logLevel: 'debug' | 'info' | 'warn' | 'error';
|
|
};
|
|
|
|
// Pure: validate a raw environment object and map it to a typed Settings.
|
|
// Throws ZodError on bad config. No side effects — safe to import in tests.
|
|
export function parseSettings(env: NodeJS.ProcessEnv): Settings {
|
|
const e = envSchema.parse(env);
|
|
return {
|
|
docmostApiUrl: e.DOCMOST_API_URL,
|
|
docmostEmail: e.DOCMOST_EMAIL,
|
|
docmostPassword: e.DOCMOST_PASSWORD,
|
|
docmostSpaceId: e.DOCMOST_SPACE_ID,
|
|
vaultPath: e.VAULT_PATH,
|
|
gitRemote: e.GIT_REMOTE,
|
|
pollIntervalMs: e.POLL_INTERVAL_MS,
|
|
debounceMs: e.DEBOUNCE_MS,
|
|
logLevel: e.LOG_LEVEL,
|
|
};
|
|
}
|