@multitenantkit/sdk-supabase 0.2.2 → 0.2.4

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.
@@ -3,33 +3,74 @@
3
3
  *
4
4
  * Creates complete adapters bundle for Supabase Edge Functions.
5
5
  * Uses Web Crypto API for UUID generation (Deno compatible).
6
+ * Applies Supabase-specific defaults automatically.
6
7
  */
7
8
  import type { Adapters, ToolkitOptions } from '@multitenantkit/domain-contracts';
8
9
  import type { SupabaseClient } from '@supabase/supabase-js';
10
+ /**
11
+ * Merges user-provided ToolkitOptions with Supabase-specific defaults.
12
+ *
13
+ * Supabase defaults applied:
14
+ * - namingStrategy: 'snake_case'
15
+ * - users.database: { schema: 'public', table: 'profiles' }
16
+ * - users.customFields.columnMapping: { externalId: 'external_id', username: 'username' }
17
+ * - organizations.database: { schema: 'public', table: 'organizations' }
18
+ * - organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }
19
+ *
20
+ * Note: We use public.profiles instead of auth.users because:
21
+ * - auth.users is not accessible via PostgREST (Supabase client)
22
+ * - auth.users is managed by GoTrue and shouldn't be modified directly
23
+ * - public.profiles gives you full control over user data
24
+ *
25
+ * User-provided options take precedence over defaults.
26
+ */
27
+ export declare function applySupabaseDefaults<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>(options?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>;
9
28
  /**
10
29
  * Options for creating Supabase adapters
11
30
  */
12
31
  export interface CreateSupabaseAdaptersOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields> {
13
32
  /** Supabase client instance */
14
33
  client: SupabaseClient;
15
- /** Toolkit options for custom fields and database configuration */
34
+ /**
35
+ * Toolkit options for custom fields and database configuration.
36
+ * Supabase defaults are applied automatically (auth.users, snake_case, etc.)
37
+ * Your options take precedence over defaults.
38
+ */
16
39
  toolkitOptions?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>;
17
40
  }
41
+ /**
42
+ * Result of createSupabaseAdapters including adapters and resolved toolkitOptions
43
+ */
44
+ export interface SupabaseAdaptersResult<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields> {
45
+ /** The adapters bundle (persistence + system) */
46
+ adapters: Adapters<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>;
47
+ /** The toolkit options with Supabase defaults applied */
48
+ toolkitOptions: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>;
49
+ }
18
50
  /**
19
51
  * Create complete Supabase adapters bundle (persistence + system)
20
52
  *
21
53
  * This is the main factory function for Supabase/Deno environments.
22
54
  * It creates all necessary adapters with NO Node.js dependencies.
23
55
  *
56
+ * **Supabase defaults applied automatically:**
57
+ * - `namingStrategy: 'snake_case'`
58
+ * - `users.database: { schema: 'auth', table: 'users' }`
59
+ * - `users.customFields.columnMapping: { externalId: 'id', username: 'email' }`
60
+ * - `organizations.database: { schema: 'public', table: 'organizations' }`
61
+ * - `organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }`
62
+ *
63
+ * Your options take precedence over defaults.
64
+ *
24
65
  * @example
25
66
  * ```typescript
26
67
  * import { createSupabaseAdapters, createUseCases } from '@multitenantkit/sdk-supabase';
27
68
  * import { createClient } from '@supabase/supabase-js';
28
69
  *
29
70
  * const client = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY);
30
- * const adapters = createSupabaseAdapters({ client });
31
- * const useCases = createUseCases(adapters);
71
+ * const { adapters, toolkitOptions } = createSupabaseAdapters({ client });
72
+ * const useCases = createUseCases(adapters, toolkitOptions);
32
73
  * ```
33
74
  */
34
- export declare function createSupabaseAdapters<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options: CreateSupabaseAdaptersOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): Adapters<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>;
75
+ export declare function createSupabaseAdapters<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}>(options: CreateSupabaseAdaptersOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>): SupabaseAdaptersResult<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>;
35
76
  //# sourceMappingURL=AdapterFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterFactory.d.ts","sourceRoot":"","sources":["../../src/factories/AdapterFactory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACR,QAAQ,EAIR,cAAc,EACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAY5D;;GAEG;AACH,MAAM,WAAW,6BAA6B,CAC1C,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC;IAEnC,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,mEAAmE;IACnE,cAAc,CAAC,EAAE,cAAc,CAC3B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CAAC;CACL;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAElC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,EAAE,6BAA6B,CAClC,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,QAAQ,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,mCAAmC,CAAC,CAwB7F"}
