@multitenantkit/sdk 0.1.2 → 0.1.3

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.
@@ -1,56 +1,6 @@
1
1
  import { createUseCases } from '@multitenantkit/composition';
2
+ import type { ToolkitOptions } from '@multitenantkit/domain-contracts';
2
3
  import type { Express, Router } from 'express';
3
- import type { ZodSchema } from 'zod';
4
- /**
5
- * Simplified custom fields configuration for Supabase users
6
- * Only requires the schema, everything else is pre-configured
7
- */
8
- export interface SupabaseUserCustomFieldsConfig<TCustomFields> {
9
- /**
10
- * Zod schema defining custom fields structure
11
- */
12
- customSchema: ZodSchema<TCustomFields>;
13
- }
14
- export interface SupabaseOrganizationCustomFieldsConfig<TCustomFields> {
15
- /**
16
- * Zod schema defining custom fields structure
17
- */
18
- customSchema: ZodSchema<TCustomFields>;
19
- }
20
- export interface SupabaseOrganizationMembershipCustomFieldsConfig<TCustomFields> {
21
- /**
22
- * Zod schema defining custom fields structure
23
- */
24
- customSchema: ZodSchema<TCustomFields>;
25
- }
26
- /**
27
- * Simplified toolkit options for Supabase
28
- * Pre-configures common Supabase defaults
29
- */
30
- export interface SupabaseToolkitOptions<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}> {
31
- /**
32
- * Optional naming strategy (defaults to snake_case for Supabase/PostgreSQL)
33
- */
34
- namingStrategy?: 'camelCase' | 'snake_case' | 'kebab-case' | 'PascalCase';
35
- /**
36
- * Users configuration (optional, uses Supabase defaults)
37
- */
38
- users?: {
39
- customFields?: SupabaseUserCustomFieldsConfig<TUserCustomFields>;
40
- };
41
- /**
42
- * Organizations configuration (optional, uses Supabase defaults)
43
- */
44
- organizations?: {
45
- customFields?: SupabaseOrganizationCustomFieldsConfig<TOrganizationCustomFields>;
46
- };
47
- /**
48
- * Organization memberships configuration (optional, uses Supabase defaults)
49
- */
50
- organizationMemberships?: {
51
- customFields?: SupabaseOrganizationMembershipCustomFieldsConfig<TOrganizationMembershipCustomFields>;
52
- };
53
- }
54
4
  /**
55
5
  * Create a complete Express application with Supabase defaults
56
6
  *
@@ -60,11 +10,14 @@ export interface SupabaseToolkitOptions<TUserCustomFields = {}, TOrganizationCus
60
10
  * - Pre-configured Supabase defaults (auth.users, raw_user_meta_data, etc.)
61
11
  * - All MultiTenantKit routes and middleware
62
12
  *
13
+ * Accepts standard ToolkitOptions and applies Supabase-specific defaults.
14
+ * User-provided options take precedence over defaults.
15
+ *
63
16
  * @template TUserCustomFields - Custom fields schema for Users
64
17
  * @template TOrganizationCustomFields - Custom fields schema for Organizations
65
18
  * @template TOrganizationMembershipCustomFields - Custom fields schema for Organization Memberships
66
19
  *
67
- * @param options - Simplified Supabase toolkit options (only custom fields needed)
20
+ * @param options - ToolkitOptions with Supabase defaults applied automatically
68
21
  * @returns Express application ready to listen on a port
69
22
  *
70
23
  * @example
@@ -78,7 +31,7 @@ export interface SupabaseToolkitOptions<TUserCustomFields = {}, TOrganizationCus
78
31
  *
79
32
  * @example
80
33
  * ```typescript
81
- * // With custom fields
34
+ * // With custom fields and hooks
82
35
  * import { createSupabaseExpressApp } from '@multitenantkit/sdk';
83
36
  * import { z } from 'zod';
84
37
  *
@@ -87,25 +40,15 @@ export interface SupabaseToolkitOptions<TUserCustomFields = {}, TOrganizationCus
87
40
  * customFields: {
88
41
  * customSchema: z.object({
89
42
  * firstName: z.string(),
90
- * lastName: z.string(),
91
- * phone: z.string().optional()
92
- * })
93
- * }
94
- * },
95
- * organizations: {
96
- * customFields: {
97
- * customSchema: z.object({
98
- * organizationName: z.string(),
99
- * industry: z.string().optional(),
100
- * size: z.string().optional()
43
+ * lastName: z.string()
101
44
  * })
102
45
  * }
103
46
  * },
104
- * organizationMemberships: {
105
- * customFields: {
106
- * customSchema: z.object({
107
- * internalRole: z.string().optional()
108
- * })
47
+ * useCaseHooks: {
48
+ * CreateUser: {
49
+ * afterExecution: async ({ stepResults }) => {
50
+ * await sendWelcomeEmail(stepResults.output.email);
51
+ * }
109
52
  * }
110
53
  * }
111
54
  * });
@@ -113,18 +56,21 @@ export interface SupabaseToolkitOptions<TUserCustomFields = {}, TOrganizationCus
113
56
  * app.listen(3000);
114
57
  * ```
115
58
  */
