@baasix/types 1.0.5 → 1.0.6

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/index.d.mts CHANGED
@@ -410,6 +410,13 @@ interface SchemaDefinition {
410
410
  timestamps?: boolean;
411
411
  paranoid?: boolean;
412
412
  sortEnabled?: boolean;
413
+ /**
414
+ * Controls tenant context enforcement for this collection.
415
+ * - true: enforce tenant scoping
416
+ * - false: global/shared collection (no tenant enforcement)
417
+ * - undefined: use default runtime behavior
418
+ */
419
+ tenantScoped?: boolean;
413
420
  /**
414
421
  * Track user who created/updated records (adds createdBy_Id, updatedBy_Id)
415
422
  */
package/dist/index.d.ts CHANGED
@@ -410,6 +410,13 @@ interface SchemaDefinition {
410
410
  timestamps?: boolean;
411
411
  paranoid?: boolean;
412
412
  sortEnabled?: boolean;
413
+ /**
414
+ * Controls tenant context enforcement for this collection.
415
+ * - true: enforce tenant scoping
416
+ * - false: global/shared collection (no tenant enforcement)
417
+ * - undefined: use default runtime behavior
418
+ */
419
+ tenantScoped?: boolean;
413
420
  /**
414
421
  * Track user who created/updated records (adds createdBy_Id, updatedBy_Id)
415
422
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baasix/types",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Shared TypeScript types for Baasix packages",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
package/src/common.ts CHANGED
@@ -1,244 +1,244 @@
1
- /**
2
- * Common/Utility Types
3
- * Shared across all packages
4
- */
5
-
6
- // ============================================================================
7
- // Base Types
8
- // ============================================================================
9
-
10
- /**
11
- * Generic record type with ID
12
- */
13
- export interface BaseItem {
14
- id: string;
15
- createdAt?: string;
16
- updatedAt?: string;
17
- deletedAt?: string;
18
- [key: string]: unknown;
19
- }
20
-
21
- /**
22
- * Timestamped item
23
- */
24
- export interface TimestampedItem {
25
- createdAt: string;
26
- updatedAt?: string;
27
- }
28
-
29
- /**
30
- * Soft deletable item
31
- */
32
- export interface SoftDeletableItem {
33
- deletedAt?: string | null;
34
- }
35
-
36
- // ============================================================================
37
- // Utility Types
38
- // ============================================================================
39
-
40
- /**
41
- * Make all properties of T optional recursively
42
- */
43
- export type DeepPartial<T> = {
44
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
45
- };
46
-
47
- /**
48
- * Extract the item type from a collection
49
- */
50
- export type CollectionItem<T> = T extends Array<infer U> ? U : T;
51
-
52
- /**
53
- * Make specific properties required
54
- */
55
- export type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };
56
-
57
- /**
58
- * Make specific properties optional
59
- */
60
- export type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
61
-
62
- /**
63
- * Extract keys of T that have values of type V
64
- */
65
- export type KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];
66
-
67
- /**
68
- * Record with string keys and unknown values
69
- */
70
- export type AnyRecord = Record<string, unknown>;
71
-
72
- // ============================================================================
73
- // Settings Types
74
- // ============================================================================
75
-
76
- /**
77
- * Generic settings
78
- */
79
- export interface Settings {
80
- [key: string]: unknown;
81
- }
82
-
83
- /**
84
- * Tenant settings
85
- */
86
- export interface TenantSettings {
87
- tenant_Id?: string | number | null;
88
- project_name?: string;
89
- title?: string;
90
- project_url?: string | null;
91
- app_url?: string | null;
92
- project_color?: string;
93
- secondary_color?: string;
94
- description?: string;
95
- keywords?: string;
96
- from_email_name?: string;
97
- smtp_enabled?: boolean;
98
- smtp_host?: string;
99
- smtp_port?: number;
100
- smtp_secure?: boolean;
101
- smtp_user?: string;
102
- smtp_pass?: string;
103
- smtp_from_address?: string;
104
- timezone?: string;
105
- language?: string;
106
- date_format?: string;
107
- currency?: string;
108
- email_signature?: string;
109
- email_icon?: any;
110
- metadata?: Record<string, any>;
111
- modules?: Record<string, any>;
112
- [key: string]: any;
113
- }
114
-
115
- // ============================================================================
116
- // Task Types
117
- // ============================================================================
118
-
119
- /**
120
- * Background task
121
- */
122
- export interface BackgroundTask {
123
- id: string | number;
124
- task_status: string;
125
- scheduled_time: Date;
126
- max_retries?: number;
127
- retry_count?: number;
128
- started_at?: Date | null;
129
- [key: string]: unknown;
130
- }
131
-
132
- // ============================================================================
133
- // Hook Types
134
- // ============================================================================
135
-
136
- /**
137
- * Hook events
138
- */
139
- export type HookEvent =
140
- | "items.create"
141
- | "items.read"
142
- | "items.update"
143
- | "items.delete"
144
- | "auth.login"
145
- | "auth.logout"
146
- | "auth.register";
147
-
148
- /**
149
- * Hook handler context
150
- */
151
- export interface HookContext {
152
- event: HookEvent;
153
- collection?: string;
154
- payload?: unknown;
155
- keys?: string[];
156
- accountability?: {
157
- user?: { id: string };
158
- role?: { id: string; name: string };
159
- tenant?: { id: string };
160
- };
161
- }
162
-
163
- /**
164
- * Hook handler function
165
- */
166
- export type HookHandler = (context: HookContext) => void | Promise<void>;
167
-
168
- /**
169
- * Hook definition
170
- */
171
- export interface Hook {
172
- event: HookEvent;
173
- collection?: string;
174
- handler: HookHandler;
175
- }
176
-
177
- // ============================================================================
178
- // HTTP Types
179
- // ============================================================================
180
-
181
- /**
182
- * HTTP methods
183
- */
184
- export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD";
185
-
186
- // ============================================================================
187
- // Mail Types
188
- // ============================================================================
189
-
190
- /**
191
- * Mail options for sending emails
192
- */
193
- export interface MailOptions {
194
- to: string | string[];
195
- subject: string;
196
- html?: string;
197
- text?: string;
198
- from?: string;
199
- cc?: string | string[];
200
- bcc?: string | string[];
201
- replyTo?: string;
202
- attachments?: Array<{
203
- filename: string;
204
- content?: string | Buffer;
205
- path?: string;
206
- contentType?: string;
207
- }>;
208
- }
209
-
210
- /**
211
- * Sender configuration for email
212
- */
213
- export interface SenderConfig {
214
- from: string;
215
- name?: string;
216
- replyTo?: string;
217
- }
218
-
219
- // ============================================================================
220
- // Seed Types
221
- // ============================================================================
222
-
223
- /**
224
- * Seed data configuration
225
- */
226
- export interface SeedData {
227
- collection: string;
228
- data: Record<string, unknown> | Record<string, unknown>[];
229
- /** Whether to clear existing data before seeding */
230
- clearBefore?: boolean;
231
- /** Whether to skip if data already exists (check by unique fields) */
232
- skipDuplicates?: boolean;
233
- }
234
-
235
- /**
236
- * Seed operation result
237
- */
238
- export interface SeedResult {
239
- collection: string;
240
- created: number;
241
- skipped: number;
242
- errors: number;
243
- errorDetails?: Array<{ item: unknown; error: string }>;
244
- }
1
+ /**
2
+ * Common/Utility Types
3
+ * Shared across all packages
4
+ */
5
+
6
+ // ============================================================================
7
+ // Base Types
8
+ // ============================================================================
9
+
10
+ /**
11
+ * Generic record type with ID
12
+ */
13
+ export interface BaseItem {
14
+ id: string;
15
+ createdAt?: string;
16
+ updatedAt?: string;
17
+ deletedAt?: string;
18
+ [key: string]: unknown;
19
+ }
20
+
21
+ /**
22
+ * Timestamped item
23
+ */
24
+ export interface TimestampedItem {
25
+ createdAt: string;
26
+ updatedAt?: string;
27
+ }
28
+
29
+ /**
30
+ * Soft deletable item
31
+ */
32
+ export interface SoftDeletableItem {
33
+ deletedAt?: string | null;
34
+ }
35
+
36
+ // ============================================================================
37
+ // Utility Types
38
+ // ============================================================================
39
+
40
+ /**
41
+ * Make all properties of T optional recursively
42
+ */
43
+ export type DeepPartial<T> = {
44
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
45
+ };
46
+
47
+ /**
48
+ * Extract the item type from a collection
49
+ */
50
+ export type CollectionItem<T> = T extends Array<infer U> ? U : T;
51
+
52
+ /**
53
+ * Make specific properties required
54
+ */
55
+ export type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };
56
+
57
+ /**
58
+ * Make specific properties optional
59
+ */
60
+ export type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
61
+
62
+ /**
63
+ * Extract keys of T that have values of type V
64
+ */
65
+ export type KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];
66
+
67
+ /**
68
+ * Record with string keys and unknown values
69
+ */
70
+ export type AnyRecord = Record<string, unknown>;
71
+
72
+ // ============================================================================
73
+ // Settings Types
74
+ // ============================================================================
75
+
76
+ /**
77
+ * Generic settings
78
+ */
79
+ export interface Settings {
80
+ [key: string]: unknown;
81
+ }
82
+
83
+ /**
84
+ * Tenant settings
85
+ */
86
+ export interface TenantSettings {
87
+ tenant_Id?: string | number | null;
88
+ project_name?: string;
89
+ title?: string;
90
+ project_url?: string | null;
91
+ app_url?: string | null;
92
+ project_color?: string;
93
+ secondary_color?: string;
94
+ description?: string;
95
+ keywords?: string;
96
+ from_email_name?: string;
97
+ smtp_enabled?: boolean;
98
+ smtp_host?: string;
99
+ smtp_port?: number;
100
+ smtp_secure?: boolean;
101
+ smtp_user?: string;
102
+ smtp_pass?: string;
103
+ smtp_from_address?: string;
104
+ timezone?: string;
105
+ language?: string;
106
+ date_format?: string;
107
+ currency?: string;
108
+ email_signature?: string;
109
+ email_icon?: any;
110
+ metadata?: Record<string, any>;
111
+ modules?: Record<string, any>;
112
+ [key: string]: any;
113
+ }
114
+
115
+ // ============================================================================
116
+ // Task Types
117
+ // ============================================================================
118
+
119
+ /**
120
+ * Background task
121
+ */
122
+ export interface BackgroundTask {
123
+ id: string | number;
124
+ task_status: string;
125
+ scheduled_time: Date;
126
+ max_retries?: number;
127
+ retry_count?: number;
128
+ started_at?: Date | null;
129
+ [key: string]: unknown;
130
+ }
131
+
132
+ // ============================================================================
133
+ // Hook Types
134
+ // ============================================================================
135
+
136
+ /**
137
+ * Hook events
138
+ */
139
+ export type HookEvent =
140
+ | "items.create"
141
+ | "items.read"
142
+ | "items.update"
143
+ | "items.delete"
144
+ | "auth.login"
145
+ | "auth.logout"
146
+ | "auth.register";
147
+
148
+ /**
149
+ * Hook handler context
150
+ */
151
+ export interface HookContext {
152
+ event: HookEvent;
153
+ collection?: string;
154
+ payload?: unknown;
155
+ keys?: string[];
156
+ accountability?: {
157
+ user?: { id: string };
158
+ role?: { id: string; name: string };
159
+ tenant?: { id: string };
160
+ };
161
+ }
162
+
163
+ /**
164
+ * Hook handler function
165
+ */
166
+ export type HookHandler = (context: HookContext) => void | Promise<void>;
167
+
168
+ /**
169
+ * Hook definition
170
+ */
171
+ export interface Hook {
172
+ event: HookEvent;
173
+ collection?: string;
174
+ handler: HookHandler;
175
+ }
176
+
177
+ // ============================================================================
178
+ // HTTP Types
179
+ // ============================================================================
180
+
181
+ /**
182
+ * HTTP methods
183
+ */
184
+ export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD";
185
+
186
+ // ============================================================================
187
+ // Mail Types
188
+ // ============================================================================
189
+
190
+ /**
191
+ * Mail options for sending emails
192
+ */
193
+ export interface MailOptions {
194
+ to: string | string[];
195
+ subject: string;
196
+ html?: string;
197
+ text?: string;
198
+ from?: string;
199
+ cc?: string | string[];
200
+ bcc?: string | string[];
201
+ replyTo?: string;
202
+ attachments?: Array<{
203
+ filename: string;
204
+ content?: string | Buffer;
205
+ path?: string;
206
+ contentType?: string;
207
+ }>;
208
+ }
209
+
210
+ /**
211
+ * Sender configuration for email
212
+ */
213
+ export interface SenderConfig {
214
+ from: string;
215
+ name?: string;
216
+ replyTo?: string;
217
+ }
218
+
219
+ // ============================================================================
220
+ // Seed Types
221
+ // ============================================================================
222
+
223
+ /**
224
+ * Seed data configuration
225
+ */
226
+ export interface SeedData {
227
+ collection: string;
228
+ data: Record<string, unknown> | Record<string, unknown>[];
229
+ /** Whether to clear existing data before seeding */
230
+ clearBefore?: boolean;
231
+ /** Whether to skip if data already exists (check by unique fields) */
232
+ skipDuplicates?: boolean;
233
+ }
234
+
235
+ /**
236
+ * Seed operation result
237
+ */
238
+ export interface SeedResult {
239
+ collection: string;
240
+ created: number;
241
+ skipped: number;
242
+ errors: number;
243
+ errorDetails?: Array<{ item: unknown; error: string }>;
244
+ }
package/src/schema.ts CHANGED
@@ -205,6 +205,13 @@ export interface SchemaDefinition {
205
205
  timestamps?: boolean;
206
206
  paranoid?: boolean;
207
207
  sortEnabled?: boolean;
208
+ /**
209
+ * Controls tenant context enforcement for this collection.
210
+ * - true: enforce tenant scoping
211
+ * - false: global/shared collection (no tenant enforcement)
212
+ * - undefined: use default runtime behavior
213
+ */
214
+ tenantScoped?: boolean;
208
215
  /**
209
216
  * Track user who created/updated records (adds createdBy_Id, updatedBy_Id)
210
217
  */