1
+ {"version":3,"file":"AdapterFactory.d.ts","sourceRoot":"","sources":["../../src/factories/AdapterFactory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACR,QAAQ,EAIR,cAAc,EAEjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAY5D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACjC,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,EAEnC,OAAO,CAAC,EAAE,cAAc,CACpB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,cAAc,CACb,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CAmEA;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B,CAC1C,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC;IAEnC,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAC3B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CACnC,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC;IAEnC,iDAAiD;IACjD,QAAQ,EAAE,QAAQ,CACd,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CAAC;IACF,yDAAyD;IACzD,cAAc,EAAE,cAAc,CAC1B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CAAC;CACL;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,sBAAsB,CAElC,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,EAExC,OAAO,EAAE,6BAA6B,CAClC,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,GACF,sBAAsB,CACrB,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CAqCA"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Creates complete adapters bundle for Supabase Edge Functions.
5
5
  * Uses Web Crypto API for UUID generation (Deno compatible).
6
+ * Applies Supabase-specific defaults automatically.
6
7
  */
7
8
  import { createSupabaseRepositories } from '@multitenantkit/adapter-persistence-supabase';
8
9
  import { WebCryptoUuid } from '@multitenantkit/adapter-system-web-crypto';
@@ -15,24 +16,116 @@ class WebClock {
15
16
  return new Date();
16
17
  }
17
18
  }
19
+ /**
20
+ * Merges user-provided ToolkitOptions with Supabase-specific defaults.
21
+ *
22
+ * Supabase defaults applied:
23
+ * - namingStrategy: 'snake_case'
24
+ * - users.database: { schema: 'public', table: 'profiles' }
25
+ * - users.customFields.columnMapping: { externalId: 'external_id', username: 'username' }
26
+ * - organizations.database: { schema: 'public', table: 'organizations' }
27
+ * - organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }
28
+ *
29
+ * Note: We use public.profiles instead of auth.users because:
30
+ * - auth.users is not accessible via PostgREST (Supabase client)
31
+ * - auth.users is managed by GoTrue and shouldn't be modified directly
32
+ * - public.profiles gives you full control over user data
33
+ *
34
+ * User-provided options take precedence over defaults.
35
+ */
36
+ export function applySupabaseDefaults(options) {
37
+ // Default Supabase columnMapping for users (profiles table uses snake_case)
38
+ const supabaseUserColumnMapping = {
39
+ externalId: 'external_id',
40
+ username: 'username'
41
+ };
42
+ // Build users config with Supabase defaults
43
+ const usersConfig = {
44
+ customFields: {
45
+ // User's customSchema if provided
46
+ ...(options?.users?.customFields?.customSchema && {
47
+ customSchema: options.users.customFields.customSchema
48
+ }),
49
+ // Use user's columnMapping or Supabase default
50
+ columnMapping: options?.users?.customFields?.columnMapping ?? supabaseUserColumnMapping,
51
+ // Use user's customMapper if provided (no default mapper needed for profiles table)
52
+ ...(options?.users?.customFields?.customMapper && {
53
+ customMapper: options.users.customFields.customMapper
54
+ })
55
+ },
56
+ database: {
57
+ schema: options?.users?.database?.schema ?? 'public',
58
+ table: options?.users?.database?.table ?? 'profiles',
59
+ ...(options?.users?.database?.namingStrategy && {
60
+ namingStrategy: options.users.database.namingStrategy
61
+ })
62
+ }
63
+ };
64
+ // Build organizations config with Supabase defaults
65
+ const organizationsConfig = {
66
+ ...(options?.organizations?.customFields && {
67
+ customFields: options.organizations.customFields
68
+ }),
69
+ database: {
70
+ schema: options?.organizations?.database?.schema ?? 'public',
71
+ table: options?.organizations?.database?.table ?? 'organizations',
72
+ ...(options?.organizations?.database?.namingStrategy && {
73
+ namingStrategy: options.organizations.database.namingStrategy
74
+ })
75
+ }
76
+ };
77
+ // Build organization memberships config with Supabase defaults
78
+ const organizationMembershipsConfig = {
79
+ ...(options?.organizationMemberships?.customFields && {
80
+ customFields: options.organizationMemberships.customFields
81
+ }),
82
+ database: {
83
+ schema: options?.organizationMemberships?.database?.schema ?? 'public',
84
+ table: options?.organizationMemberships?.database?.table ?? 'organization_memberships',
85
+ ...(options?.organizationMemberships?.database?.namingStrategy && {
86
+ namingStrategy: options.organizationMemberships.database.namingStrategy
87
+ })
88
+ }
89
+ };
90
+ return {
91
+ namingStrategy: options?.namingStrategy ?? 'snake_case',
92
+ users: usersConfig,
93
+ organizations: organizationsConfig,
94
+ organizationMemberships: organizationMembershipsConfig,
95
+ // Pass through other options as-is
96
+ ...(options?.useCaseHooks && { useCaseHooks: options.useCaseHooks }),
97
+ ...(options?.responseTransformers && { responseTransformers: options.responseTransformers })
98
+ };
99
+ }
18
100
  /**
19
101
  * Create complete Supabase adapters bundle (persistence + system)
20
102
  *
21
103
  * This is the main factory function for Supabase/Deno environments.
22
104
  * It creates all necessary adapters with NO Node.js dependencies.
23
105
  *
106
+ * **Supabase defaults applied automatically:**
107
+ * - `namingStrategy: 'snake_case'`
108
+ * - `users.database: { schema: 'auth', table: 'users' }`
109
+ * - `users.customFields.columnMapping: { externalId: 'id', username: 'email' }`
110
+ * - `organizations.database: { schema: 'public', table: 'organizations' }`
111
+ * - `organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }`
112
+ *
113
+ * Your options take precedence over defaults.
114
+ *
24
115
  * @example
25
116
  * ```typescript
26
117
  * import { createSupabaseAdapters, createUseCases } from '@multitenantkit/sdk-supabase';
27
118
  * import { createClient } from '@supabase/supabase-js';
28
119
  *
29
120
  * const client = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY);
30
- * const adapters = createSupabaseAdapters({ client });
31
- * const useCases = createUseCases(adapters);
121
+ * const { adapters, toolkitOptions } = createSupabaseAdapters({ client });
122
+ * const useCases = createUseCases(adapters, toolkitOptions);
32
123
  * ```
33
124
  */
34
125
  export function createSupabaseAdapters(options) {
35
- const { client, toolkitOptions } = options;
126
+ const { client, toolkitOptions: userOptions } = options;
127
+ // Apply Supabase defaults to toolkit options
128
+ const toolkitOptions = applySupabaseDefaults(userOptions);
36
129
  // Create persistence adapters using Supabase repositories
37
130
  const persistence = createSupabaseRepositories({ client, toolkitOptions });
38
131
  // Create system adapters using Web APIs (Deno compatible)
@@ -40,9 +133,10 @@ export function createSupabaseAdapters(options) {
40
133
  clock: new WebClock(),
41
134
  uuid: new WebCryptoUuid()
42
135
  };
43
- return {
136
+ const adapters = {
44
137
  persistence: persistence,
45
138
  system
46
139
  };
140
+ return { adapters, toolkitOptions };
47
141
  }
48
142
  //# sourceMappingURL=AdapterFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterFactory.js","sourceRoot":"","sources":["../../src/factories/AdapterFactory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAU1E;;;GAGG;AACH,MAAM,QAAQ;IACV,GAAG;QACC,OAAO,IAAI,IAAI,EAAE,CAAC;IACtB,CAAC;CACJ;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CAQlC,OAIC;IAED,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAE3C,0DAA0D;IAC1D,MAAM,WAAW,GAAG,0BAA0B,CAI5C,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAE9B,0DAA0D;IAC1D,MAAM,MAAM,GAAmB;QAC3B,KAAK,EAAE,IAAI,QAAQ,EAAE;QACrB,IAAI,EAAE,IAAI,aAAa,EAAE;KAC5B,CAAC;IAEF,OAAO;QACH,WAAW,EAAE,WAIZ;QACD,MAAM;KACT,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"AdapterFactory.js","sourceRoot":"","sources":["../../src/factories/AdapterFactory.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,18 +6,30 @@
6
6
  * This SDK provides everything you need to run MultiTenantKit in Supabase Edge Functions
7
7
  * without any Node.js dependencies.
8
8
  *
9
+ * **Supabase defaults applied automatically:**
10
+ * - `namingStrategy: 'snake_case'`
11
+ * - `users.database: { schema: 'public', table: 'profiles' }`
12
+ * - `users.customFields.columnMapping: { externalId: 'external_id', username: 'username' }`
13
+ * - `organizations.database: { schema: 'public', table: 'organizations' }`
14
+ * - `organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }`
15
+ *
16
+ * Note: We use `public.profiles` instead of `auth.users` because:
17
+ * - `auth.users` is not accessible via PostgREST (Supabase JS client)
18
+ * - `auth.users` is managed by GoTrue and shouldn't be modified directly
19
+ * - `public.profiles` gives you full control over user profile data
20
+ *
9
21
  * @example
10
22
  * ```typescript
11
23
  * import { createSupabaseAdapters, createUseCases } from '@multitenantkit/sdk-supabase';
12
24
  * import { createClient } from '@supabase/supabase-js';
13
25
  *
14
26
  * const client = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY);
15
- * const adapters = createSupabaseAdapters({ client });
16
- * const useCases = createUseCases(adapters);
27
+ * const { adapters, toolkitOptions } = createSupabaseAdapters({ client });
28
+ * const useCases = createUseCases(adapters, toolkitOptions);
17
29
  * ```
18
30
  */
19
31
  export { createSupabaseClient, createSupabaseConfig, createSupabaseRepositories, type SupabaseClient, type SupabaseConfig, type SupabaseFactoryOptions, type SupabaseRepositoryBundle } from '@multitenantkit/adapter-persistence-supabase';
20
32
  export { WebCryptoUuid } from '@multitenantkit/adapter-system-web-crypto';
21
- export { type CreateSupabaseAdaptersOptions, createSupabaseAdapters } from './factories/AdapterFactory';
33
+ export { applySupabaseDefaults, type CreateSupabaseAdaptersOptions, createSupabaseAdapters, type SupabaseAdaptersResult } from './factories/AdapterFactory';
22
34
  export { createUseCases } from './factories/UseCaseFactory';
23
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAChC,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAG1E,OAAO,EACH,KAAK,6BAA6B,EAClC,sBAAsB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAChC,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAG1E,OAAO,EACH,qBAAqB,EACrB,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,KAAK,sBAAsB,EAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -6,21 +6,33 @@
6
6
  * This SDK provides everything you need to run MultiTenantKit in Supabase Edge Functions
7
7
  * without any Node.js dependencies.
8
8
  *
9
+ * **Supabase defaults applied automatically:**
10
+ * - `namingStrategy: 'snake_case'`
11
+ * - `users.database: { schema: 'public', table: 'profiles' }`
12
+ * - `users.customFields.columnMapping: { externalId: 'external_id', username: 'username' }`
13
+ * - `organizations.database: { schema: 'public', table: 'organizations' }`
14
+ * - `organizationMemberships.database: { schema: 'public', table: 'organization_memberships' }`
15
+ *
16
+ * Note: We use `public.profiles` instead of `auth.users` because:
17
+ * - `auth.users` is not accessible via PostgREST (Supabase JS client)
18
+ * - `auth.users` is managed by GoTrue and shouldn't be modified directly
19
+ * - `public.profiles` gives you full control over user profile data
20
+ *
9
21
  * @example
10
22
  * ```typescript
11
23
  * import { createSupabaseAdapters, createUseCases } from '@multitenantkit/sdk-supabase';
12
24
  * import { createClient } from '@supabase/supabase-js';
13
25
  *
14
26
  * const client = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY);
15
- * const adapters = createSupabaseAdapters({ client });
16
- * const useCases = createUseCases(adapters);
27
+ * const { adapters, toolkitOptions } = createSupabaseAdapters({ client });
28
+ * const useCases = createUseCases(adapters, toolkitOptions);
17
29
  * ```
18
30
  */
19
31
  // Re-export persistence adapter
20
32
  export { createSupabaseClient, createSupabaseConfig, createSupabaseRepositories } from '@multitenantkit/adapter-persistence-supabase';
21
33
  // Re-export system adapter
22
34
  export { WebCryptoUuid } from '@multitenantkit/adapter-system-web-crypto';
23
- // Export factories
24
- export { createSupabaseAdapters } from './factories/AdapterFactory';
35
+ // Export factories and utilities
36
+ export { applySupabaseDefaults, createSupabaseAdapters } from './factories/AdapterFactory';
25
37
  export { createUseCases } from './factories/UseCaseFactory';
26
38
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,gCAAgC;AAChC,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAK7B,MAAM,8CAA8C,CAAC;AAEtD,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE1E,mBAAmB;AACnB,OAAO,EAEH,sBAAsB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,gCAAgC;AAChC,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAK7B,MAAM,8CAA8C,CAAC;AAEtD,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE1E,iCAAiC;AACjC,OAAO,EACH,qBAAqB,EAErB,sBAAsB,EAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multitenantkit/sdk-supabase",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "description": "MultiTenantKit SDK for Supabase Edge Functions (Deno compatible)",
6
6
  "keywords": [
@@ -46,10 +46,10 @@
46
46
  "type-check": "tsc --noEmit"
47
47
  },
48
48
  "dependencies": {
49
- "@multitenantkit/domain": "^0.2.2",
49
+ "@multitenantkit/domain": "^0.2.4",
50
50
  "@multitenantkit/domain-contracts": "^0.2.0",
51
- "@multitenantkit/adapter-persistence-supabase": "^0.2.2",
52
- "@multitenantkit/adapter-system-web-crypto": "^0.2.2",
51
+ "@multitenantkit/adapter-persistence-supabase": "^0.2.4",
52
+ "@multitenantkit/adapter-system-web-crypto": "^0.2.4",
53
53
  "@supabase/supabase-js": "^2.39.0"
54
54
  },
55
55
  "devDependencies": {