116
- export declare function createSupabaseExpressApp<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options?: SupabaseToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): Express;
59
+ export declare function createSupabaseExpressApp<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): Express;
117
60
  /**
118
61
  * Create an Express Router with Supabase defaults
119
62
  *
120
63
  * Use this when you want to integrate MultiTenantKit into an existing Express application.
121
64
  * The router can be mounted at any path in your app.
122
65
  *
66
+ * Accepts standard ToolkitOptions and applies Supabase-specific defaults.
67
+ * User-provided options take precedence over defaults.
68
+ *
123
69
  * @template TUserCustomFields - Custom fields schema for Users
124
70
  * @template TOrganizationCustomFields - Custom fields schema for Organizations
125
71
  * @template TOrganizationMembershipCustomFields - Custom fields schema for Organization Memberships
126
72
  *
127
- * @param options - Simplified Supabase toolkit options (only custom fields needed)
73
+ * @param options - ToolkitOptions with Supabase defaults applied automatically
128
74
  * @returns Express Router with all MultiTenantKit routes
129
75
  *
130
76
  * @example
@@ -163,18 +109,21 @@ export declare function createSupabaseExpressApp<TUserCustomFields = {}, TOrgani
163
109
  * });
164
110
  * ```
165
111
  */
166
- export declare function createSupabaseExpressRouter<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options?: SupabaseToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): Router;
112
+ export declare function createSupabaseExpressRouter<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): Router;
167
113
  /**
168
114
  * Create use cases with Supabase defaults
169
115
  *
170
116
  * Use this when you want to use MultiTenantKit use cases directly without Express.
171
117
  * Useful for background jobs, CLI tools, or custom transport layers.
172
118
  *
119
+ * Accepts standard ToolkitOptions and applies Supabase-specific defaults.
120
+ * User-provided options take precedence over defaults.
121
+ *
173
122
  * @template TUserCustomFields - Custom fields schema for Users
174
123
  * @template TOrganizationCustomFields - Custom fields schema for Organizations
175
124
  * @template TOrganizationMembershipCustomFields - Custom fields schema for Organization Memberships
176
125
  *
177
- * @param options - Simplified Supabase toolkit options (only custom fields needed)
126
+ * @param options - ToolkitOptions with Supabase defaults applied automatically
178
127
  * @returns Configured use cases ready to execute
179
128
  *
180
129
  * @example
@@ -202,5 +151,5 @@ export declare function createSupabaseExpressRouter<TUserCustomFields = {}, TOrg
202
151
  * });
203
152
  * ```
204
153
  */
