@reverso/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/README.md +45 -0
- package/dist/config/defaults.d.ts +35 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +104 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/define-config.d.ts +40 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +44 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +41 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +99 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/validation.d.ts +325 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +185 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/constants.d.ts +84 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +120 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/types/config.d.ts +285 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/content.d.ts +288 -0
- package/dist/types/content.d.ts.map +1 -0
- package/dist/types/content.js +6 -0
- package/dist/types/content.js.map +1 -0
- package/dist/types/fields.d.ts +187 -0
- package/dist/types/fields.d.ts.map +1 -0
- package/dist/types/fields.js +6 -0
- package/dist/types/fields.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/schema.d.ts +193 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/naming.d.ts +122 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +302 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/path.d.ts +79 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +219 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/validation.d.ts +256 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +245 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# @reverso/core
|
|
2
|
+
|
|
3
|
+
Core types, utilities, and configuration system for Reverso CMS.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @reverso/core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { defineConfig, FieldType, parsePath, formatLabel } from '@reverso/core';
|
|
15
|
+
|
|
16
|
+
// Define CMS configuration
|
|
17
|
+
const config = defineConfig({
|
|
18
|
+
database: {
|
|
19
|
+
type: 'sqlite',
|
|
20
|
+
path: './data/reverso.db',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Parse field paths
|
|
25
|
+
const { page, section, field } = parsePath('home.hero.title');
|
|
26
|
+
|
|
27
|
+
// Format field labels
|
|
28
|
+
const label = formatLabel('heroTitle'); // "Hero Title"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Features
|
|
32
|
+
|
|
33
|
+
- **35+ Field Types**: text, wysiwyg, image, repeater, flexible, and more
|
|
34
|
+
- **Configuration System**: defineConfig helper with validation
|
|
35
|
+
- **Path Utilities**: Parse and build field paths
|
|
36
|
+
- **Naming Utilities**: Format labels, slugify, camelCase
|
|
37
|
+
- **Validation**: Zod schemas for all types
|
|
38
|
+
|
|
39
|
+
## Documentation
|
|
40
|
+
|
|
41
|
+
See [https://reverso.dev/docs/packages/core](https://reverso.dev/docs/packages/core)
|
|
42
|
+
|
|
43
|
+
## License
|
|
44
|
+
|
|
45
|
+
MIT
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values for Reverso CMS.
|
|
3
|
+
*/
|
|
4
|
+
import type { AdminConfig, ApiConfig, DatabaseConfig, ReversoConfig, ScannerConfig } from '../types/config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Default database configuration (SQLite for development).
|
|
7
|
+
*/
|
|
8
|
+
export declare const defaultDatabaseConfig: DatabaseConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Default scanner configuration.
|
|
11
|
+
*/
|
|
12
|
+
export declare const defaultScannerConfig: Required<ScannerConfig>;
|
|
13
|
+
/**
|
|
14
|
+
* Default admin configuration.
|
|
15
|
+
*/
|
|
16
|
+
export declare const defaultAdminConfig: Required<AdminConfig>;
|
|
17
|
+
/**
|
|
18
|
+
* Default API configuration.
|
|
19
|
+
*/
|
|
20
|
+
export declare const defaultApiConfig: Required<Omit<ApiConfig, 'rateLimit' | 'apiKey'>> & Pick<ApiConfig, 'rateLimit' | 'apiKey'>;
|
|
21
|
+
/**
|
|
22
|
+
* Default development configuration.
|
|
23
|
+
*/
|
|
24
|
+
export declare const defaultDevConfig: Required<NonNullable<ReversoConfig['dev']>>;
|
|
25
|
+
/**
|
|
26
|
+
* Complete default configuration.
|
|
27
|
+
*/
|
|
28
|
+
export declare const defaultConfig: Omit<ReversoConfig, 'database'> & {
|
|
29
|
+
database: DatabaseConfig;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Merge user config with defaults.
|
|
33
|
+
*/
|
|
34
|
+
export declare function mergeWithDefaults(userConfig: ReversoConfig): ReversoConfig;
|
|
35
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAKnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,aAAa,CASxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,WAAW,CAQpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC,GAC9E,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAOvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAGxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,cAAc,CAAA;CAavF,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,GAAG,aAAa,CA0B1E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values for Reverso CMS.
|
|
3
|
+
*/
|
|
4
|
+
import { DEFAULT_ADMIN_PATH, DEFAULT_API_PATH, DEFAULT_DEV_PORT, DEFAULT_EXCLUDE_PATTERNS, DEFAULT_INCLUDE_PATTERNS, DEFAULT_OUTPUT_DIR, DEFAULT_SRC_DIR, DEFAULT_WATCH_DEBOUNCE, } from '../constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Default database configuration (SQLite for development).
|
|
7
|
+
*/
|
|
8
|
+
export const defaultDatabaseConfig = {
|
|
9
|
+
provider: 'sqlite',
|
|
10
|
+
url: '.reverso/reverso.db',
|
|
11
|
+
autoMigrate: true,
|
|
12
|
+
logging: false,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Default scanner configuration.
|
|
16
|
+
*/
|
|
17
|
+
export const defaultScannerConfig = {
|
|
18
|
+
srcDir: DEFAULT_SRC_DIR,
|
|
19
|
+
include: [...DEFAULT_INCLUDE_PATTERNS],
|
|
20
|
+
exclude: [...DEFAULT_EXCLUDE_PATTERNS],
|
|
21
|
+
outputDir: DEFAULT_OUTPUT_DIR,
|
|
22
|
+
watch: {
|
|
23
|
+
enabled: true,
|
|
24
|
+
debounce: DEFAULT_WATCH_DEBOUNCE,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Default admin configuration.
|
|
29
|
+
*/
|
|
30
|
+
export const defaultAdminConfig = {
|
|
31
|
+
path: DEFAULT_ADMIN_PATH,
|
|
32
|
+
title: 'Reverso',
|
|
33
|
+
logo: '',
|
|
34
|
+
primaryColor: '#6366f1',
|
|
35
|
+
darkMode: true,
|
|
36
|
+
favicon: '',
|
|
37
|
+
disabled: false,
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Default API configuration.
|
|
41
|
+
*/
|
|
42
|
+
export const defaultApiConfig = {
|
|
43
|
+
path: DEFAULT_API_PATH,
|
|
44
|
+
graphql: true,
|
|
45
|
+
rest: true,
|
|
46
|
+
cors: true,
|
|
47
|
+
rateLimit: undefined,
|
|
48
|
+
apiKey: undefined,
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Default development configuration.
|
|
52
|
+
*/
|
|
53
|
+
export const defaultDevConfig = {
|
|
54
|
+
port: DEFAULT_DEV_PORT,
|
|
55
|
+
hotReload: true,
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Complete default configuration.
|
|
59
|
+
*/
|
|
60
|
+
export const defaultConfig = {
|
|
61
|
+
name: 'Reverso',
|
|
62
|
+
srcDir: DEFAULT_SRC_DIR,
|
|
63
|
+
outputDir: DEFAULT_OUTPUT_DIR,
|
|
64
|
+
database: defaultDatabaseConfig,
|
|
65
|
+
auth: undefined,
|
|
66
|
+
uploads: undefined,
|
|
67
|
+
admin: defaultAdminConfig,
|
|
68
|
+
api: defaultApiConfig,
|
|
69
|
+
scanner: defaultScannerConfig,
|
|
70
|
+
plugins: [],
|
|
71
|
+
hooks: undefined,
|
|
72
|
+
dev: defaultDevConfig,
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Merge user config with defaults.
|
|
76
|
+
*/
|
|
77
|
+
export function mergeWithDefaults(userConfig) {
|
|
78
|
+
return {
|
|
79
|
+
name: userConfig.name ?? defaultConfig.name,
|
|
80
|
+
srcDir: userConfig.srcDir ?? defaultConfig.srcDir,
|
|
81
|
+
outputDir: userConfig.outputDir ?? defaultConfig.outputDir,
|
|
82
|
+
database: {
|
|
83
|
+
...defaultDatabaseConfig,
|
|
84
|
+
...userConfig.database,
|
|
85
|
+
},
|
|
86
|
+
auth: userConfig.auth,
|
|
87
|
+
uploads: userConfig.uploads,
|
|
88
|
+
admin: userConfig.admin ? { ...defaultAdminConfig, ...userConfig.admin } : defaultAdminConfig,
|
|
89
|
+
api: userConfig.api ? { ...defaultApiConfig, ...userConfig.api } : defaultApiConfig,
|
|
90
|
+
scanner: userConfig.scanner
|
|
91
|
+
? {
|
|
92
|
+
...defaultScannerConfig,
|
|
93
|
+
...userConfig.scanner,
|
|
94
|
+
watch: userConfig.scanner.watch
|
|
95
|
+
? { ...defaultScannerConfig.watch, ...userConfig.scanner.watch }
|
|
96
|
+
: defaultScannerConfig.watch,
|
|
97
|
+
}
|
|
98
|
+
: defaultScannerConfig,
|
|
99
|
+
plugins: userConfig.plugins ?? [],
|
|
100
|
+
hooks: userConfig.hooks,
|
|
101
|
+
dev: userConfig.dev ? { ...defaultDevConfig, ...userConfig.dev } : defaultDevConfig,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AASzB;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACnD,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,qBAAqB;IAC1B,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,KAAK;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA4B;IAC3D,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,CAAC,GAAG,wBAAwB,CAAC;IACtC,OAAO,EAAE,CAAC,GAAG,wBAAwB,CAAC;IACtC,SAAS,EAAE,kBAAkB;IAC7B,KAAK,EAAE;QACL,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,sBAAsB;KACjC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA0B;IACvD,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,EAAE;IACR,YAAY,EAAE,SAAS;IACvB,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GACe;IAC1C,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAgD;IAC3E,IAAI,EAAE,gBAAgB;IACtB,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAmE;IAC3F,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,eAAe;IACvB,SAAS,EAAE,kBAAkB;IAC7B,QAAQ,EAAE,qBAAqB;IAC/B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,kBAAkB;IACzB,GAAG,EAAE,gBAAgB;IACrB,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,gBAAgB;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAyB;IACzD,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;QAC3C,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM;QACjD,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS;QAC1D,QAAQ,EAAE;YACR,GAAG,qBAAqB;YACxB,GAAG,UAAU,CAAC,QAAQ;SACvB;QACD,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,kBAAkB,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,kBAAkB;QAC7F,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,gBAAgB;QACnF,OAAO,EAAE,UAAU,CAAC,OAAO;YACzB,CAAC,CAAC;gBACE,GAAG,oBAAoB;gBACvB,GAAG,UAAU,CAAC,OAAO;gBACrB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK;oBAC7B,CAAC,CAAC,EAAE,GAAG,oBAAoB,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE;oBAChE,CAAC,CAAC,oBAAoB,CAAC,KAAK;aAC/B;YACH,CAAC,CAAC,oBAAoB;QACxB,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE;QACjC,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,gBAAgB;KACpF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration helper for type-safe Reverso configuration.
|
|
3
|
+
*/
|
|
4
|
+
import type { ReversoConfig } from '../types/config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Define a Reverso configuration with full TypeScript support.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* // reverso.config.ts
|
|
11
|
+
* import { defineConfig } from '@reverso/core';
|
|
12
|
+
*
|
|
13
|
+
* export default defineConfig({
|
|
14
|
+
* database: {
|
|
15
|
+
* provider: 'sqlite',
|
|
16
|
+
* url: '.reverso/dev.db',
|
|
17
|
+
* },
|
|
18
|
+
* auth: {
|
|
19
|
+
* enabled: true,
|
|
20
|
+
* provider: 'better-auth',
|
|
21
|
+
* secret: process.env.AUTH_SECRET!,
|
|
22
|
+
* },
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function defineConfig(config: ReversoConfig): ReversoConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Type helper for configuration objects.
|
|
29
|
+
* Use this when you need to define partial configuration that will be merged later.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const dbConfig = configPartial<DatabaseConfig>({
|
|
34
|
+
* provider: 'postgresql',
|
|
35
|
+
* url: process.env.DATABASE_URL!,
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function configPartial<T extends Record<string, unknown>>(config: T): T;
|
|
40
|
+
//# 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;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAEjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAE7E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration helper for type-safe Reverso configuration.
|
|
3
|
+
*/
|
|
4
|
+
import { mergeWithDefaults } from './defaults.js';
|
|
5
|
+
/**
|
|
6
|
+
* Define a Reverso configuration with full TypeScript support.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* // reverso.config.ts
|
|
11
|
+
* import { defineConfig } from '@reverso/core';
|
|
12
|
+
*
|
|
13
|
+
* export default defineConfig({
|
|
14
|
+
* database: {
|
|
15
|
+
* provider: 'sqlite',
|
|
16
|
+
* url: '.reverso/dev.db',
|
|
17
|
+
* },
|
|
18
|
+
* auth: {
|
|
19
|
+
* enabled: true,
|
|
20
|
+
* provider: 'better-auth',
|
|
21
|
+
* secret: process.env.AUTH_SECRET!,
|
|
22
|
+
* },
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function defineConfig(config) {
|
|
27
|
+
return mergeWithDefaults(config);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Type helper for configuration objects.
|
|
31
|
+
* Use this when you need to define partial configuration that will be merged later.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const dbConfig = configPartial<DatabaseConfig>({
|
|
36
|
+
* provider: 'postgresql',
|
|
37
|
+
* url: process.env.DATABASE_URL!,
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function configPartial(config) {
|
|
42
|
+
return config;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=define-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAoC,MAAS;IACxE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration exports for @reverso/core
|
|
3
|
+
*/
|
|
4
|
+
export { defineConfig, configPartial } from './define-config.js';
|
|
5
|
+
export { defaultConfig, defaultDatabaseConfig, defaultScannerConfig, defaultAdminConfig, defaultApiConfig, defaultDevConfig, mergeWithDefaults, } from './defaults.js';
|
|
6
|
+
export { loadConfig, loadConfigSync, findConfigFile, type LoadConfigOptions, type LoadConfigResult, } from './loader.js';
|
|
7
|
+
export { configSchema, databaseConfigSchema, authConfigSchema, uploadsConfigSchema, adminConfigSchema, apiConfigSchema, scannerConfigSchema, pluginConfigSchema, hooksConfigSchema, devConfigSchema, type ValidatedConfig, } from './validation.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration exports for @reverso/core
|
|
3
|
+
*/
|
|
4
|
+
export { defineConfig, configPartial } from './define-config.js';
|
|
5
|
+
export { defaultConfig, defaultDatabaseConfig, defaultScannerConfig, defaultAdminConfig, defaultApiConfig, defaultDevConfig, mergeWithDefaults, } from './defaults.js';
|
|
6
|
+
export { loadConfig, loadConfigSync, findConfigFile, } from './loader.js';
|
|
7
|
+
export { configSchema, databaseConfigSchema, authConfigSchema, uploadsConfigSchema, adminConfigSchema, apiConfigSchema, scannerConfigSchema, pluginConfigSchema, hooksConfigSchema, devConfigSchema, } from './validation.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAEhB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for Reverso CMS.
|
|
3
|
+
* Loads and validates reverso.config.ts files.
|
|
4
|
+
*/
|
|
5
|
+
import type { ReversoConfig } from '../types/config.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options for loading configuration.
|
|
8
|
+
*/
|
|
9
|
+
export interface LoadConfigOptions {
|
|
10
|
+
/** Working directory to search for config file */
|
|
11
|
+
cwd?: string;
|
|
12
|
+
/** Explicit config file path */
|
|
13
|
+
configFile?: string;
|
|
14
|
+
/** Skip validation */
|
|
15
|
+
skipValidation?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Result of loading configuration.
|
|
19
|
+
*/
|
|
20
|
+
export interface LoadConfigResult {
|
|
21
|
+
/** Loaded and merged configuration */
|
|
22
|
+
config: ReversoConfig;
|
|
23
|
+
/** Path to the config file that was loaded */
|
|
24
|
+
configPath: string | null;
|
|
25
|
+
/** Whether the config file exists */
|
|
26
|
+
exists: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Find the configuration file in the given directory.
|
|
30
|
+
*/
|
|
31
|
+
export declare function findConfigFile(cwd: string): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Load configuration from a file.
|
|
34
|
+
*/
|
|
35
|
+
export declare function loadConfig(options?: LoadConfigOptions): Promise<LoadConfigResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Load configuration synchronously (blocking).
|
|
38
|
+
* Use loadConfig() when possible for better performance.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadConfigSync(options?: LoadConfigOptions): LoadConfigResult;
|
|
41
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQzD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmD3F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CA0BhF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for Reverso CMS.
|
|
3
|
+
* Loads and validates reverso.config.ts files.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { join, resolve } from 'node:path';
|
|
7
|
+
import { pathToFileURL } from 'node:url';
|
|
8
|
+
import { CONFIG_FILE_NAMES } from '../constants.js';
|
|
9
|
+
import { mergeWithDefaults } from './defaults.js';
|
|
10
|
+
import { configSchema } from './validation.js';
|
|
11
|
+
/**
|
|
12
|
+
* Find the configuration file in the given directory.
|
|
13
|
+
*/
|
|
14
|
+
export function findConfigFile(cwd) {
|
|
15
|
+
for (const fileName of CONFIG_FILE_NAMES) {
|
|
16
|
+
const filePath = join(cwd, fileName);
|
|
17
|
+
if (existsSync(filePath)) {
|
|
18
|
+
return filePath;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load configuration from a file.
|
|
25
|
+
*/
|
|
26
|
+
export async function loadConfig(options = {}) {
|
|
27
|
+
const cwd = options.cwd ?? process.cwd();
|
|
28
|
+
// Find config file
|
|
29
|
+
const configPath = options.configFile ? resolve(cwd, options.configFile) : findConfigFile(cwd);
|
|
30
|
+
// If no config file, return defaults
|
|
31
|
+
if (!configPath || !existsSync(configPath)) {
|
|
32
|
+
return {
|
|
33
|
+
config: mergeWithDefaults({
|
|
34
|
+
database: {
|
|
35
|
+
provider: 'sqlite',
|
|
36
|
+
url: '.reverso/reverso.db',
|
|
37
|
+
},
|
|
38
|
+
}),
|
|
39
|
+
configPath: null,
|
|
40
|
+
exists: false,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Load the config file
|
|
44
|
+
try {
|
|
45
|
+
const fileUrl = pathToFileURL(configPath).href;
|
|
46
|
+
const module = await import(fileUrl);
|
|
47
|
+
const userConfig = module.default;
|
|
48
|
+
// Validate if not skipped
|
|
49
|
+
if (!options.skipValidation) {
|
|
50
|
+
const result = configSchema.safeParse(userConfig);
|
|
51
|
+
if (!result.success) {
|
|
52
|
+
const errors = result.error.issues
|
|
53
|
+
.map((e) => ` - ${e.path.join('.')}: ${e.message}`)
|
|
54
|
+
.join('\n');
|
|
55
|
+
throw new Error(`Invalid configuration:\n${errors}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Merge with defaults
|
|
59
|
+
const config = mergeWithDefaults(userConfig);
|
|
60
|
+
return {
|
|
61
|
+
config,
|
|
62
|
+
configPath,
|
|
63
|
+
exists: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error instanceof Error) {
|
|
68
|
+
throw new Error(`Failed to load config from ${configPath}: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Load configuration synchronously (blocking).
|
|
75
|
+
* Use loadConfig() when possible for better performance.
|
|
76
|
+
*/
|
|
77
|
+
export function loadConfigSync(options = {}) {
|
|
78
|
+
const cwd = options.cwd ?? process.cwd();
|
|
79
|
+
// Find config file
|
|
80
|
+
const configPath = options.configFile ? resolve(cwd, options.configFile) : findConfigFile(cwd);
|
|
81
|
+
// If no config file, return defaults
|
|
82
|
+
if (!configPath || !existsSync(configPath)) {
|
|
83
|
+
return {
|
|
84
|
+
config: mergeWithDefaults({
|
|
85
|
+
database: {
|
|
86
|
+
provider: 'sqlite',
|
|
87
|
+
url: '.reverso/reverso.db',
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
configPath: null,
|
|
91
|
+
exists: false,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// For sync loading, we need to use require for .js files
|
|
95
|
+
// TypeScript files need to be compiled first
|
|
96
|
+
throw new Error('Synchronous config loading is not supported for TypeScript config files. ' +
|
|
97
|
+
'Use loadConfig() instead, or compile your config to .js first.');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|