@cogenta/core 0.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/cache/entry.d.ts +32 -0
- package/dist/cache/entry.d.ts.map +1 -0
- package/dist/cache/entry.js +72 -0
- package/dist/cache/entry.js.map +1 -0
- package/dist/cache/file.d.ts +16 -0
- package/dist/cache/file.d.ts.map +1 -0
- package/dist/cache/file.js +191 -0
- package/dist/cache/file.js.map +1 -0
- package/dist/cache/index.d.ts +20 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +25 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory.d.ts +11 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +89 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/redis.d.ts +54 -0
- package/dist/cache/redis.d.ts.map +1 -0
- package/dist/cache/redis.js +167 -0
- package/dist/cache/redis.js.map +1 -0
- package/dist/cache/types.d.ts +37 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/config/define-config.d.ts +19 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +20 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/env.d.ts +30 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +139 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load-config.d.ts +30 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +83 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/resolve-config.d.ts +14 -0
- package/dist/config/resolve-config.d.ts.map +1 -0
- package/dist/config/resolve-config.js +146 -0
- package/dist/config/resolve-config.js.map +1 -0
- package/dist/config/schema.d.ts +68 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +75 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +126 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/db/dialect.d.ts +64 -0
- package/dist/db/dialect.d.ts.map +1 -0
- package/dist/db/dialect.js +147 -0
- package/dist/db/dialect.js.map +1 -0
- package/dist/db/drizzle.d.ts +35 -0
- package/dist/db/drizzle.d.ts.map +1 -0
- package/dist/db/drizzle.js +128 -0
- package/dist/db/drizzle.js.map +1 -0
- package/dist/db/index.d.ts +28 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +30 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/mysql.d.ts +39 -0
- package/dist/db/mysql.d.ts.map +1 -0
- package/dist/db/mysql.js +224 -0
- package/dist/db/mysql.js.map +1 -0
- package/dist/db/postgres.d.ts +47 -0
- package/dist/db/postgres.d.ts.map +1 -0
- package/dist/db/postgres.js +174 -0
- package/dist/db/postgres.js.map +1 -0
- package/dist/db/sqlite.d.ts +41 -0
- package/dist/db/sqlite.d.ts.map +1 -0
- package/dist/db/sqlite.js +213 -0
- package/dist/db/sqlite.js.map +1 -0
- package/dist/db/types.d.ts +71 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/drivers/index.d.ts +5 -0
- package/dist/drivers/index.d.ts.map +1 -0
- package/dist/drivers/index.js +3 -0
- package/dist/drivers/index.js.map +1 -0
- package/dist/drivers/registry.d.ts +27 -0
- package/dist/drivers/registry.d.ts.map +1 -0
- package/dist/drivers/registry.js +162 -0
- package/dist/drivers/registry.js.map +1 -0
- package/dist/drivers/types.d.ts +59 -0
- package/dist/drivers/types.d.ts.map +1 -0
- package/dist/drivers/types.js +2 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/errors/codes.d.ts +8 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +201 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/cogenta-error.d.ts +38 -0
- package/dist/errors/cogenta-error.d.ts.map +1 -0
- package/dist/errors/cogenta-error.js +31 -0
- package/dist/errors/cogenta-error.js.map +1 -0
- package/dist/errors/index.d.ts +5 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/id.d.ts +5 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +82 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/index.d.ts +5 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +4 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +10 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +108 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/redact.d.ts +12 -0
- package/dist/logger/redact.d.ts.map +1 -0
- package/dist/logger/redact.js +96 -0
- package/dist/logger/redact.js.map +1 -0
- package/dist/logger/types.d.ts +32 -0
- package/dist/logger/types.d.ts.map +1 -0
- package/dist/logger/types.js +3 -0
- package/dist/logger/types.js.map +1 -0
- package/dist/media/format-sniff.d.ts +22 -0
- package/dist/media/format-sniff.d.ts.map +1 -0
- package/dist/media/format-sniff.js +77 -0
- package/dist/media/format-sniff.js.map +1 -0
- package/dist/media/index.d.ts +5 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +4 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/store.d.ts +13 -0
- package/dist/media/store.d.ts.map +1 -0
- package/dist/media/store.js +211 -0
- package/dist/media/store.js.map +1 -0
- package/dist/media/types.d.ts +70 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/types.js +2 -0
- package/dist/media/types.js.map +1 -0
- package/dist/migrations/index.d.ts +4 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migrator.d.ts +18 -0
- package/dist/migrations/migrator.d.ts.map +1 -0
- package/dist/migrations/migrator.js +247 -0
- package/dist/migrations/migrator.js.map +1 -0
- package/dist/migrations/types.d.ts +63 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +2 -0
- package/dist/migrations/types.js.map +1 -0
- package/dist/queue/bullmq.d.ts +119 -0
- package/dist/queue/bullmq.d.ts.map +1 -0
- package/dist/queue/bullmq.js +391 -0
- package/dist/queue/bullmq.js.map +1 -0
- package/dist/queue/database.d.ts +17 -0
- package/dist/queue/database.d.ts.map +1 -0
- package/dist/queue/database.js +242 -0
- package/dist/queue/database.js.map +1 -0
- package/dist/queue/index.d.ts +7 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +4 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/types.d.ts +61 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +2 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +17 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/key.d.ts +12 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +43 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +23 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +204 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/s3.d.ts +54 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +240 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/types.d.ts +45 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { CogentaError } from '../errors/index.js';
|
|
2
|
+
import { assertKey, decodeEntry, encodeEntry, expiryFrom, isExpired } from './entry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Loads the client if the host application installed it. Absent is a normal
|
|
5
|
+
* outcome, not an error: it is what makes the registry fall through to the file
|
|
6
|
+
* driver, and what lets `pnpm install` stay dependency-free (rule R1).
|
|
7
|
+
*/
|
|
8
|
+
export async function loadRedisModule() {
|
|
9
|
+
try {
|
|
10
|
+
return (await import('@redis/client'));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function createRedisCache(options) {
|
|
17
|
+
const now = options.now ?? Date.now;
|
|
18
|
+
const prefix = options.prefix ?? 'cogenta:cache:';
|
|
19
|
+
const { client } = options;
|
|
20
|
+
const entryKey = (key) => `${prefix}e:${key}`;
|
|
21
|
+
const tagKey = (tag) => `${prefix}t:${tag}`;
|
|
22
|
+
async function readEntry(key) {
|
|
23
|
+
const raw = await client.get(entryKey(key));
|
|
24
|
+
if (raw === null)
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
return decodeEntry(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function untag(key) {
|
|
34
|
+
const entry = await readEntry(key);
|
|
35
|
+
for (const tag of entry?.tags ?? [])
|
|
36
|
+
await client.sRem(tagKey(tag), [key]);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
get: async (key) => {
|
|
40
|
+
assertKey(key);
|
|
41
|
+
const entry = await readEntry(key);
|
|
42
|
+
if (entry === null)
|
|
43
|
+
return null;
|
|
44
|
+
// Expiry is checked here as well as delegated to Redis. Redis expires on
|
|
45
|
+
// wall-clock time it owns; checking the stored instant is what makes this
|
|
46
|
+
// driver behave identically to the others, contract suite included.
|
|
47
|
+
if (isExpired(entry.expiresAt, now())) {
|
|
48
|
+
await client.del([entryKey(key)]);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return entry.value;
|
|
52
|
+
},
|
|
53
|
+
set: async (key, value, setOptions) => {
|
|
54
|
+
assertKey(key);
|
|
55
|
+
const expiresAt = expiryFrom(setOptions?.ttl, now());
|
|
56
|
+
const tags = [...new Set(setOptions?.tags ?? [])];
|
|
57
|
+
const payload = encodeEntry(value, expiresAt, tags);
|
|
58
|
+
await untag(key);
|
|
59
|
+
// PX lets Redis reclaim the memory on its own clock. The authoritative
|
|
60
|
+
// check stays in `get`.
|
|
61
|
+
const ttlMs = setOptions?.ttl === undefined ? undefined : setOptions.ttl * 1000;
|
|
62
|
+
await client.set(entryKey(key), payload, ttlMs === undefined ? {} : { PX: ttlMs });
|
|
63
|
+
for (const tag of tags)
|
|
64
|
+
await client.sAdd(tagKey(tag), [key]);
|
|
65
|
+
},
|
|
66
|
+
delete: async (key) => {
|
|
67
|
+
assertKey(key);
|
|
68
|
+
await untag(key);
|
|
69
|
+
await client.del([entryKey(key)]);
|
|
70
|
+
},
|
|
71
|
+
invalidateTags: async (tags) => {
|
|
72
|
+
for (const tag of tags) {
|
|
73
|
+
const keys = await client.sMembers(tagKey(tag));
|
|
74
|
+
if (keys.length > 0)
|
|
75
|
+
await client.del(keys.map(entryKey));
|
|
76
|
+
await client.del([tagKey(tag)]);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
clear: async () => {
|
|
80
|
+
// SCAN, never FLUSHDB: this Redis may be serving other things, and a cache
|
|
81
|
+
// driver that wipes someone else's data is an incident, not a clear.
|
|
82
|
+
let cursor = '0';
|
|
83
|
+
do {
|
|
84
|
+
const result = await client.scan(cursor, { MATCH: `${prefix}*`, COUNT: 500 });
|
|
85
|
+
cursor = String(result.cursor);
|
|
86
|
+
if (result.keys.length > 0)
|
|
87
|
+
await client.del(result.keys);
|
|
88
|
+
} while (cursor !== '0');
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function redisCacheDriver(options = {}) {
|
|
93
|
+
let client;
|
|
94
|
+
let url;
|
|
95
|
+
async function open(config) {
|
|
96
|
+
const module = await loadRedisModule();
|
|
97
|
+
if (module === null) {
|
|
98
|
+
throw new CogentaError({
|
|
99
|
+
code: 'DRIVER_INIT_FAILED',
|
|
100
|
+
message: 'The Redis cache driver needs the "@redis/client" package.',
|
|
101
|
+
hint: 'Run `pnpm add @redis/client`, or leave cache.driver unset to use the file cache.',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
url = config.url;
|
|
105
|
+
const created = module.createClient(url === undefined ? {} : { url });
|
|
106
|
+
await created.connect();
|
|
107
|
+
return created;
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
name: 'redis',
|
|
111
|
+
tier: 'optimal',
|
|
112
|
+
// Does Redis actually answer? Not "is a URL configured?" — the difference is
|
|
113
|
+
// what turns a graceful fallback into a startup crash.
|
|
114
|
+
available: async (config) => {
|
|
115
|
+
if (config.url === undefined)
|
|
116
|
+
return false;
|
|
117
|
+
try {
|
|
118
|
+
const probe = await open(config);
|
|
119
|
+
await probe.ping();
|
|
120
|
+
await probe.quit();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
init: async (config) => {
|
|
128
|
+
client ??= await open(config);
|
|
129
|
+
return createRedisCache({ ...options, client });
|
|
130
|
+
},
|
|
131
|
+
dispose: async () => {
|
|
132
|
+
try {
|
|
133
|
+
await client?.quit();
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Shutdown must not fail because the connection already dropped.
|
|
137
|
+
}
|
|
138
|
+
client = undefined;
|
|
139
|
+
},
|
|
140
|
+
health: async () => {
|
|
141
|
+
if (client === undefined) {
|
|
142
|
+
return { status: 'down', driver: 'redis', tier: 'optimal', message: 'Not connected.' };
|
|
143
|
+
}
|
|
144
|
+
const startedAt = Date.now();
|
|
145
|
+
try {
|
|
146
|
+
await client.ping();
|
|
147
|
+
return {
|
|
148
|
+
status: 'ok',
|
|
149
|
+
driver: 'redis',
|
|
150
|
+
tier: 'optimal',
|
|
151
|
+
latencyMs: Date.now() - startedAt,
|
|
152
|
+
// The URL is not reported: it routinely carries a password.
|
|
153
|
+
message: 'Connected.',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return {
|
|
158
|
+
status: 'down',
|
|
159
|
+
driver: 'redis',
|
|
160
|
+
tier: 'optimal',
|
|
161
|
+
message: error instanceof Error ? error.message : 'Redis did not answer.',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface CacheSetOptions {
|
|
2
|
+
/** Seconds. Absent means "until invalidated". */
|
|
3
|
+
readonly ttl?: number;
|
|
4
|
+
/** Labels this entry belongs to, for bulk invalidation. */
|
|
5
|
+
readonly tags?: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A key/value cache.
|
|
9
|
+
*
|
|
10
|
+
* `invalidateTags` is **mandatory in every implementation**, including the ones
|
|
11
|
+
* with no server behind them. Content caching is only correct if a publish can
|
|
12
|
+
* drop every page that embedded the changed content; bolting that on later means
|
|
13
|
+
* rewriting each driver, so it is part of the interface from the first day.
|
|
14
|
+
*
|
|
15
|
+
* Values round-trip through serialisation in every driver, including `memory`.
|
|
16
|
+
* Handing back a live reference would let a caller mutate the cache by accident
|
|
17
|
+
* on one driver and not on another — the kind of divergence that only shows up
|
|
18
|
+
* in production, on the driver you did not develop against.
|
|
19
|
+
*/
|
|
20
|
+
export interface CacheDriver {
|
|
21
|
+
get<T>(key: string): Promise<T | null>;
|
|
22
|
+
set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;
|
|
23
|
+
delete(key: string): Promise<void>;
|
|
24
|
+
invalidateTags(tags: readonly string[]): Promise<void>;
|
|
25
|
+
clear(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/** The resolved `cache` section of the configuration. */
|
|
28
|
+
export interface CacheConfig {
|
|
29
|
+
readonly driver?: string;
|
|
30
|
+
readonly url?: string | undefined;
|
|
31
|
+
readonly path?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CacheDriverOptions {
|
|
34
|
+
/** Injected so tests can expire entries without waiting. Milliseconds. */
|
|
35
|
+
readonly now?: () => number;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CogentaConfigInput } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Identity function whose only job is to give `cogenta.config.ts` full type
|
|
4
|
+
* checking and editor completion.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { defineConfig } from '@cogenta/core'
|
|
8
|
+
*
|
|
9
|
+
* export default defineConfig({
|
|
10
|
+
* site: { name: 'My site', url: 'https://example.com' },
|
|
11
|
+
* database: { url: process.env.DATABASE_URL ?? './.cogenta/site.db' },
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Secrets are rejected here at compile time and again at startup: they belong
|
|
16
|
+
* in the environment, never in this file.
|
|
17
|
+
*/
|
|
18
|
+
export declare function defineConfig(config: CogentaConfigInput): CogentaConfigInput;
|
|
19
|
+
//# sourceMappingURL=define-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAE3E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity function whose only job is to give `cogenta.config.ts` full type
|
|
3
|
+
* checking and editor completion.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { defineConfig } from '@cogenta/core'
|
|
7
|
+
*
|
|
8
|
+
* export default defineConfig({
|
|
9
|
+
* site: { name: 'My site', url: 'https://example.com' },
|
|
10
|
+
* database: { url: process.env.DATABASE_URL ?? './.cogenta/site.db' },
|
|
11
|
+
* })
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Secrets are rejected here at compile time and again at startup: they belong
|
|
15
|
+
* in the environment, never in this file.
|
|
16
|
+
*/
|
|
17
|
+
export function defineConfig(config) {
|
|
18
|
+
return config;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=define-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Environment } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Keys that must never appear in `cogenta.config.ts`, mapped to the environment
|
|
4
|
+
* variable that supplies them instead. The config file is committed to git; a
|
|
5
|
+
* secret in it is a secret in every clone, forever (rule R7).
|
|
6
|
+
*/
|
|
7
|
+
export declare const SECRET_KEYS: ReadonlyMap<string, string>;
|
|
8
|
+
/**
|
|
9
|
+
* Overlays environment variables on top of the config file. Precedence is
|
|
10
|
+
* defaults → file → environment, so an operator can retarget a deployment
|
|
11
|
+
* without editing committed code.
|
|
12
|
+
*
|
|
13
|
+
* Secrets are deliberately *not* merged here: they are injected after
|
|
14
|
+
* validation, so they never pass through the schema or an error message.
|
|
15
|
+
*/
|
|
16
|
+
export declare function applyEnv(input: Record<string, unknown>, env: Environment): Record<string, unknown>;
|
|
17
|
+
export interface EnvironmentSecrets {
|
|
18
|
+
readonly llmApiKey: string | undefined;
|
|
19
|
+
readonly storageAccessKeyId: string | undefined;
|
|
20
|
+
readonly storageSecretAccessKey: string | undefined;
|
|
21
|
+
/** Signs @cogenta/auth's MFA tickets. Never in the config file — there is no `auth` section to put it in, on purpose. */
|
|
22
|
+
readonly authSigningKey: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
export declare function readSecrets(env: Environment): EnvironmentSecrets;
|
|
25
|
+
/**
|
|
26
|
+
* Finds secrets written into the config file. Returns the dotted paths, never
|
|
27
|
+
* the values — an error message must not leak what it is complaining about.
|
|
28
|
+
*/
|
|
29
|
+
export declare function findSecretsInFile(input: Record<string, unknown>): readonly string[];
|
|
30
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAIlD,CAAA;AA8BF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,WAAW,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4EzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAA;IACnD,yHAAyH;IACzH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB,CAOhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,MAAM,EAAE,CAUnF"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keys that must never appear in `cogenta.config.ts`, mapped to the environment
|
|
3
|
+
* variable that supplies them instead. The config file is committed to git; a
|
|
4
|
+
* secret in it is a secret in every clone, forever (rule R7).
|
|
5
|
+
*/
|
|
6
|
+
export const SECRET_KEYS = new Map([
|
|
7
|
+
['llm.apiKey', 'COGENTA_LLM_API_KEY'],
|
|
8
|
+
['storage.accessKeyId', 'COGENTA_STORAGE_ACCESS_KEY_ID'],
|
|
9
|
+
['storage.secretAccessKey', 'COGENTA_STORAGE_SECRET_ACCESS_KEY'],
|
|
10
|
+
]);
|
|
11
|
+
/** First variable that is set and not empty. An empty variable means "unset". */
|
|
12
|
+
function read(env, ...names) {
|
|
13
|
+
for (const name of names) {
|
|
14
|
+
const value = env[name];
|
|
15
|
+
if (value !== undefined && value.trim() !== '')
|
|
16
|
+
return value.trim();
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function isPlainObject(value) {
|
|
21
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reads a section for merging. A section that exists but is not an object is
|
|
25
|
+
* returned untouched, so the schema can report "expected object" rather than a
|
|
26
|
+
* misleading list of missing fields.
|
|
27
|
+
*/
|
|
28
|
+
function section(input, key) {
|
|
29
|
+
const current = input[key];
|
|
30
|
+
if (current === undefined)
|
|
31
|
+
return {};
|
|
32
|
+
return isPlainObject(current) ? { ...current } : undefined;
|
|
33
|
+
}
|
|
34
|
+
function assign(target, key, value) {
|
|
35
|
+
if (value !== undefined)
|
|
36
|
+
target[key] = value;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Overlays environment variables on top of the config file. Precedence is
|
|
40
|
+
* defaults → file → environment, so an operator can retarget a deployment
|
|
41
|
+
* without editing committed code.
|
|
42
|
+
*
|
|
43
|
+
* Secrets are deliberately *not* merged here: they are injected after
|
|
44
|
+
* validation, so they never pass through the schema or an error message.
|
|
45
|
+
*/
|
|
46
|
+
export function applyEnv(input, env) {
|
|
47
|
+
const output = { ...input };
|
|
48
|
+
const site = section(output, 'site');
|
|
49
|
+
if (site !== undefined) {
|
|
50
|
+
assign(site, 'name', read(env, 'COGENTA_SITE_NAME'));
|
|
51
|
+
assign(site, 'url', read(env, 'COGENTA_SITE_URL'));
|
|
52
|
+
assign(site, 'defaultLocale', read(env, 'COGENTA_SITE_DEFAULT_LOCALE'));
|
|
53
|
+
const locales = read(env, 'COGENTA_SITE_LOCALES');
|
|
54
|
+
if (locales !== undefined) {
|
|
55
|
+
site['locales'] = locales
|
|
56
|
+
.split(',')
|
|
57
|
+
.map((locale) => locale.trim())
|
|
58
|
+
.filter((locale) => locale !== '');
|
|
59
|
+
}
|
|
60
|
+
output['site'] = site;
|
|
61
|
+
}
|
|
62
|
+
const database = section(output, 'database');
|
|
63
|
+
if (database !== undefined) {
|
|
64
|
+
assign(database, 'driver', read(env, 'COGENTA_DATABASE_DRIVER'));
|
|
65
|
+
assign(database, 'url', read(env, 'COGENTA_DATABASE_URL', 'DATABASE_URL'));
|
|
66
|
+
const poolSize = read(env, 'COGENTA_DATABASE_POOL_SIZE');
|
|
67
|
+
if (poolSize !== undefined)
|
|
68
|
+
database['poolSize'] = Number(poolSize);
|
|
69
|
+
output['database'] = database;
|
|
70
|
+
}
|
|
71
|
+
const cache = section(output, 'cache');
|
|
72
|
+
if (cache !== undefined) {
|
|
73
|
+
assign(cache, 'driver', read(env, 'COGENTA_CACHE_DRIVER'));
|
|
74
|
+
assign(cache, 'url', read(env, 'COGENTA_CACHE_URL', 'REDIS_URL'));
|
|
75
|
+
assign(cache, 'path', read(env, 'COGENTA_CACHE_PATH'));
|
|
76
|
+
output['cache'] = cache;
|
|
77
|
+
}
|
|
78
|
+
const queue = section(output, 'queue');
|
|
79
|
+
if (queue !== undefined) {
|
|
80
|
+
assign(queue, 'driver', read(env, 'COGENTA_QUEUE_DRIVER'));
|
|
81
|
+
assign(queue, 'url', read(env, 'COGENTA_QUEUE_URL', 'REDIS_URL'));
|
|
82
|
+
output['queue'] = queue;
|
|
83
|
+
}
|
|
84
|
+
const storage = section(output, 'storage');
|
|
85
|
+
if (storage !== undefined) {
|
|
86
|
+
assign(storage, 'driver', read(env, 'COGENTA_STORAGE_DRIVER'));
|
|
87
|
+
assign(storage, 'bucket', read(env, 'COGENTA_STORAGE_BUCKET'));
|
|
88
|
+
assign(storage, 'region', read(env, 'COGENTA_STORAGE_REGION'));
|
|
89
|
+
assign(storage, 'endpoint', read(env, 'COGENTA_STORAGE_ENDPOINT'));
|
|
90
|
+
assign(storage, 'path', read(env, 'COGENTA_STORAGE_PATH'));
|
|
91
|
+
assign(storage, 'baseUrl', read(env, 'COGENTA_STORAGE_BASE_URL'));
|
|
92
|
+
output['storage'] = storage;
|
|
93
|
+
}
|
|
94
|
+
// The LLM section only comes into existence if someone asked for one: with no
|
|
95
|
+
// provider configured, everything works except the agents (rule R2).
|
|
96
|
+
const llmProvider = read(env, 'COGENTA_LLM_PROVIDER');
|
|
97
|
+
const llm = section(output, 'llm');
|
|
98
|
+
if (llm !== undefined && (output['llm'] !== undefined || llmProvider !== undefined)) {
|
|
99
|
+
assign(llm, 'provider', llmProvider);
|
|
100
|
+
assign(llm, 'model', read(env, 'COGENTA_LLM_MODEL'));
|
|
101
|
+
assign(llm, 'baseUrl', read(env, 'COGENTA_LLM_BASE_URL'));
|
|
102
|
+
output['llm'] = llm;
|
|
103
|
+
}
|
|
104
|
+
const embeddings = section(output, 'embeddings');
|
|
105
|
+
if (embeddings !== undefined) {
|
|
106
|
+
assign(embeddings, 'provider', read(env, 'COGENTA_EMBEDDINGS_PROVIDER'));
|
|
107
|
+
assign(embeddings, 'model', read(env, 'COGENTA_EMBEDDINGS_MODEL'));
|
|
108
|
+
const dimensions = read(env, 'COGENTA_EMBEDDINGS_DIMENSIONS');
|
|
109
|
+
if (dimensions !== undefined)
|
|
110
|
+
embeddings['dimensions'] = Number(dimensions);
|
|
111
|
+
output['embeddings'] = embeddings;
|
|
112
|
+
}
|
|
113
|
+
return output;
|
|
114
|
+
}
|
|
115
|
+
export function readSecrets(env) {
|
|
116
|
+
return {
|
|
117
|
+
llmApiKey: read(env, 'COGENTA_LLM_API_KEY'),
|
|
118
|
+
storageAccessKeyId: read(env, 'COGENTA_STORAGE_ACCESS_KEY_ID'),
|
|
119
|
+
storageSecretAccessKey: read(env, 'COGENTA_STORAGE_SECRET_ACCESS_KEY'),
|
|
120
|
+
authSigningKey: read(env, 'COGENTA_AUTH_SIGNING_KEY'),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Finds secrets written into the config file. Returns the dotted paths, never
|
|
125
|
+
* the values — an error message must not leak what it is complaining about.
|
|
126
|
+
*/
|
|
127
|
+
export function findSecretsInFile(input) {
|
|
128
|
+
const found = [];
|
|
129
|
+
for (const path of SECRET_KEYS.keys()) {
|
|
130
|
+
const [sectionName, key] = path.split('.');
|
|
131
|
+
if (sectionName === undefined || key === undefined)
|
|
132
|
+
continue;
|
|
133
|
+
const target = input[sectionName];
|
|
134
|
+
if (isPlainObject(target) && target[key] !== undefined)
|
|
135
|
+
found.push(path);
|
|
136
|
+
}
|
|
137
|
+
return found;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { defineConfig } from './define-config.js';
|
|
2
|
+
export type { LoadConfigOptions, LoadedConfig } from './load-config.js';
|
|
3
|
+
export { CONFIG_FILE_NAMES, findConfigFile, loadConfig } from './load-config.js';
|
|
4
|
+
export { resolveConfig } from './resolve-config.js';
|
|
5
|
+
export type { CacheDriverName, CogentaConfig, CogentaConfigInput, DatabaseDriverName, EmbeddingsProvider, Environment, QueueDriverName, StorageDriverName, } from './types.js';
|
|
6
|
+
export { CACHE_DRIVERS, DATABASE_DRIVERS, EMBEDDINGS_PROVIDERS, QUEUE_DRIVERS, STORAGE_DRIVERS, } from './types.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,YAAY,EACV,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { defineConfig } from './define-config.js';
|
|
2
|
+
export { CONFIG_FILE_NAMES, findConfigFile, loadConfig } from './load-config.js';
|
|
3
|
+
export { resolveConfig } from './resolve-config.js';
|
|
4
|
+
export { CACHE_DRIVERS, DATABASE_DRIVERS, EMBEDDINGS_PROVIDERS, QUEUE_DRIVERS, STORAGE_DRIVERS, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAWnD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CogentaConfig, Environment } from './types.js';
|
|
2
|
+
/** Checked in order, so a TypeScript config wins over a compiled one. */
|
|
3
|
+
export declare const CONFIG_FILE_NAMES: readonly ['cogenta.config.ts', 'cogenta.config.mts', 'cogenta.config.js', 'cogenta.config.mjs'];
|
|
4
|
+
/**
|
|
5
|
+
* Walks up from `cwd` looking for a config file, the way a package manager
|
|
6
|
+
* looks for a lockfile. Running the CLI from a subdirectory of a project is
|
|
7
|
+
* normal, and failing there would be a papercut on every single use.
|
|
8
|
+
*/
|
|
9
|
+
export declare function findConfigFile(cwd?: string): Promise<string | null>;
|
|
10
|
+
export interface LoadConfigOptions {
|
|
11
|
+
readonly cwd?: string;
|
|
12
|
+
readonly env?: Environment;
|
|
13
|
+
/** Skip the search and load exactly this file. */
|
|
14
|
+
readonly path?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface LoadedConfig {
|
|
17
|
+
readonly config: CogentaConfig;
|
|
18
|
+
/** Null when the configuration came from the environment alone. */
|
|
19
|
+
readonly path: string | null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Finds, imports and resolves the configuration.
|
|
23
|
+
*
|
|
24
|
+
* A missing config file is **not** an error: an environment with
|
|
25
|
+
* `COGENTA_SITE_URL` and `DATABASE_URL` set is a legitimate way to run, and it
|
|
26
|
+
* is how a container is usually configured. What fails is a configuration that
|
|
27
|
+
* cannot produce a valid result, and it fails naming the fields.
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadConfig(options?: LoadConfigOptions): Promise<LoadedConfig>;
|
|
30
|
+
//# sourceMappingURL=load-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../src/config/load-config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE5D,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,YAC5B,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,CACZ,CAAA;AAWV;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAA;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkCvF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { access } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve as resolvePath } from 'node:path';
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
import { CogentaError } from '../errors/index.js';
|
|
6
|
+
import { resolveConfig } from './resolve-config.js';
|
|
7
|
+
/** Checked in order, so a TypeScript config wins over a compiled one. */
|
|
8
|
+
export const CONFIG_FILE_NAMES = [
|
|
9
|
+
'cogenta.config.ts',
|
|
10
|
+
'cogenta.config.mts',
|
|
11
|
+
'cogenta.config.js',
|
|
12
|
+
'cogenta.config.mjs',
|
|
13
|
+
];
|
|
14
|
+
async function exists(path) {
|
|
15
|
+
try {
|
|
16
|
+
await access(path);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Walks up from `cwd` looking for a config file, the way a package manager
|
|
25
|
+
* looks for a lockfile. Running the CLI from a subdirectory of a project is
|
|
26
|
+
* normal, and failing there would be a papercut on every single use.
|
|
27
|
+
*/
|
|
28
|
+
export async function findConfigFile(cwd = process.cwd()) {
|
|
29
|
+
let directory = resolvePath(cwd);
|
|
30
|
+
for (;;) {
|
|
31
|
+
for (const name of CONFIG_FILE_NAMES) {
|
|
32
|
+
const candidate = join(directory, name);
|
|
33
|
+
if (await exists(candidate))
|
|
34
|
+
return candidate;
|
|
35
|
+
}
|
|
36
|
+
const parent = dirname(directory);
|
|
37
|
+
if (parent === directory)
|
|
38
|
+
return null;
|
|
39
|
+
directory = parent;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Finds, imports and resolves the configuration.
|
|
44
|
+
*
|
|
45
|
+
* A missing config file is **not** an error: an environment with
|
|
46
|
+
* `COGENTA_SITE_URL` and `DATABASE_URL` set is a legitimate way to run, and it
|
|
47
|
+
* is how a container is usually configured. What fails is a configuration that
|
|
48
|
+
* cannot produce a valid result, and it fails naming the fields.
|
|
49
|
+
*/
|
|
50
|
+
export async function loadConfig(options = {}) {
|
|
51
|
+
const env = options.env ?? process.env;
|
|
52
|
+
const path = options.path ?? (await findConfigFile(options.cwd));
|
|
53
|
+
if (path === null)
|
|
54
|
+
return { config: resolveConfig({}, env), path: null };
|
|
55
|
+
let module;
|
|
56
|
+
try {
|
|
57
|
+
module = (await import(pathToFileURL(path).href));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new CogentaError({
|
|
61
|
+
code: 'CONFIG_LOAD_FAILED',
|
|
62
|
+
message: `Could not load ${path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
63
|
+
hint: path.endsWith('.ts')
|
|
64
|
+
? 'A TypeScript config needs a Node runtime that strips types, which means Node 22.18 or later. Rename it to cogenta.config.mjs if you are on an older one.'
|
|
65
|
+
: 'Check the file for a syntax error, and that every import it uses is installed.',
|
|
66
|
+
cause: error,
|
|
67
|
+
details: { path },
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (module.default === undefined) {
|
|
71
|
+
throw new CogentaError({
|
|
72
|
+
code: 'CONFIG_INVALID',
|
|
73
|
+
message: `${path} has no default export.`,
|
|
74
|
+
hint: 'Export the configuration as the default: `export default defineConfig({ … })`.',
|
|
75
|
+
details: { path },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Relative paths in the file are relative to the file, not to the shell's
|
|
79
|
+
// working directory: running a command from a subdirectory must reach the same
|
|
80
|
+
// database, cache and media as running it from the project root.
|
|
81
|
+
return { config: resolveConfig(module.default, env, dirname(path)), path };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=load-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../src/config/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;CACZ,CAAA;AAEV,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAEhC,SAAS,CAAC;QACR,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACvC,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAA;QAC/C,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QACrC,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;AACH,CAAC;AAeD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAO,GAAsB,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IAEhE,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAExE,IAAI,MAA6B,CAAA;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAA0B,CAAA;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,kBAAkB,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC5F,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxB,CAAC,CAAC,0JAA0J;gBAC5J,CAAC,CAAC,gFAAgF;YACpF,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,GAAG,IAAI,yBAAyB;YACzC,IAAI,EAAE,gFAAgF;YACtF,OAAO,EAAE,EAAE,IAAI,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,0EAA0E;IAC1E,+EAA+E;IAC/E,iEAAiE;IACjE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CogentaConfig, type Environment } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Turns whatever was written in a config file into the fully resolved
|
|
4
|
+
* configuration the rest of Cogenta consumes.
|
|
5
|
+
*
|
|
6
|
+
* Precedence is defaults → file → environment. An invalid configuration fails
|
|
7
|
+
* here, at startup, naming every offending field at once — never three requests
|
|
8
|
+
* later with a stack trace.
|
|
9
|
+
*
|
|
10
|
+
* `baseDir` is the directory of the config file, when there was one. Relative
|
|
11
|
+
* paths are resolved against it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveConfig(input: unknown, env?: Environment, baseDir?: string): CogentaConfig;
|
|
14
|
+
//# sourceMappingURL=resolve-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-config.d.ts","sourceRoot":"","sources":["../../src/config/resolve-config.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAA;AAoDnB;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,GAAG,GAAE,WAAyB,EAC9B,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CAyFf"}
|