205
- export declare function createSupabaseUseCases<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options?: SupabaseToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): ReturnType<typeof createUseCases<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>>;
154
+ export declare function createSupabaseUseCases<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): ReturnType<typeof createUseCases<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>>;
206
155
  //# sourceMappingURL=supabase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAOA,OAAO,EAGH,cAAc,EACjB,MAAM,6BAA6B,CAAC;AAOrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,8BAA8B,CAAC,aAAa;IACzD;;OAEG;IACH,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,sCAAsC,CAAC,aAAa;IACjE;;OAEG;IACH,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,gDAAgD,CAAC,aAAa;IAC3E;;OAEG;IACH,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB,CAEnC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE;IAExC;;OAEG;IACH,cAAc,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;IAE1E;;OAEG;IACH,KAAK,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,8BAA8B,CAAC,iBAAiB,CAAC,CAAC;KACpE,CAAC;IAEF;;OAEG;IACH,aAAa,CAAC,EAAE;QACZ,YAAY,CAAC,EAAE,sCAAsC,CAAC,yBAAyB,CAAC,CAAC;KACpF,CAAC;IAEF;;OAEG;IACH,uBAAuB,CAAC,EAAE;QACtB,YAAY,CAAC,EAAE,gDAAgD,CAAC,mCAAmC,CAAC,CAAC;KACxG,CAAC;CACL;AAmID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,wBAAgB,wBAAwB,CAEpC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,CAAC,EAAE,sBAAsB,CAC5B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,OAAO,CAwCT;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,2BAA2B,CAEvC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,CAAC,EAAE,sBAAsB,CAC5B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,MAAM,CAwCR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,sBAAsB,CAElC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,CAAC,EAAE,sBAAsB,CAC5B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,UAAU,CACT,OAAO,cAAc,CACjB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CACJ,CA2BA"}
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAOA,OAAO,EAGH,cAAc,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAqH/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,wBAAgB,wBAAwB,CAEpC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,CAAC,EAAE,cAAc,CACpB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,OAAO,CAwCT;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,wBAAgB,2BAA2B,CAEvC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,CAAC,EAAE,cAAc,CACpB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,MAAM,CAwCR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,sBAAsB,CAElC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,CAAC,EAAE,cAAc,CACpB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,UAAU,CACT,OAAO,cAAc,CACjB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CACJ,CA2BA"}
package/dist/supabase.js CHANGED
@@ -6,109 +6,99 @@ import { buildExpressApp, buildExpressRouter } from '@multitenantkit/adapter-tra
6
6
  import { buildHandlers } from '@multitenantkit/api-handlers';
7
7
  import { createPostgresAdapters, createSystemAdapters, createUseCases } from '@multitenantkit/composition';
8
8
  /**
9
- * Converts simplified Supabase options to full ToolkitOptions
10
- * Applies Supabase-specific defaults
9
+ * Merges user-provided ToolkitOptions with Supabase-specific defaults.
10
+ *
11
+ * Supabase defaults applied:
12
+ * - namingStrategy: 'snake_case'
13
+ * - users.database: { schema: 'auth', table: 'users' }
14
+ * - users.customFields.columnMapping: { externalId: 'id', username: 'email' }
15
+ * - users.customFields.customMapper: maps to/from raw_user_meta_data
16
+ * - organizations.database: { schema: 'public', table: 'organizations' }
17
+ * - organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }
18
+ *
19
+ * User-provided options take precedence over defaults.
11
20
  */
