@maravilla-labs/platform 0.1.36 → 0.1.38

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.
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @fileoverview Typed schema for `maravilla.config.{ts,yaml,json}` files.
3
+ *
4
+ * Declares your project's auth settings (resources, groups, relations,
5
+ * registration fields, OAuth providers, security policy, branding) alongside
6
+ * your code. The Maravilla adapter reads this at build time and reconciles
7
+ * the settings into delivery on deploy.
8
+ *
9
+ * ```typescript
10
+ * import { defineConfig } from '@maravilla-labs/platform/config';
11
+ *
12
+ * export default defineConfig({
13
+ * auth: {
14
+ * resources: [
15
+ * { name: 'todos', title: 'Todos', actions: ['read', 'write'],
16
+ * policy: 'auth.user_id == node.owner' },
17
+ * ],
18
+ * },
19
+ * });
20
+ * ```
21
+ *
22
+ * Omitted sections leave the DB alone — partial adoption is explicitly
23
+ * supported. List-based sections (`resources`, `groups`, `relations`,
24
+ * `oauth`) are upserted and never auto-delete DB-only entries. Singleton
25
+ * sections (`registration`, `security`, `branding`) are replaced wholesale
26
+ * when declared.
27
+ */
28
+ /**
29
+ * String value that may either be a literal secret or a reference to an
30
+ * environment variable on the **tenant** (resolved server-side at
31
+ * reconcile time, never shipped plaintext in the manifest).
32
+ *
33
+ * Accepted forms:
34
+ * - `"literal-value"` — inline (not recommended for real secrets)
35
+ * - `"${env.VAR_NAME}"` — string-template form
36
+ * - `{ env: "VAR_NAME" }` — object form
37
+ */
38
+ type SecretRef = string | {
39
+ env: string;
40
+ };
41
+ interface ResourceDefinition {
42
+ /** URL-safe slug. Used as the resource key in code (e.g. the KV namespace). */
43
+ name: string;
44
+ /** Human-readable title for the admin UI. */
45
+ title: string;
46
+ /** Optional longer description. */
47
+ description?: string;
48
+ /** Actions this resource supports, e.g. `['read', 'write', 'delete']`. */
49
+ actions: string[];
50
+ /**
51
+ * Optional raisin-rel policy expression. Evaluated on every KV/DB/
52
+ * realtime/media op that targets this resource. Leave empty to skip
53
+ * Layer 2 for this resource — tenant + owner isolation still applies.
54
+ */
55
+ policy?: string;
56
+ }
57
+ interface GroupPermissionDefinition {
58
+ /** Must match a `ResourceDefinition.name`. */
59
+ resource_name: string;
60
+ /** Actions this group is granted on the resource. */
61
+ actions: string[];
62
+ }
63
+ interface GroupDefinition {
64
+ /** Unique group name per tenant. */
65
+ name: string;
66
+ /** Optional description for the admin UI. */
67
+ description?: string;
68
+ /** Resource permissions granted to the group. Replaces the group's current permissions when declared. */
69
+ permissions?: GroupPermissionDefinition[];
70
+ }
71
+ interface RelationTypeDefinition {
72
+ /** Uppercase identifier used in policies (`... VIA 'STEWARDS'`). */
73
+ relation_name: string;
74
+ /** Human-readable title. */
75
+ title: string;
76
+ description?: string;
77
+ /** Grouping for the admin UI (e.g. `"family"`, `"work"`). */
78
+ category?: string;
79
+ icon?: string;
80
+ color?: string;
81
+ /** Name of the inverse relation type, if one exists. */
82
+ inverse_relation_name?: string;
83
+ /** When true, membership in this relation implies stewardship rights. */
84
+ implies_stewardship?: boolean;
85
+ /** When true, the relation can only target users flagged as minors. */
86
+ requires_minor?: boolean;
87
+ /** When true, the relation is symmetric (A→B implies B→A). */
88
+ bidirectional?: boolean;
89
+ }
90
+ interface RegistrationFieldDefinition {
91
+ /** Field key used as the form field name + in profile data. */
92
+ key: string;
93
+ /** Display label. */
94
+ label: string;
95
+ /** One of: text, email, phone, date, number, select, boolean, url, textarea. */
96
+ field_type: string;
97
+ required: boolean;
98
+ show_on_register: boolean;
99
+ /** Optional validation metadata — passed through to the UI. */
100
+ validation?: Record<string, unknown>;
101
+ }
102
+ interface RegistrationConfig {
103
+ /** Ordered list of custom registration fields. Declaring this replaces the full list. */
104
+ fields: RegistrationFieldDefinition[];
105
+ }
106
+ interface OAuthProviderDefinition {
107
+ enabled: boolean;
108
+ client_id: string;
109
+ /** Prefer `{ env: "VAR_NAME" }` or `"${env.VAR_NAME}"`. */
110
+ client_secret: SecretRef;
111
+ scopes: string[];
112
+ /** Only for `custom_oidc`. */
113
+ discovery_url?: string;
114
+ }
115
+ interface OAuthProvidersConfig {
116
+ google?: OAuthProviderDefinition;
117
+ github?: OAuthProviderDefinition;
118
+ okta?: OAuthProviderDefinition;
119
+ custom_oidc?: OAuthProviderDefinition;
120
+ }
121
+ interface PasswordPolicyDefinition {
122
+ min_length: number;
123
+ require_uppercase: boolean;
124
+ require_number: boolean;
125
+ require_special: boolean;
126
+ }
127
+ interface SessionConfigDefinition {
128
+ access_token_ttl_secs: number;
129
+ refresh_token_ttl_secs: number;
130
+ max_sessions_per_user: number;
131
+ require_email_verification: boolean;
132
+ }
133
+ interface SecurityConfig {
134
+ password_policy?: PasswordPolicyDefinition;
135
+ session?: SessionConfigDefinition;
136
+ }
137
+ interface BrandingConfig {
138
+ app_name?: string;
139
+ logo_url?: string;
140
+ primary_color?: string;
141
+ secondary_color?: string;
142
+ welcome_message?: string;
143
+ welcome_subtitle?: string;
144
+ /** `"centered"`, `"split-left"`, `"split-right"`, or `"fullscreen"`. */
145
+ layout?: string;
146
+ background_image_url?: string;
147
+ /** 0–100 percentage. */
148
+ background_focal_point?: {
149
+ x: number;
150
+ y: number;
151
+ };
152
+ background_gradient?: string;
153
+ /** `"light"`, `"dark"`, or `"auto"`. */
154
+ color_mode?: string;
155
+ font_family?: string;
156
+ terms_url?: string;
157
+ privacy_url?: string;
158
+ /** Raw CSS merged into the hosted auth pages. */
159
+ custom_css?: string;
160
+ }
161
+ interface AuthConfigBlock {
162
+ resources?: ResourceDefinition[];
163
+ groups?: GroupDefinition[];
164
+ relations?: RelationTypeDefinition[];
165
+ registration?: RegistrationConfig;
166
+ oauth?: OAuthProvidersConfig;
167
+ security?: SecurityConfig;
168
+ branding?: BrandingConfig;
169
+ }
170
+ interface MaravillaConfig {
171
+ /** All project-level auth settings. Every field is optional — partial adoption is supported. */
172
+ auth?: AuthConfigBlock;
173
+ }
174
+ /**
175
+ * Identity function that returns the config unchanged — exists purely so the
176
+ * TypeScript compiler can infer `MaravillaConfig` and give you IntelliSense
177
+ * on every field.
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * import { defineConfig } from '@maravilla-labs/platform/config';
182
+ *
183
+ * export default defineConfig({
184
+ * auth: {
185
+ * resources: [{ name: 'todos', title: 'Todos', actions: ['read', 'write'] }],
186
+ * },
187
+ * });
188
+ * ```
189
+ */
190
+ declare function defineConfig(config: MaravillaConfig): MaravillaConfig;
191
+
192
+ export { type AuthConfigBlock, type BrandingConfig, type GroupDefinition, type GroupPermissionDefinition, type MaravillaConfig, type OAuthProviderDefinition, type OAuthProvidersConfig, type PasswordPolicyDefinition, type RegistrationConfig, type RegistrationFieldDefinition, type RelationTypeDefinition, type ResourceDefinition, type SecretRef, type SecurityConfig, type SessionConfigDefinition, defineConfig };
package/dist/config.js ADDED
@@ -0,0 +1,8 @@
1
+ // src/config.ts
2
+ function defineConfig(config) {
3
+ return config;
4
+ }
5
+ export {
6
+ defineConfig
7
+ };
8
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["/**\n * @fileoverview Typed schema for `maravilla.config.{ts,yaml,json}` files.\n *\n * Declares your project's auth settings (resources, groups, relations,\n * registration fields, OAuth providers, security policy, branding) alongside\n * your code. The Maravilla adapter reads this at build time and reconciles\n * the settings into delivery on deploy.\n *\n * ```typescript\n * import { defineConfig } from '@maravilla-labs/platform/config';\n *\n * export default defineConfig({\n * auth: {\n * resources: [\n * { name: 'todos', title: 'Todos', actions: ['read', 'write'],\n * policy: 'auth.user_id == node.owner' },\n * ],\n * },\n * });\n * ```\n *\n * Omitted sections leave the DB alone — partial adoption is explicitly\n * supported. List-based sections (`resources`, `groups`, `relations`,\n * `oauth`) are upserted and never auto-delete DB-only entries. Singleton\n * sections (`registration`, `security`, `branding`) are replaced wholesale\n * when declared.\n */\n\n/**\n * String value that may either be a literal secret or a reference to an\n * environment variable on the **tenant** (resolved server-side at\n * reconcile time, never shipped plaintext in the manifest).\n *\n * Accepted forms:\n * - `\"literal-value\"` — inline (not recommended for real secrets)\n * - `\"${env.VAR_NAME}\"` — string-template form\n * - `{ env: \"VAR_NAME\" }` — object form\n */\nexport type SecretRef = string | { env: string };\n\n// ── Resources + policies ──\n\nexport interface ResourceDefinition {\n /** URL-safe slug. Used as the resource key in code (e.g. the KV namespace). */\n name: string;\n /** Human-readable title for the admin UI. */\n title: string;\n /** Optional longer description. */\n description?: string;\n /** Actions this resource supports, e.g. `['read', 'write', 'delete']`. */\n actions: string[];\n /**\n * Optional raisin-rel policy expression. Evaluated on every KV/DB/\n * realtime/media op that targets this resource. Leave empty to skip\n * Layer 2 for this resource — tenant + owner isolation still applies.\n */\n policy?: string;\n}\n\n// ── Groups ──\n\nexport interface GroupPermissionDefinition {\n /** Must match a `ResourceDefinition.name`. */\n resource_name: string;\n /** Actions this group is granted on the resource. */\n actions: string[];\n}\n\nexport interface GroupDefinition {\n /** Unique group name per tenant. */\n name: string;\n /** Optional description for the admin UI. */\n description?: string;\n /** Resource permissions granted to the group. Replaces the group's current permissions when declared. */\n permissions?: GroupPermissionDefinition[];\n}\n\n// ── Relations ──\n\nexport interface RelationTypeDefinition {\n /** Uppercase identifier used in policies (`... VIA 'STEWARDS'`). */\n relation_name: string;\n /** Human-readable title. */\n title: string;\n description?: string;\n /** Grouping for the admin UI (e.g. `\"family\"`, `\"work\"`). */\n category?: string;\n icon?: string;\n color?: string;\n /** Name of the inverse relation type, if one exists. */\n inverse_relation_name?: string;\n /** When true, membership in this relation implies stewardship rights. */\n implies_stewardship?: boolean;\n /** When true, the relation can only target users flagged as minors. */\n requires_minor?: boolean;\n /** When true, the relation is symmetric (A→B implies B→A). */\n bidirectional?: boolean;\n}\n\n// ── Registration fields ──\n\nexport interface RegistrationFieldDefinition {\n /** Field key used as the form field name + in profile data. */\n key: string;\n /** Display label. */\n label: string;\n /** One of: text, email, phone, date, number, select, boolean, url, textarea. */\n field_type: string;\n required: boolean;\n show_on_register: boolean;\n /** Optional validation metadata — passed through to the UI. */\n validation?: Record<string, unknown>;\n}\n\nexport interface RegistrationConfig {\n /** Ordered list of custom registration fields. Declaring this replaces the full list. */\n fields: RegistrationFieldDefinition[];\n}\n\n// ── OAuth providers ──\n\nexport interface OAuthProviderDefinition {\n enabled: boolean;\n client_id: string;\n /** Prefer `{ env: \"VAR_NAME\" }` or `\"${env.VAR_NAME}\"`. */\n client_secret: SecretRef;\n scopes: string[];\n /** Only for `custom_oidc`. */\n discovery_url?: string;\n}\n\nexport interface OAuthProvidersConfig {\n google?: OAuthProviderDefinition;\n github?: OAuthProviderDefinition;\n okta?: OAuthProviderDefinition;\n custom_oidc?: OAuthProviderDefinition;\n}\n\n// ── Security ──\n\nexport interface PasswordPolicyDefinition {\n min_length: number;\n require_uppercase: boolean;\n require_number: boolean;\n require_special: boolean;\n}\n\nexport interface SessionConfigDefinition {\n access_token_ttl_secs: number;\n refresh_token_ttl_secs: number;\n max_sessions_per_user: number;\n require_email_verification: boolean;\n}\n\nexport interface SecurityConfig {\n password_policy?: PasswordPolicyDefinition;\n session?: SessionConfigDefinition;\n}\n\n// ── Branding ──\n\nexport interface BrandingConfig {\n app_name?: string;\n logo_url?: string;\n primary_color?: string;\n secondary_color?: string;\n welcome_message?: string;\n welcome_subtitle?: string;\n /** `\"centered\"`, `\"split-left\"`, `\"split-right\"`, or `\"fullscreen\"`. */\n layout?: string;\n background_image_url?: string;\n /** 0–100 percentage. */\n background_focal_point?: { x: number; y: number };\n background_gradient?: string;\n /** `\"light\"`, `\"dark\"`, or `\"auto\"`. */\n color_mode?: string;\n font_family?: string;\n terms_url?: string;\n privacy_url?: string;\n /** Raw CSS merged into the hosted auth pages. */\n custom_css?: string;\n}\n\n// ── Top-level shape ──\n\nexport interface AuthConfigBlock {\n resources?: ResourceDefinition[];\n groups?: GroupDefinition[];\n relations?: RelationTypeDefinition[];\n registration?: RegistrationConfig;\n oauth?: OAuthProvidersConfig;\n security?: SecurityConfig;\n branding?: BrandingConfig;\n}\n\nexport interface MaravillaConfig {\n /** All project-level auth settings. Every field is optional — partial adoption is supported. */\n auth?: AuthConfigBlock;\n}\n\n/**\n * Identity function that returns the config unchanged — exists purely so the\n * TypeScript compiler can infer `MaravillaConfig` and give you IntelliSense\n * on every field.\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@maravilla-labs/platform/config';\n *\n * export default defineConfig({\n * auth: {\n * resources: [{ name: 'todos', title: 'Todos', actions: ['read', 'write'] }],\n * },\n * });\n * ```\n */\nexport function defineConfig(config: MaravillaConfig): MaravillaConfig {\n return config;\n}\n"],"mappings":";AAwNO,SAAS,aAAa,QAA0C;AACrE,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maravilla-labs/platform",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "Universal platform client for Maravilla runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -10,6 +10,10 @@
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.js"
13
+ },
14
+ "./config": {
15
+ "types": "./dist/config.d.ts",
16
+ "import": "./dist/config.js"
13
17
  }
