@outbuild/supa-store 1.0.1 → 1.0.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.
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Supastore
|
|
2
2
|
|
|
3
|
-
A helper library for including Supabase auth as signals in your Angular app.
|
|
3
|
+
A helper library for including Supabase with auth as signals in your Angular app, it uses @ngrx/signals more examples to come.
|
|
4
4
|
|
|
5
5
|
## Basic usage, provide in main.ts
|
|
6
6
|
|
|
@@ -33,7 +33,8 @@ provideSupaStore({
|
|
|
33
33
|
supabaseUrl: environment.supabaseUrl,
|
|
34
34
|
supabaseKey: environment.supabaseKey
|
|
35
35
|
},
|
|
36
|
-
metadataTable: 'users'
|
|
36
|
+
metadataTable: 'users',
|
|
37
|
+
// or
|
|
37
38
|
metadataRpc: 'auth_query'
|
|
38
39
|
})
|
|
39
40
|
```
|
|
@@ -55,7 +56,7 @@ type SupaStoreState = {
|
|
|
55
56
|
auth: {
|
|
56
57
|
session: Session | undefined | null // Supabase Session
|
|
57
58
|
user: User | undefined | null // Supabase User
|
|
58
|
-
metadata: unknown | undefined | null // Your
|
|
59
|
+
metadata: unknown | undefined | null // Your metadata if provided
|
|
59
60
|
state: {
|
|
60
61
|
prev: AuthChangeEvent | null, // Supabase Auth Change Event
|
|
61
62
|
curr: AuthChangeEvent | null, // Supabase Auth Change Event
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { signalStoreFeature, type, withMethods,
|
|
1
|
+
import { signalStoreFeature, type, withMethods, withHooks, withState, signalStore } from '@ngrx/signals';
|
|
2
2
|
import { InjectionToken, inject, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
-
import { withDevtools } from '@angular-architects/ngrx-toolkit';
|
|
3
|
+
import { updateState, withDevtools } from '@angular-architects/ngrx-toolkit';
|
|
4
4
|
import { createClient } from '@supabase/supabase-js';
|
|
5
5
|
import { toObservable } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { firstValueFrom, filter } from 'rxjs';
|
|
@@ -24,47 +24,49 @@ const INITIAL_STATE = new InjectionToken('SupaStoreState', {
|
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
const
|
|
27
|
+
const withPostAuth = () => signalStoreFeature({
|
|
28
28
|
state: type()
|
|
29
29
|
}, withMethods((store, { metadataRpc: rpc, metadataTable: table } = inject(SUPA_STORE_OPTIONS)) => ({
|
|
30
|
-
|
|
30
|
+
_postAuth: async () => {
|
|
31
31
|
if (table || rpc) {
|
|
32
32
|
const session = await firstValueFrom(toObservable(store.auth.session).pipe(filter(res => res !== undefined)));
|
|
33
33
|
if (!session)
|
|
34
34
|
return;
|
|
35
35
|
if (table) {
|
|
36
36
|
const { data } = await store.client().from(table).select('*').eq('id', session?.user?.id).single();
|
|
37
|
-
|
|
37
|
+
updateState(store, 'Load Metadata - Table', { auth: { ...store.auth(), metadata: data } });
|
|
38
38
|
}
|
|
39
39
|
else if (rpc) {
|
|
40
40
|
const { data } = await store.client().rpc(rpc, { input: { user_id: session?.user?.id } });
|
|
41
|
-
|
|
41
|
+
updateState(store, 'Load Metadata - Rpc', { auth: { ...store.auth(), metadata: data } });
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
44
|
-
|
|
44
|
+
updateState(store, 'No Metadata', { auth: { ...store.auth(), metadata: null } });
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
})), withHooks({
|
|
49
49
|
onInit(store) {
|
|
50
50
|
/* Auto Load Additional User Auth Data */
|
|
51
|
-
store.
|
|
51
|
+
store._postAuth();
|
|
52
52
|
}
|
|
53
53
|
}));
|
|
54
54
|
|
|
55
|
-
const withSupaStoreCore = () => signalStoreFeature(withDevtools('supaStore'), withState(() => inject(INITIAL_STATE)),
|
|
55
|
+
const withSupaStoreCore = () => signalStoreFeature(withDevtools('supaStore'), withState(() => inject(INITIAL_STATE)), withPostAuth(), withMethods(store => ({
|
|
56
56
|
_initSession: async () => {
|
|
57
57
|
const { data: { session }, error } = await store.client().auth.getSession();
|
|
58
|
-
|
|
58
|
+
updateState(store, 'Initialise Session', { auth: { ...store.auth(), session } });
|
|
59
59
|
},
|
|
60
60
|
_initUser: async () => {
|
|
61
61
|
const { data: { user }, error } = await store.client().auth.getUser();
|
|
62
|
-
|
|
62
|
+
updateState(store, 'Initialise User', { auth: { ...store.auth(), user } });
|
|
63
63
|
}
|
|
64
64
|
})), withHooks({
|
|
65
65
|
onInit(store) {
|
|
66
66
|
/* Listen For Auth State Changes */
|
|
67
|
-
store.client().auth.onAuthStateChange(state =>
|
|
67
|
+
store.client().auth.onAuthStateChange(state => {
|
|
68
|
+
updateState(store, 'Auth State Change', { auth: { ...store.auth(), state: { prev: store.auth.state.curr(), curr: state } } });
|
|
69
|
+
});
|
|
68
70
|
/* Init Supabase Session */
|
|
69
71
|
store._initSession();
|
|
70
72
|
/* Init Supabase User */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbuild-supa-store.mjs","sources":["../../../projects/ob-supa-store/src/lib/common/token/supabase-credentials.token.ts","../../../projects/ob-supa-store/src/lib/common/token/initial-state.token.ts","../../../projects/ob-supa-store/src/lib/common/features/post-auth-loader.feature.ts","../../../projects/ob-supa-store/src/lib/common/features/supa-store-core.feature.ts","../../../projects/ob-supa-store/src/lib/supa-store.store.ts","../../../projects/ob-supa-store/src/lib/supa-store.provider.ts","../../../projects/ob-supa-store/src/public-api.ts","../../../projects/ob-supa-store/src/outbuild-supa-store.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\"\r\nimport { SupaStoreOptions } from \"../type/supa-store.types\"\r\n\r\nexport const SUPA_STORE_OPTIONS = new InjectionToken<SupaStoreOptions>('SUPA_STORE_OPTIONS')\r\n","import { inject, InjectionToken } from \"@angular/core\"\r\nimport { SUPA_STORE_OPTIONS } from \"./supabase-credentials.token\"\r\nimport { createClient } from \"@supabase/supabase-js\"\r\nimport { SupaStoreState } from \"../type/supa-store.types\"\r\n\r\nexport const INITIAL_STATE = new InjectionToken<SupaStoreState>('SupaStoreState', {\r\n factory: () => {\r\n\r\n const { createClient: { supabaseUrl, supabaseKey, options }} = inject(SUPA_STORE_OPTIONS)\r\n const client = createClient(supabaseUrl, supabaseKey, options)\r\n\r\n return {\r\n client,\r\n auth: {\r\n session: undefined,\r\n user: undefined,\r\n metadata: undefined,\r\n state: { prev: null, curr: null }\r\n }\r\n }\r\n\r\n }\r\n})\r\n","import { inject } from '@angular/core'\r\nimport { Session } from '@supabase/supabase-js'\r\nimport { toObservable } from \"@angular/core/rxjs-interop\"\r\nimport { SupaStoreState } from '../type/supa-store.types'\r\nimport { SUPA_STORE_OPTIONS } from '../token/supabase-credentials.token'\r\nimport { filter, firstValueFrom, Observable } from 'rxjs'\r\nimport {
|
|
1
|
+
{"version":3,"file":"outbuild-supa-store.mjs","sources":["../../../projects/ob-supa-store/src/lib/common/token/supabase-credentials.token.ts","../../../projects/ob-supa-store/src/lib/common/token/initial-state.token.ts","../../../projects/ob-supa-store/src/lib/common/features/post-auth-loader.feature.ts","../../../projects/ob-supa-store/src/lib/common/features/supa-store-core.feature.ts","../../../projects/ob-supa-store/src/lib/supa-store.store.ts","../../../projects/ob-supa-store/src/lib/supa-store.provider.ts","../../../projects/ob-supa-store/src/public-api.ts","../../../projects/ob-supa-store/src/outbuild-supa-store.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\"\r\nimport { SupaStoreOptions } from \"../type/supa-store.types\"\r\n\r\nexport const SUPA_STORE_OPTIONS = new InjectionToken<SupaStoreOptions>('SUPA_STORE_OPTIONS')\r\n","import { inject, InjectionToken } from \"@angular/core\"\r\nimport { SUPA_STORE_OPTIONS } from \"./supabase-credentials.token\"\r\nimport { createClient } from \"@supabase/supabase-js\"\r\nimport { SupaStoreState } from \"../type/supa-store.types\"\r\n\r\nexport const INITIAL_STATE = new InjectionToken<SupaStoreState>('SupaStoreState', {\r\n factory: () => {\r\n\r\n const { createClient: { supabaseUrl, supabaseKey, options }} = inject(SUPA_STORE_OPTIONS)\r\n const client = createClient(supabaseUrl, supabaseKey, options)\r\n\r\n return {\r\n client,\r\n auth: {\r\n session: undefined,\r\n user: undefined,\r\n metadata: undefined,\r\n state: { prev: null, curr: null }\r\n }\r\n }\r\n\r\n }\r\n})\r\n","import { inject } from '@angular/core'\r\nimport { Session } from '@supabase/supabase-js'\r\nimport { toObservable } from \"@angular/core/rxjs-interop\"\r\nimport { SupaStoreState } from '../type/supa-store.types'\r\nimport { SUPA_STORE_OPTIONS } from '../token/supabase-credentials.token'\r\nimport { filter, firstValueFrom, Observable } from 'rxjs'\r\nimport { signalStoreFeature, type, withHooks, withMethods } from '@ngrx/signals'\r\nimport { updateState } from '@angular-architects/ngrx-toolkit'\r\n\r\nexport const withPostAuth = () => signalStoreFeature(\r\n\r\n {\r\n state: type<SupaStoreState>()\r\n },\r\n\r\n withMethods((store, { metadataRpc: rpc, metadataTable: table } = inject(SUPA_STORE_OPTIONS)) => ({\r\n\r\n _postAuth: async () => {\r\n\r\n if (table || rpc) {\r\n\r\n const session = await firstValueFrom(toObservable(store.auth.session).pipe(filter(res => res !== undefined)) as Observable<Session>)\r\n if (!session) return\r\n\r\n if (table) {\r\n const { data } = await store.client().from(table).select('*').eq('id', session?.user?.id).single()\r\n updateState(store, 'Load Metadata - Table', { auth: { ...store.auth(), metadata: data }})\r\n } else if (rpc) {\r\n const { data } = await store.client().rpc(rpc, { input: { user_id: session?.user?.id }})\r\n updateState(store, 'Load Metadata - Rpc', { auth: { ...store.auth(), metadata: data }})\r\n } else {\r\n updateState(store, 'No Metadata', { auth: { ...store.auth(), metadata: null}})\r\n }\r\n\r\n }\r\n },\r\n\r\n })),\r\n\r\n withHooks({\r\n\r\n onInit(store) {\r\n\r\n /* Auto Load Additional User Auth Data */\r\n store._postAuth()\r\n\r\n }\r\n\r\n })\r\n\r\n)\r\n","import { inject } from '@angular/core';\r\nimport { updateState, withDevtools } from '@angular-architects/ngrx-toolkit'\r\nimport { INITIAL_STATE } from '../token/initial-state.token'\r\nimport { SupaStoreState } from '../type/supa-store.types'\r\nimport { withPostAuth } from '../features/post-auth-loader.feature'\r\nimport { signalStoreFeature, withHooks, withMethods, withState } from '@ngrx/signals'\r\n\r\nexport const withSupaStoreCore = () => signalStoreFeature(\r\n\r\n withDevtools('supaStore'),\r\n withState<SupaStoreState>(() => inject(INITIAL_STATE)),\r\n withPostAuth(),\r\n\r\n withMethods(store => ({\r\n\r\n _initSession: async () => {\r\n const { data: { session }, error} = await store.client().auth.getSession()\r\n updateState(store, 'Initialise Session', { auth: { ...store.auth(), session }})\r\n },\r\n\r\n _initUser: async () => {\r\n const { data: { user }, error } = await store.client().auth.getUser()\r\n updateState(store, 'Initialise User', { auth: { ...store.auth(), user }})\r\n }\r\n\r\n })),\r\n\r\n withHooks({\r\n\r\n onInit(store) {\r\n\r\n /* Listen For Auth State Changes */\r\n store.client().auth.onAuthStateChange(state => {\r\n updateState(store, 'Auth State Change', { auth: { ...store.auth(), state: { prev: store.auth.state.curr(), curr: state }}})\r\n })\r\n\r\n /* Init Supabase Session */\r\n store._initSession()\r\n\r\n /* Init Supabase User */\r\n store._initUser()\r\n\r\n }\r\n\r\n })\r\n\r\n)\r\n","import { signalStore } from '@ngrx/signals'\r\nimport { withSupaStoreCore } from './common/features/supa-store-core.feature'\r\n\r\nexport const SupaStore = signalStore(\r\n withSupaStoreCore()\r\n)\r\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from \"@angular/core\"\r\nimport { SupaStore } from \"./supa-store.store\"\r\nimport { SUPA_STORE_OPTIONS } from \"./common/token/supabase-credentials.token\"\r\nimport { SupaStoreOptions } from \"./common/type/supa-store.types\"\r\nimport { createInjectionToken } from 'ngxtension/create-injection-token'\r\n\r\n\r\nexport const provideSupaStore = (options: SupaStoreOptions): EnvironmentProviders => makeEnvironmentProviders([\r\n {\r\n provide: SUPA_STORE_OPTIONS,\r\n useValue: options\r\n },\r\n SupaStore\r\n])\r\n\r\n\r\nexport const [ injectSupaClient ] = createInjectionToken(() => inject(SupaStore).client)\r\nexport const [ injectSupaAuth ] = createInjectionToken(() => inject(SupaStore).auth)\r\n","/*\r\n * Public API Surface of ob-supa-store\r\n*/\r\n\r\nexport * from './lib/supa-store.store'\r\nexport * from './lib/supa-store.provider'\r\nexport * from './lib/common/features/supa-store-core.feature'\r\nexport * from './lib/common/type/supa-store.types'\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SupaStoreState } from '../type/supa-store.types';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const withPostAuth: () => import("@ngrx/signals").SignalStoreFeature<{
|
|
3
3
|
state: SupaStoreState;
|
|
4
4
|
props: {};
|
|
5
5
|
methods: {};
|
|
@@ -7,6 +7,6 @@ export declare const withPostAuthOptions: () => import("@ngrx/signals").SignalSt
|
|
|
7
7
|
state: {};
|
|
8
8
|
props: {};
|
|
9
9
|
methods: {
|
|
10
|
-
|
|
10
|
+
_postAuth: () => Promise<void>;
|
|
11
11
|
};
|
|
12
12
|
}>;
|
|
@@ -14,7 +14,7 @@ export declare const withSupaStoreCore: () => import("@ngrx/signals").SignalStor
|
|
|
14
14
|
props: {};
|
|
15
15
|
methods: {
|
|
16
16
|
[x: string]: (newName?: unknown) => unknown;
|
|
17
|
-
|
|
17
|
+
_postAuth: () => Promise<void>;
|
|
18
18
|
_initSession: () => Promise<void>;
|
|
19
19
|
_initUser: () => Promise<void>;
|
|
20
20
|
};
|
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outbuild/supa-store",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^19.2.0",
|
|
6
6
|
"@angular/core": "^19.2.0",
|
|
7
|
-
"@ngrx/signals": "^19.0.1",
|
|
8
7
|
"@supabase/supabase-js": "^2.49.1",
|
|
9
|
-
"@
|
|
10
|
-
"
|
|
11
|
-
"
|
|
8
|
+
"@ngrx/signals": "^19.0.1",
|
|
9
|
+
"ngxtension": "^4.3.2",
|
|
10
|
+
"@angular-architects/ngrx-toolkit": "^19.1.0"
|
|
12
11
|
},
|
|
13
12
|
"dependencies": {
|
|
14
13
|
"tslib": "^2.8.1"
|