12
- function buildSupabaseToolkitOptions(options) {
13
- const toolkitOptions = {
14
- namingStrategy: options?.namingStrategy ?? 'snake_case'
15
- };
16
- // Configure users with Supabase defaults
17
- if (options?.users?.customFields) {
18
- const userCustomFieldsConfig = {
19
- customSchema: options.users.customFields.customSchema,
20
- // Map to Supabase's raw_user_meta_data column
21
- customMapper: {
22
- toDb: (fields) => ({
23
- raw_user_meta_data: {
24
- sub: fields.id,
25
- email: fields.email,
26
- ...fields,
27
- email_verified: true,
28
- phone_verified: false
29
- }
30
- }),
31
- toDomain: (dbRow) => {
32
- const metadata = dbRow.raw_user_meta_data || {};
33
- // biome-ignore lint/correctness/noUnusedVariables: these fields are intentionally extracted to exclude them
34
- const { sub, email_verified, phone_verified, ...customFields } = metadata;
35
- return customFields;
36
- }
37
- },
38
- // Map base fields to Supabase columns
39
- columnMapping: {
40
- externalId: 'id',
41
- username: 'email'
42
- }
43
- };
44
- toolkitOptions.users = {
45
- customFields: userCustomFieldsConfig,
46
- database: {
47
- schema: 'auth',
48
- table: 'users'
49
- }
50
- };
51
- }
52
- else {
53
- // No custom fields, but still configure Supabase defaults for users
54
- toolkitOptions.users = {
55
- customFields: {
56
- columnMapping: {
57
- externalId: 'id',
58
- username: 'email'
59
- }
60
- },
61
- database: {
62
- schema: 'auth',
63
- table: 'users'
64
- }
65
- };
66
- }
67
- // Configure organizations with Supabase defaults
68
- if (options?.organizations?.customFields) {
69
- const orgCustomFieldsConfig = {
70
- customSchema: options.organizations.customFields.customSchema
71
- };
72
- toolkitOptions.organizations = {
73
- customFields: orgCustomFieldsConfig,
74
- database: {
75
- schema: 'public',
76
- table: 'organizations'
77
- }
78
- };
79
- }
80
- else {
81
- // No custom fields, but still configure database defaults
82
- toolkitOptions.organizations = {
83
- database: {
84
- schema: 'public',
85
- table: 'organizations'
21
+ function applySupabaseDefaults(options) {
22
+ // Default Supabase customMapper for users (maps to raw_user_meta_data)
23
+ const supabaseUserMapper = {
24
+ toDb: (fields) => ({
25
+ raw_user_meta_data: {
26
+ sub: fields.id,
27
+ email: fields.email,
28
+ ...fields,
29
+ email_verified: true,
30
+ phone_verified: false
86
31
  }
87
- };
88
- }
89
- // Configure organization memberships with Supabase defaults
90
- if (options?.organizationMemberships?.customFields) {
91
- const membershipCustomFieldsConfig = {
92
- customSchema: options.organizationMemberships.customFields.customSchema
93
- };
94
- toolkitOptions.organizationMemberships = {
95
- customFields: membershipCustomFieldsConfig,
96
- database: {
97
- schema: 'public',
98
- table: 'organization_memberships'
99
- }
100
- };
101
- }
102
- else {
103
- // No custom fields, but still configure database defaults
104
- toolkitOptions.organizationMemberships = {
105
- database: {
106
- schema: 'public',
107
- table: 'organization_memberships'
108
- }
109
- };
110
- }
111
- return toolkitOptions;
32
+ }),
33
+ toDomain: (dbRow) => {
34
+ const metadata = dbRow.raw_user_meta_data || {};
35
+ // biome-ignore lint/correctness/noUnusedVariables: these fields are intentionally extracted to exclude them
36
+ const { sub, email_verified, phone_verified, ...customFields } = metadata;
37
+ return customFields;
38
+ }
39
+ };
40
+ // Default Supabase columnMapping for users
41
+ const supabaseUserColumnMapping = {
42
+ externalId: 'id',
43
+ username: 'email'
44
+ };
45
+ // Build users config with Supabase defaults
46
+ const usersConfig = {
47
+ customFields: {
48
+ // User's customSchema if provided
49
+ ...(options?.users?.customFields?.customSchema && {
50
+ customSchema: options.users.customFields.customSchema
51
+ }),
52
+ // Use user's columnMapping or Supabase default
53
+ columnMapping: options?.users?.customFields?.columnMapping ?? supabaseUserColumnMapping,
54
+ // Use user's customMapper or Supabase default (only if customSchema is provided)
55
+ ...(options?.users?.customFields?.customSchema && {
56
+ customMapper: options?.users?.customFields?.customMapper ?? supabaseUserMapper
57
+ })
58
+ },
59
+ database: {
60
+ schema: options?.users?.database?.schema ?? 'auth',
61
+ table: options?.users?.database?.table ?? 'users',
62
+ ...(options?.users?.database?.namingStrategy && {
63
+ namingStrategy: options.users.database.namingStrategy
64
+ })
65
+ }
66
+ };
67
+ // Build organizations config with Supabase defaults
68
+ const organizationsConfig = {
69
+ ...(options?.organizations?.customFields && {
70
+ customFields: options.organizations.customFields
71
+ }),
72
+ database: {
73
+ schema: options?.organizations?.database?.schema ?? 'public',
74
+ table: options?.organizations?.database?.table ?? 'organizations',
75
+ ...(options?.organizations?.database?.namingStrategy && {
76
+ namingStrategy: options.organizations.database.namingStrategy
77
+ })
78
+ }
79
+ };
80
+ // Build organization memberships config with Supabase defaults
81
+ const organizationMembershipsConfig = {
82
+ ...(options?.organizationMemberships?.customFields && {
83
+ customFields: options.organizationMemberships.customFields
84
+ }),
85
+ database: {
86
+ schema: options?.organizationMemberships?.database?.schema ?? 'public',
87
+ table: options?.organizationMemberships?.database?.table ?? 'organization_memberships',
88
+ ...(options?.organizationMemberships?.database?.namingStrategy && {
89
+ namingStrategy: options.organizationMemberships.database.namingStrategy
90
+ })
91
+ }
92
+ };
93
+ return {
94
+ namingStrategy: options?.namingStrategy ?? 'snake_case',
95
+ users: usersConfig,
96
+ organizations: organizationsConfig,
97
+ organizationMemberships: organizationMembershipsConfig,
98
+ // Pass through other options as-is
99
+ ...(options?.useCaseHooks && { useCaseHooks: options.useCaseHooks }),
100
+ ...(options?.responseTransformers && { responseTransformers: options.responseTransformers })
101
+ };
112
102
  }
113
103
  /**
114
104
  * Create a complete Express application with Supabase defaults
@@ -119,11 +109,14 @@ function buildSupabaseToolkitOptions(options) {
119
109
  * - Pre-configured Supabase defaults (auth.users, raw_user_meta_data, etc.)
120
110
  * - All MultiTenantKit routes and middleware
121
111
  *
112
+ * Accepts standard ToolkitOptions and applies Supabase-specific defaults.
113
+ * User-provided options take precedence over defaults.
114
+ *
122
115
  * @template TUserCustomFields - Custom fields schema for Users
123
116
  * @template TOrganizationCustomFields - Custom fields schema for Organizations
124
117
  * @template TOrganizationMembershipCustomFields - Custom fields schema for Organization Memberships
125
118
  *
126
- * @param options - Simplified Supabase toolkit options (only custom fields needed)
119
+ * @param options - ToolkitOptions with Supabase defaults applied automatically
127
120
  * @returns Express application ready to listen on a port
128
121
  *
129
122
  * @example
@@ -137,7 +130,7 @@ function buildSupabaseToolkitOptions(options) {
137
130
  *
138
131
  * @example
139
132
  * ```typescript
140
- * // With custom fields
133
+ * // With custom fields and hooks
141
134
  * import { createSupabaseExpressApp } from '@multitenantkit/sdk';
142
135
  * import { z } from 'zod';
143
136
  *
@@ -146,25 +139,15 @@ function buildSupabaseToolkitOptions(options) {
146
139
  * customFields: {
147
140
  * customSchema: z.object({
148
141
  * firstName: z.string(),
149
- * lastName: z.string(),
150
- * phone: z.string().optional()
151
- * })
152
- * }
153
- * },
154
- * organizations: {
155
- * customFields: {
156
- * customSchema: z.object({
157
- * organizationName: z.string(),
158
- * industry: z.string().optional(),
159
- * size: z.string().optional()
142
+ * lastName: z.string()
160
143
  * })
161
144
  * }
162
145
  * },
163
- * organizationMemberships: {
164
- * customFields: {
165
- * customSchema: z.object({
166
- * internalRole: z.string().optional()
167
- * })
146
+ * useCaseHooks: {
147
+ * CreateUser: {
148
+ * afterExecution: async ({ stepResults }) => {
149
+ * await sendWelcomeEmail(stepResults.output.email);
150
+ * }
168
151
  * }
169
152
  * }
170
153
  * });
@@ -173,7 +156,7 @@ function buildSupabaseToolkitOptions(options) {
173
156
  * ```
174
157
  */
175
158
  export function createSupabaseExpressApp(options) {
176
- const toolkitOptions = buildSupabaseToolkitOptions(options);
159
+ const toolkitOptions = applySupabaseDefaults(options);
177
160
  // 1. Create persistence adapters (PostgreSQL)
178
161
  const persistenceAdapters = createPostgresAdapters(undefined, toolkitOptions);
179
162
  // 2. Create system and metrics adapters
@@ -197,11 +180,14 @@ export function createSupabaseExpressApp(options) {
197
180
  * Use this when you want to integrate MultiTenantKit into an existing Express application.
198
181
  * The router can be mounted at any path in your app.
199
182
  *
183
+ * Accepts standard ToolkitOptions and applies Supabase-specific defaults.
184
+ * User-provided options take precedence over defaults.
185
+ *
200
186
  * @template TUserCustomFields - Custom fields schema for Users
201
187
  * @template TOrganizationCustomFields - Custom fields schema for Organizations
202
188
  * @template TOrganizationMembershipCustomFields - Custom fields schema for Organization Memberships
203
189
  *
204
- * @param options - Simplified Supabase toolkit options (only custom fields needed)
190
+ * @param options - ToolkitOptions with Supabase defaults applied automatically
205
191
  * @returns Express Router with all MultiTenantKit routes
206
192
  *
207
193
  * @example
@@ -241,7 +227,7 @@ export function createSupabaseExpressApp(options) {
241
227
  * ```
242
228
  */
243
229
  export function createSupabaseExpressRouter(options) {
244
- const toolkitOptions = buildSupabaseToolkitOptions(options);
230
+ const toolkitOptions = applySupabaseDefaults(options);
245
231
  // 1. Create persistence adapters (PostgreSQL)
246
232
  const persistenceAdapters = createPostgresAdapters(undefined, toolkitOptions);
247
233
  // 2. Create system and metrics adapters
@@ -265,11 +251,14 @@ export function createSupabaseExpressRouter(options) {
265
251
  * Use this when you want to use MultiTenantKit use cases directly without Express.
266
252
  * Useful for background jobs, CLI tools, or custom transport layers.
267
253
  *
254
+ * Accepts standard ToolkitOptions and applies Supabase-specific defaults.
255
+ * User-provided options take precedence over defaults.
256
+ *
268
257
  * @template TUserCustomFields - Custom fields schema for Users
269
258
  * @template TOrganizationCustomFields - Custom fields schema for Organizations
270
259
  * @template TOrganizationMembershipCustomFields - Custom fields schema for Organization Memberships
271
260
  *
272
- * @param options - Simplified Supabase toolkit options (only custom fields needed)
261
+ * @param options - ToolkitOptions with Supabase defaults applied automatically
273
262
  * @returns Configured use cases ready to execute
274
263
  *
275
264
  * @example
@@ -298,7 +287,7 @@ export function createSupabaseExpressRouter(options) {
298
287
  * ```
299
288
  */
300
289
  export function createSupabaseUseCases(options) {
301
- const toolkitOptions = buildSupabaseToolkitOptions(options);
290
+ const toolkitOptions = applySupabaseDefaults(options);
302
291
  // 1. Create persistence adapters (PostgreSQL)
303
292
  const persistenceAdapters = createPostgresAdapters(undefined, toolkitOptions);
304
293
  // 2. Create system and metrics adapters
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multitenantkit/sdk",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Complete SDK for building multi-tenant SaaS applications - includes all adapters and options",
5
5
  "keywords": [
6
6
  "multitenantkit",