14
18
  },
15
19
  "scripts": {
package/src/config.ts ADDED
@@ -0,0 +1,219 @@
1
+ /**
2
+ * @fileoverview Typed schema for `maravilla.config.{ts,yaml,json}` files.
3
+ *
4
+ * Declares your project's auth settings (resources, groups, relations,
5
+ * registration fields, OAuth providers, security policy, branding) alongside
6
+ * your code. The Maravilla adapter reads this at build time and reconciles
7
+ * the settings into delivery on deploy.
8
+ *
9
+ * ```typescript
10
+ * import { defineConfig } from '@maravilla-labs/platform/config';
11
+ *
12
+ * export default defineConfig({
13
+ * auth: {
14
+ * resources: [
15
+ * { name: 'todos', title: 'Todos', actions: ['read', 'write'],
16
+ * policy: 'auth.user_id == node.owner' },
17
+ * ],
18
+ * },
19
+ * });
20
+ * ```
21
+ *
22
+ * Omitted sections leave the DB alone — partial adoption is explicitly
23
+ * supported. List-based sections (`resources`, `groups`, `relations`,
24
+ * `oauth`) are upserted and never auto-delete DB-only entries. Singleton
25
+ * sections (`registration`, `security`, `branding`) are replaced wholesale
26
+ * when declared.
27
+ */
28
+
29
+ /**
30
+ * String value that may either be a literal secret or a reference to an
31
+ * environment variable on the **tenant** (resolved server-side at
32
+ * reconcile time, never shipped plaintext in the manifest).
33
+ *
34
+ * Accepted forms:
35
+ * - `"literal-value"` — inline (not recommended for real secrets)
36
+ * - `"${env.VAR_NAME}"` — string-template form
37
+ * - `{ env: "VAR_NAME" }` — object form
38
+ */
39
+ export type SecretRef = string | { env: string };
40
+
41
+ // ── Resources + policies ──
42
+
43
+ export interface ResourceDefinition {
44
+ /** URL-safe slug. Used as the resource key in code (e.g. the KV namespace). */
45
+ name: string;
46
+ /** Human-readable title for the admin UI. */
47
+ title: string;
48
+ /** Optional longer description. */
49
+ description?: string;
50
+ /** Actions this resource supports, e.g. `['read', 'write', 'delete']`. */
51
+ actions: string[];
52
+ /**
53
+ * Optional raisin-rel policy expression. Evaluated on every KV/DB/
54
+ * realtime/media op that targets this resource. Leave empty to skip
55
+ * Layer 2 for this resource — tenant + owner isolation still applies.
56
+ */
57
+ policy?: string;
58
+ }
59
+
60
+ // ── Groups ──
61
+
62
+ export interface GroupPermissionDefinition {
63
+ /** Must match a `ResourceDefinition.name`. */
64
+ resource_name: string;
65
+ /** Actions this group is granted on the resource. */
66
+ actions: string[];
67
+ }
68
+
69
+ export interface GroupDefinition {
70
+ /** Unique group name per tenant. */
71
+ name: string;
72
+ /** Optional description for the admin UI. */
73
+ description?: string;
74
+ /** Resource permissions granted to the group. Replaces the group's current permissions when declared. */
75
+ permissions?: GroupPermissionDefinition[];
76
+ }
77
+
78
+ // ── Relations ──
79
+
80
+ export interface RelationTypeDefinition {
81
+ /** Uppercase identifier used in policies (`... VIA 'STEWARDS'`). */
82
+ relation_name: string;
83
+ /** Human-readable title. */
84
+ title: string;
85
+ description?: string;
86
+ /** Grouping for the admin UI (e.g. `"family"`, `"work"`). */
87
+ category?: string;
88
+ icon?: string;
89
+ color?: string;
90
+ /** Name of the inverse relation type, if one exists. */
91
+ inverse_relation_name?: string;
92
+ /** When true, membership in this relation implies stewardship rights. */
93
+ implies_stewardship?: boolean;
94
+ /** When true, the relation can only target users flagged as minors. */
95
+ requires_minor?: boolean;
96
+ /** When true, the relation is symmetric (A→B implies B→A). */
97
+ bidirectional?: boolean;
98
+ }
99
+
100
+ // ── Registration fields ──
101
+
102
+ export interface RegistrationFieldDefinition {
103
+ /** Field key used as the form field name + in profile data. */
104
+ key: string;
105
+ /** Display label. */
106
+ label: string;
107
+ /** One of: text, email, phone, date, number, select, boolean, url, textarea. */
108
+ field_type: string;
109
+ required: boolean;
110
+ show_on_register: boolean;
111
+ /** Optional validation metadata — passed through to the UI. */
112
+ validation?: Record<string, unknown>;
113
+ }
114
+
115
+ export interface RegistrationConfig {
116
+ /** Ordered list of custom registration fields. Declaring this replaces the full list. */
117
+ fields: RegistrationFieldDefinition[];
118
+ }
119
+
120
+ // ── OAuth providers ──
121
+
122
+ export interface OAuthProviderDefinition {
123
+ enabled: boolean;
124
+ client_id: string;
125
+ /** Prefer `{ env: "VAR_NAME" }` or `"${env.VAR_NAME}"`. */
126
+ client_secret: SecretRef;
127
+ scopes: string[];
128
+ /** Only for `custom_oidc`. */
129
+ discovery_url?: string;
130
+ }
131
+
132
+ export interface OAuthProvidersConfig {
133
+ google?: OAuthProviderDefinition;
134
+ github?: OAuthProviderDefinition;
135
+ okta?: OAuthProviderDefinition;
136
+ custom_oidc?: OAuthProviderDefinition;
137
+ }
138
+
139
+ // ── Security ──
140
+
141
+ export interface PasswordPolicyDefinition {
142
+ min_length: number;
143
+ require_uppercase: boolean;
144
+ require_number: boolean;
145
+ require_special: boolean;
146
+ }
147
+
148
+ export interface SessionConfigDefinition {
149
+ access_token_ttl_secs: number;
150
+ refresh_token_ttl_secs: number;
151
+ max_sessions_per_user: number;
152
+ require_email_verification: boolean;
153
+ }
154
+
155
+ export interface SecurityConfig {
156
+ password_policy?: PasswordPolicyDefinition;
157
+ session?: SessionConfigDefinition;
158
+ }
159
+
160
+ // ── Branding ──
161
+
162
+ export interface BrandingConfig {
163
+ app_name?: string;
164
+ logo_url?: string;
165
+ primary_color?: string;
166
+ secondary_color?: string;
167
+ welcome_message?: string;
168
+ welcome_subtitle?: string;
169
+ /** `"centered"`, `"split-left"`, `"split-right"`, or `"fullscreen"`. */
170
+ layout?: string;
171
+ background_image_url?: string;
172
+ /** 0–100 percentage. */
173
+ background_focal_point?: { x: number; y: number };
174
+ background_gradient?: string;
175
+ /** `"light"`, `"dark"`, or `"auto"`. */
176
+ color_mode?: string;
177
+ font_family?: string;
178
+ terms_url?: string;
179
+ privacy_url?: string;
180
+ /** Raw CSS merged into the hosted auth pages. */
181
+ custom_css?: string;
182
+ }
183
+
184
+ // ── Top-level shape ──
185
+
186
+ export interface AuthConfigBlock {
187
+ resources?: ResourceDefinition[];
188
+ groups?: GroupDefinition[];
189
+ relations?: RelationTypeDefinition[];
190
+ registration?: RegistrationConfig;
191
+ oauth?: OAuthProvidersConfig;
192
+ security?: SecurityConfig;
193
+ branding?: BrandingConfig;
194
+ }
195
+
196
+ export interface MaravillaConfig {
197
+ /** All project-level auth settings. Every field is optional — partial adoption is supported. */
198
+ auth?: AuthConfigBlock;
199
+ }
200
+
201
+ /**
202
+ * Identity function that returns the config unchanged — exists purely so the
203
+ * TypeScript compiler can infer `MaravillaConfig` and give you IntelliSense
204
+ * on every field.
205
+ *
206
+ * @example
207
+ * ```typescript
208
+ * import { defineConfig } from '@maravilla-labs/platform/config';
209
+ *
210
+ * export default defineConfig({
211
+ * auth: {
212
+ * resources: [{ name: 'todos', title: 'Todos', actions: ['read', 'write'] }],
213
+ * },
214
+ * });
215
+ * ```
216
+ */
217
+ export function defineConfig(config: MaravillaConfig): MaravillaConfig {
218
+ return config;
219
+ }
package/tsup.config.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from 'tsup';
2
2
 
3
3
  export default defineConfig({
4
- entry: ['src/index.ts'],
4
+ entry: ['src/index.ts', 'src/config.ts'],
5
5
  format: ['esm'],
6
6
  dts: true,
7
7
  splitting: false,