@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,146 @@
|
|
|
1
|
+
import { isAbsolute, resolve as resolvePath } from 'node:path';
|
|
2
|
+
import { CogentaError } from '../errors/index.js';
|
|
3
|
+
import { applyEnv, findSecretsInFile, readSecrets, SECRET_KEYS } from './env.js';
|
|
4
|
+
import { configSchema, formatIssues } from './schema.js';
|
|
5
|
+
import { DATABASE_DRIVERS, } from './types.js';
|
|
6
|
+
const CONFIG_HINT = 'Fix the fields listed above in cogenta.config.ts, or set the matching COGENTA_* ' +
|
|
7
|
+
'environment variables.';
|
|
8
|
+
function isPlainObject(value) {
|
|
9
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Reads the driver from the URL scheme. A single-letter scheme is a Windows
|
|
13
|
+
* drive letter, not a protocol — `C:\site\data.db` is a SQLite path.
|
|
14
|
+
*/
|
|
15
|
+
function inferDatabaseDriver(url) {
|
|
16
|
+
const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(url)?.[1]?.toLowerCase();
|
|
17
|
+
if (scheme === undefined || scheme.length === 1)
|
|
18
|
+
return 'sqlite';
|
|
19
|
+
switch (scheme) {
|
|
20
|
+
case 'postgres':
|
|
21
|
+
case 'postgresql':
|
|
22
|
+
return 'postgres';
|
|
23
|
+
case 'mysql':
|
|
24
|
+
case 'mariadb':
|
|
25
|
+
return 'mysql';
|
|
26
|
+
case 'file':
|
|
27
|
+
case 'sqlite':
|
|
28
|
+
return 'sqlite';
|
|
29
|
+
default:
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves a path written in a config file against the directory that file
|
|
35
|
+
* lives in, rather than against the current working directory.
|
|
36
|
+
*
|
|
37
|
+
* Without this, running a command from a subdirectory silently uses different
|
|
38
|
+
* files: `cogenta migrate status` from `src/` opens an empty `./site.db` next to
|
|
39
|
+
* `src/` and reports every migration as pending, on a database that is already
|
|
40
|
+
* fully migrated. A relative path in a committed config file means "relative to
|
|
41
|
+
* the project", the way it does in every other tool that reads one.
|
|
42
|
+
*
|
|
43
|
+
* A URL is left alone, and so is `:memory:`. A Windows drive letter is not a
|
|
44
|
+
* scheme — the pattern needs two characters before the colon.
|
|
45
|
+
*/
|
|
46
|
+
function againstConfigFile(value, baseDir) {
|
|
47
|
+
if (baseDir === undefined || value === ':memory:')
|
|
48
|
+
return value;
|
|
49
|
+
if (/^[a-z][a-z0-9+.-]+:/i.test(value))
|
|
50
|
+
return value;
|
|
51
|
+
return isAbsolute(value) ? value : resolvePath(baseDir, value);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Turns whatever was written in a config file into the fully resolved
|
|
55
|
+
* configuration the rest of Cogenta consumes.
|
|
56
|
+
*
|
|
57
|
+
* Precedence is defaults → file → environment. An invalid configuration fails
|
|
58
|
+
* here, at startup, naming every offending field at once — never three requests
|
|
59
|
+
* later with a stack trace.
|
|
60
|
+
*
|
|
61
|
+
* `baseDir` is the directory of the config file, when there was one. Relative
|
|
62
|
+
* paths are resolved against it.
|
|
63
|
+
*/
|
|
64
|
+
export function resolveConfig(input, env = process.env, baseDir) {
|
|
65
|
+
if (!isPlainObject(input)) {
|
|
66
|
+
throw new CogentaError({
|
|
67
|
+
code: 'CONFIG_INVALID',
|
|
68
|
+
message: `Cogenta configuration must be an object, received ${input === null ? 'null' : typeof input}.`,
|
|
69
|
+
hint: 'Export a default object from cogenta.config.ts, built with defineConfig().',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const leaked = findSecretsInFile(input);
|
|
73
|
+
if (leaked.length > 0) {
|
|
74
|
+
const variables = leaked.map((path) => SECRET_KEYS.get(path)).join(', ');
|
|
75
|
+
throw new CogentaError({
|
|
76
|
+
code: 'CONFIG_SECRET_IN_FILE',
|
|
77
|
+
message: `Secrets must not appear in the config file: ${leaked.join(', ')}.`,
|
|
78
|
+
hint: `Remove them and set ${variables} in the environment instead. cogenta.config.ts is committed to git; anything in it is public to everyone with repository access.`,
|
|
79
|
+
details: { fields: leaked },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const parsed = configSchema.safeParse(applyEnv(input, env));
|
|
83
|
+
if (!parsed.success) {
|
|
84
|
+
throw new CogentaError({
|
|
85
|
+
code: 'CONFIG_INVALID',
|
|
86
|
+
message: `Invalid Cogenta configuration:\n${formatIssues(parsed.error)}`,
|
|
87
|
+
hint: CONFIG_HINT,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const config = parsed.data;
|
|
91
|
+
const driver = config.database.driver ?? inferDatabaseDriver(config.database.url);
|
|
92
|
+
if (driver === undefined) {
|
|
93
|
+
throw new CogentaError({
|
|
94
|
+
code: 'CONFIG_INVALID',
|
|
95
|
+
message: 'Invalid Cogenta configuration:\n database.driver: cannot be inferred from the database URL. ' +
|
|
96
|
+
`Name one of ${DATABASE_DRIVERS.join(', ')} explicitly.`,
|
|
97
|
+
hint: CONFIG_HINT,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
const secrets = readSecrets(env);
|
|
101
|
+
return Object.freeze({
|
|
102
|
+
site: Object.freeze({
|
|
103
|
+
name: config.site.name,
|
|
104
|
+
url: config.site.url,
|
|
105
|
+
locales: Object.freeze([...config.site.locales]),
|
|
106
|
+
defaultLocale: config.site.defaultLocale,
|
|
107
|
+
}),
|
|
108
|
+
database: Object.freeze({
|
|
109
|
+
driver,
|
|
110
|
+
// Only SQLite has a path for a URL; the others are server addresses.
|
|
111
|
+
url: driver === 'sqlite' ? againstConfigFile(config.database.url, baseDir) : config.database.url,
|
|
112
|
+
poolSize: config.database.poolSize,
|
|
113
|
+
}),
|
|
114
|
+
cache: Object.freeze({
|
|
115
|
+
driver: config.cache.driver,
|
|
116
|
+
url: config.cache.url,
|
|
117
|
+
path: againstConfigFile(config.cache.path, baseDir),
|
|
118
|
+
}),
|
|
119
|
+
queue: Object.freeze({ driver: config.queue.driver, url: config.queue.url }),
|
|
120
|
+
storage: Object.freeze({
|
|
121
|
+
driver: config.storage.driver,
|
|
122
|
+
bucket: config.storage.bucket,
|
|
123
|
+
region: config.storage.region,
|
|
124
|
+
endpoint: config.storage.endpoint,
|
|
125
|
+
path: againstConfigFile(config.storage.path, baseDir),
|
|
126
|
+
baseUrl: config.storage.baseUrl,
|
|
127
|
+
accessKeyId: secrets.storageAccessKeyId,
|
|
128
|
+
secretAccessKey: secrets.storageSecretAccessKey,
|
|
129
|
+
}),
|
|
130
|
+
auth: Object.freeze({ signingKey: secrets.authSigningKey }),
|
|
131
|
+
llm: config.llm === undefined
|
|
132
|
+
? undefined
|
|
133
|
+
: Object.freeze({
|
|
134
|
+
provider: config.llm.provider,
|
|
135
|
+
model: config.llm.model,
|
|
136
|
+
baseUrl: config.llm.baseUrl,
|
|
137
|
+
apiKey: secrets.llmApiKey,
|
|
138
|
+
}),
|
|
139
|
+
embeddings: Object.freeze({
|
|
140
|
+
provider: config.embeddings.provider,
|
|
141
|
+
model: config.embeddings.model,
|
|
142
|
+
dimensions: config.embeddings.dimensions,
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=resolve-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../../src/config/resolve-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const configSchema: z.ZodObject<{
|
|
3
|
+
site: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
url: z.ZodURL;
|
|
6
|
+
locales: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
7
|
+
defaultLocale: z.ZodDefault<z.ZodString>;
|
|
8
|
+
}, z.core.$strict>;
|
|
9
|
+
database: z.ZodObject<{
|
|
10
|
+
driver: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
mysql: "mysql";
|
|
12
|
+
postgres: "postgres";
|
|
13
|
+
sqlite: "sqlite";
|
|
14
|
+
}>>;
|
|
15
|
+
url: z.ZodString;
|
|
16
|
+
poolSize: z.ZodDefault<z.ZodNumber>;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
cache: z.ZodPrefault<z.ZodObject<{
|
|
19
|
+
driver: z.ZodDefault<z.ZodEnum<{
|
|
20
|
+
auto: "auto";
|
|
21
|
+
file: "file";
|
|
22
|
+
memory: "memory";
|
|
23
|
+
redis: "redis";
|
|
24
|
+
}>>;
|
|
25
|
+
url: z.ZodOptional<z.ZodString>;
|
|
26
|
+
path: z.ZodDefault<z.ZodString>;
|
|
27
|
+
}, z.core.$strict>>;
|
|
28
|
+
queue: z.ZodPrefault<z.ZodObject<{
|
|
29
|
+
driver: z.ZodDefault<z.ZodEnum<{
|
|
30
|
+
auto: "auto";
|
|
31
|
+
database: "database";
|
|
32
|
+
redis: "redis";
|
|
33
|
+
}>>;
|
|
34
|
+
url: z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, z.core.$strict>>;
|
|
36
|
+
storage: z.ZodPrefault<z.ZodObject<{
|
|
37
|
+
driver: z.ZodDefault<z.ZodEnum<{
|
|
38
|
+
auto: "auto";
|
|
39
|
+
local: "local";
|
|
40
|
+
s3: "s3";
|
|
41
|
+
}>>;
|
|
42
|
+
bucket: z.ZodOptional<z.ZodString>;
|
|
43
|
+
region: z.ZodOptional<z.ZodString>;
|
|
44
|
+
endpoint: z.ZodOptional<z.ZodString>;
|
|
45
|
+
path: z.ZodDefault<z.ZodString>;
|
|
46
|
+
baseUrl: z.ZodDefault<z.ZodString>;
|
|
47
|
+
}, z.core.$strict>>;
|
|
48
|
+
llm: z.ZodOptional<z.ZodObject<{
|
|
49
|
+
provider: z.ZodString;
|
|
50
|
+
model: z.ZodString;
|
|
51
|
+
baseUrl: z.ZodOptional<z.ZodString>;
|
|
52
|
+
}, z.core.$strict>>;
|
|
53
|
+
embeddings: z.ZodPrefault<z.ZodObject<{
|
|
54
|
+
provider: z.ZodDefault<z.ZodEnum<{
|
|
55
|
+
local: "local";
|
|
56
|
+
openai: "openai";
|
|
57
|
+
}>>;
|
|
58
|
+
model: z.ZodDefault<z.ZodString>;
|
|
59
|
+
dimensions: z.ZodDefault<z.ZodNumber>;
|
|
60
|
+
}, z.core.$strict>>;
|
|
61
|
+
}, z.core.$strict>;
|
|
62
|
+
export type ParsedConfig = z.infer<typeof configSchema>;
|
|
63
|
+
/**
|
|
64
|
+
* Renders Zod issues as `field: reason`, one per line, so the user sees every
|
|
65
|
+
* problem at once instead of fixing them one restart at a time.
|
|
66
|
+
*/
|
|
67
|
+
export declare function formatIssues(error: z.ZodError): string;
|
|
68
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAoEvB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAQvB,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,MAAM,CAOtD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CACHE_DRIVERS, DATABASE_DRIVERS, EMBEDDINGS_PROVIDERS, QUEUE_DRIVERS, STORAGE_DRIVERS, } from './types.js';
|
|
3
|
+
const nonEmpty = z.string().min(1);
|
|
4
|
+
// Every object is strict: a typo in a key is an error, never a silently ignored
|
|
5
|
+
// setting. Config drift between staging and production is the daily pain this
|
|
6
|
+
// project exists to remove (ADR-0010).
|
|
7
|
+
const siteSchema = z
|
|
8
|
+
.strictObject({
|
|
9
|
+
name: nonEmpty,
|
|
10
|
+
url: z.url(),
|
|
11
|
+
locales: z.array(nonEmpty).min(1).default(['en']),
|
|
12
|
+
defaultLocale: nonEmpty.default('en'),
|
|
13
|
+
})
|
|
14
|
+
.refine((site) => site.locales.includes(site.defaultLocale), {
|
|
15
|
+
error: 'defaultLocale must be one of the configured locales',
|
|
16
|
+
path: ['defaultLocale'],
|
|
17
|
+
});
|
|
18
|
+
const databaseSchema = z.strictObject({
|
|
19
|
+
driver: z.enum(DATABASE_DRIVERS).optional(),
|
|
20
|
+
url: nonEmpty,
|
|
21
|
+
// Modest by default: shared hosting allows very few connections, and
|
|
22
|
+
// exhausting them takes the site down rather than slowing it.
|
|
23
|
+
poolSize: z.number().int().positive().max(100).default(5),
|
|
24
|
+
});
|
|
25
|
+
const cacheSchema = z.strictObject({
|
|
26
|
+
driver: z.enum(CACHE_DRIVERS).default('auto'),
|
|
27
|
+
url: nonEmpty.optional(),
|
|
28
|
+
path: nonEmpty.default('./.cogenta/cache'),
|
|
29
|
+
});
|
|
30
|
+
const queueSchema = z.strictObject({
|
|
31
|
+
driver: z.enum(QUEUE_DRIVERS).default('auto'),
|
|
32
|
+
url: nonEmpty.optional(),
|
|
33
|
+
});
|
|
34
|
+
const storageSchema = z.strictObject({
|
|
35
|
+
driver: z.enum(STORAGE_DRIVERS).default('auto'),
|
|
36
|
+
bucket: nonEmpty.optional(),
|
|
37
|
+
region: nonEmpty.optional(),
|
|
38
|
+
endpoint: nonEmpty.optional(),
|
|
39
|
+
path: nonEmpty.default('./.cogenta/media'),
|
|
40
|
+
baseUrl: nonEmpty.default('/media'),
|
|
41
|
+
});
|
|
42
|
+
const llmSchema = z.strictObject({
|
|
43
|
+
provider: nonEmpty,
|
|
44
|
+
model: nonEmpty,
|
|
45
|
+
baseUrl: nonEmpty.optional(),
|
|
46
|
+
});
|
|
47
|
+
const embeddingsSchema = z.strictObject({
|
|
48
|
+
provider: z.enum(EMBEDDINGS_PROVIDERS).default('local'),
|
|
49
|
+
model: nonEmpty.default('all-MiniLM-L6-v2'),
|
|
50
|
+
dimensions: z.number().int().positive().default(384),
|
|
51
|
+
});
|
|
52
|
+
// `prefault` rather than `default`: an omitted section is parsed as `{}` so the
|
|
53
|
+
// per-field defaults inside it apply, instead of being replaced wholesale.
|
|
54
|
+
export const configSchema = z.strictObject({
|
|
55
|
+
site: siteSchema,
|
|
56
|
+
database: databaseSchema,
|
|
57
|
+
cache: cacheSchema.prefault({}),
|
|
58
|
+
queue: queueSchema.prefault({}),
|
|
59
|
+
storage: storageSchema.prefault({}),
|
|
60
|
+
llm: llmSchema.optional(),
|
|
61
|
+
embeddings: embeddingsSchema.prefault({}),
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Renders Zod issues as `field: reason`, one per line, so the user sees every
|
|
65
|
+
* problem at once instead of fixing them one restart at a time.
|
|
66
|
+
*/
|
|
67
|
+
export function formatIssues(error) {
|
|
68
|
+
return error.issues
|
|
69
|
+
.map((issue) => {
|
|
70
|
+
const path = issue.path.map(String).join('.');
|
|
71
|
+
return ` ${path === '' ? '(root)' : path}: ${issue.message}`;
|
|
72
|
+
})
|
|
73
|
+
.join('\n');
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
export declare const DATABASE_DRIVERS: readonly ['postgres', 'mysql', 'sqlite'];
|
|
2
|
+
export declare const CACHE_DRIVERS: readonly ['auto', 'redis', 'file', 'memory'];
|
|
3
|
+
export declare const QUEUE_DRIVERS: readonly ['auto', 'redis', 'database'];
|
|
4
|
+
export declare const STORAGE_DRIVERS: readonly ['auto', 's3', 'local'];
|
|
5
|
+
export declare const EMBEDDINGS_PROVIDERS: readonly ['local', 'openai'];
|
|
6
|
+
export type DatabaseDriverName = (typeof DATABASE_DRIVERS)[number];
|
|
7
|
+
export type CacheDriverName = (typeof CACHE_DRIVERS)[number];
|
|
8
|
+
export type QueueDriverName = (typeof QUEUE_DRIVERS)[number];
|
|
9
|
+
export type StorageDriverName = (typeof STORAGE_DRIVERS)[number];
|
|
10
|
+
export type EmbeddingsProvider = (typeof EMBEDDINGS_PROVIDERS)[number];
|
|
11
|
+
/**
|
|
12
|
+
* What a user writes in `cogenta.config.ts`. Everything but `site` and
|
|
13
|
+
* `database` is optional, and no field here may hold a secret — those come from
|
|
14
|
+
* the environment only.
|
|
15
|
+
*/
|
|
16
|
+
export interface CogentaConfigInput {
|
|
17
|
+
readonly site: {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly url: string;
|
|
20
|
+
readonly locales?: readonly string[];
|
|
21
|
+
readonly defaultLocale?: string;
|
|
22
|
+
};
|
|
23
|
+
readonly database: {
|
|
24
|
+
/** Inferred from the URL scheme when absent. */
|
|
25
|
+
readonly driver?: DatabaseDriverName;
|
|
26
|
+
readonly url?: string;
|
|
27
|
+
/** Maximum simultaneous connections. Small by default. */
|
|
28
|
+
readonly poolSize?: number;
|
|
29
|
+
};
|
|
30
|
+
readonly cache?: {
|
|
31
|
+
readonly driver?: CacheDriverName;
|
|
32
|
+
readonly url?: string;
|
|
33
|
+
readonly path?: string;
|
|
34
|
+
};
|
|
35
|
+
readonly queue?: {
|
|
36
|
+
readonly driver?: QueueDriverName;
|
|
37
|
+
readonly url?: string;
|
|
38
|
+
};
|
|
39
|
+
readonly storage?: {
|
|
40
|
+
readonly driver?: StorageDriverName;
|
|
41
|
+
readonly bucket?: string;
|
|
42
|
+
readonly region?: string;
|
|
43
|
+
readonly endpoint?: string;
|
|
44
|
+
readonly path?: string;
|
|
45
|
+
/** Prefix for public media URLs. */
|
|
46
|
+
readonly baseUrl?: string;
|
|
47
|
+
};
|
|
48
|
+
readonly llm?: {
|
|
49
|
+
readonly provider?: string;
|
|
50
|
+
readonly model?: string;
|
|
51
|
+
readonly baseUrl?: string;
|
|
52
|
+
};
|
|
53
|
+
readonly embeddings?: {
|
|
54
|
+
readonly provider?: EmbeddingsProvider;
|
|
55
|
+
readonly model?: string;
|
|
56
|
+
readonly dimensions?: number;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* What the rest of Cogenta consumes: every field resolved, defaults applied,
|
|
61
|
+
* secrets injected from the environment.
|
|
62
|
+
*
|
|
63
|
+
* A driver of `'auto'` means the user named none, so the registry selects the
|
|
64
|
+
* first available implementation by tier. A named driver is honoured, and its
|
|
65
|
+
* failure is fatal — never a silent fallback.
|
|
66
|
+
*/
|
|
67
|
+
export interface CogentaConfig {
|
|
68
|
+
readonly site: {
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly url: string;
|
|
71
|
+
readonly locales: readonly string[];
|
|
72
|
+
readonly defaultLocale: string;
|
|
73
|
+
};
|
|
74
|
+
readonly database: {
|
|
75
|
+
readonly driver: DatabaseDriverName;
|
|
76
|
+
readonly url: string;
|
|
77
|
+
readonly poolSize: number;
|
|
78
|
+
};
|
|
79
|
+
readonly cache: {
|
|
80
|
+
readonly driver: CacheDriverName;
|
|
81
|
+
readonly url: string | undefined;
|
|
82
|
+
readonly path: string;
|
|
83
|
+
};
|
|
84
|
+
readonly queue: {
|
|
85
|
+
readonly driver: QueueDriverName;
|
|
86
|
+
readonly url: string | undefined;
|
|
87
|
+
};
|
|
88
|
+
readonly storage: {
|
|
89
|
+
readonly driver: StorageDriverName;
|
|
90
|
+
readonly bucket: string | undefined;
|
|
91
|
+
readonly region: string | undefined;
|
|
92
|
+
readonly endpoint: string | undefined;
|
|
93
|
+
readonly path: string;
|
|
94
|
+
readonly baseUrl: string;
|
|
95
|
+
readonly accessKeyId: string | undefined;
|
|
96
|
+
readonly secretAccessKey: string | undefined;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Never settable in the config file — there is no `auth` input section, on
|
|
100
|
+
* purpose (rule R7). `signingKey` is `undefined` until `COGENTA_AUTH_SIGNING_KEY`
|
|
101
|
+
* is set; whoever wires @cogenta/auth to a real server refuses to start
|
|
102
|
+
* without it rather than falling back to a guessable default.
|
|
103
|
+
*/
|
|
104
|
+
readonly auth: {
|
|
105
|
+
readonly signingKey: string | undefined;
|
|
106
|
+
};
|
|
107
|
+
/** Absent when no provider is configured. The CMS works without AI (rule R2). */
|
|
108
|
+
readonly llm: {
|
|
109
|
+
readonly provider: string;
|
|
110
|
+
readonly model: string;
|
|
111
|
+
readonly baseUrl: string | undefined;
|
|
112
|
+
readonly apiKey: string | undefined;
|
|
113
|
+
} | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* The triplet is locked together on purpose: an index is only valid for the
|
|
116
|
+
* exact provider, model and dimensions that produced it.
|
|
117
|
+
*/
|
|
118
|
+
readonly embeddings: {
|
|
119
|
+
readonly provider: EmbeddingsProvider;
|
|
120
|
+
readonly model: string;
|
|
121
|
+
readonly dimensions: number;
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** A read-only view of the process environment. */
|
|
125
|
+
export type Environment = Readonly<Record<string, string | undefined>>;
|
|
126
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const DATABASE_DRIVERS = ['postgres', 'mysql', 'sqlite'];
|
|
2
|
+
export const CACHE_DRIVERS = ['auto', 'redis', 'file', 'memory'];
|
|
3
|
+
export const QUEUE_DRIVERS = ['auto', 'redis', 'database'];
|
|
4
|
+
export const STORAGE_DRIVERS = ['auto', 's3', 'local'];
|
|
5
|
+
export const EMBEDDINGS_PROVIDERS = ['local', 'openai'];
|
|
6
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAA;AACxE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAA;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAU,CAAA;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAU,CAAA;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { DatabaseDialect } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A piece of SQL with its bound values kept separate.
|
|
4
|
+
*
|
|
5
|
+
* Callers never write placeholders themselves: Postgres wants `$1`, MySQL and
|
|
6
|
+
* SQLite want `?`, and letting that choice reach a caller is exactly the dialect
|
|
7
|
+
* leak the L0 spec warns about. They write `` sql`… ${value}` `` and this layer
|
|
8
|
+
* renders it for whichever database is connected.
|
|
9
|
+
*/
|
|
10
|
+
export interface SqlFragment {
|
|
11
|
+
readonly parts: readonly string[];
|
|
12
|
+
readonly values: readonly unknown[];
|
|
13
|
+
}
|
|
14
|
+
/** Tagged template for SQL. Interpolated values are always bound, never inlined. */
|
|
15
|
+
export declare function sql(strings: TemplateStringsArray, ...values: readonly unknown[]): SqlFragment;
|
|
16
|
+
/**
|
|
17
|
+
* Text inserted verbatim, with no binding.
|
|
18
|
+
*
|
|
19
|
+
* Only ever for SQL the code itself wrote. A value that reached the process from
|
|
20
|
+
* outside must go through `sql` so it is bound — this is the one function in the
|
|
21
|
+
* layer that can produce an injection, and it is named to say so.
|
|
22
|
+
*/
|
|
23
|
+
export declare function unsafeRaw(text: string): SqlFragment;
|
|
24
|
+
/**
|
|
25
|
+
* Quotes a table or column name for the dialect. Postgres and SQLite use double
|
|
26
|
+
* quotes, MySQL uses backticks.
|
|
27
|
+
*/
|
|
28
|
+
export declare function identifier(name: string, dialect: DatabaseDialect): SqlFragment;
|
|
29
|
+
/**
|
|
30
|
+
* Adapts a bound value to what the driver for this dialect accepts.
|
|
31
|
+
*
|
|
32
|
+
* SQLite has no boolean and no date type, so `true` and a `Date` have to become
|
|
33
|
+
* an integer and a string. Doing it here, once, is what stops every call site
|
|
34
|
+
* from having to know which database it is talking to.
|
|
35
|
+
*/
|
|
36
|
+
export declare function encodeValue(value: unknown, dialect: DatabaseDialect): unknown;
|
|
37
|
+
export interface CompiledQuery {
|
|
38
|
+
readonly text: string;
|
|
39
|
+
readonly params: readonly unknown[];
|
|
40
|
+
}
|
|
41
|
+
/** Renders a fragment into the exact string and parameters this dialect expects. */
|
|
42
|
+
export declare function compile(fragment: SqlFragment, dialect: DatabaseDialect): CompiledQuery;
|
|
43
|
+
/**
|
|
44
|
+
* Statements that hand back rows: a read, or a write with `RETURNING`.
|
|
45
|
+
*
|
|
46
|
+
* Shared by every driver so `rows` and `rowsAffected` mean the same thing on all
|
|
47
|
+
* three dialects. Left to each driver, Postgres would report a `SELECT` of two
|
|
48
|
+
* rows as "two rows affected" while SQLite reported zero — the kind of quiet
|
|
49
|
+
* divergence the contract suite exists to prevent.
|
|
50
|
+
*/
|
|
51
|
+
export declare function returnsRows(text: string): boolean;
|
|
52
|
+
/** True when the statement creates, changes or removes rows. */
|
|
53
|
+
export declare function isWrite(text: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Renders a `LIMIT` count as a literal rather than a bound parameter.
|
|
56
|
+
*
|
|
57
|
+
* MySQL prepared statements reject a placeholder there — `LIMIT ?` fails with
|
|
58
|
+
* "Incorrect arguments to mysqld_stmt_execute". Rather than encode that as one
|
|
59
|
+
* more dialect difference for callers to remember, the count is inlined
|
|
60
|
+
* everywhere. It is validated as a non-negative integer first, so inlining it
|
|
61
|
+
* cannot inject: this is the only place a number reaches the SQL text directly.
|
|
62
|
+
*/
|
|
63
|
+
export declare function limit(count: number): SqlFragment;
|
|
64
|
+
//# sourceMappingURL=dialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/db/dialect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CACpC;AAsBD,oFAAoF;AACpF,wBAAgB,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,CA4B7F;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAEnD;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,WAAW,CAU9E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAyB7E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CACpC;AAED,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,CAWtF;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAKD;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAShD"}
|