@outbuild/supa-store 1.0.4 → 1.0.5

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,7 @@
1
1
  # Supastore
2
2
 
3
- A helper library for including Supabase with auth as signals in your Angular app, it uses @ngrx/signals more examples to come.
3
+ A helper library for including Supabase with auth as signals in your Angular app,
4
+ it uses @ngrx/signals more examples to come.
4
5
 
5
6
  ## Basic usage, provide in main.ts
6
7
 
@@ -19,11 +20,14 @@ provideSupaStore({
19
20
 
20
21
  ## Including Metadata in the user object
21
22
 
22
- In many cases users will have metadata that you want to include in the user object. You can do this by providing the 'metadataTable' option. This will automatically fetch the metadata from the table matching the user the 'id' field and include it in the auth object. in most cases this will be the 'users' table.
23
-
24
- There are also instances where you would want to run a custom rpc function to return a auth object, lets imagine custom logic for user, organisation data etc. you can do this by providing the 'metadataRpc' option.
25
-
26
- This will run immediatelty after the user is authenticated, either table option, or rpc option not both.
23
+ In many cases users will have metadata that you want to include in the user object.
24
+ You can do this by providing the 'metadataTable' option. This will automatically fetch
25
+ the metadata from the table matching the user the 'id' field and include it in the auth
26
+ object. in most cases this will be the 'users' table. There are also instances where
27
+ you would want to run a custom rpc function to return a auth object, lets imagine custom
28
+ logic for user, organisation data etc. you can do this by providing the 'metadataRpc' option.
29
+ This will run immediatelty after the user is authenticated, either table option, or rpc
30
+ option not both.
27
31
 
28
32
  ```typescript
29
33
  import { provideSupaStore } from '@outbuild/supa-store'
@@ -52,8 +56,8 @@ provideSupaStore({
52
56
 
53
57
  ## Observables
54
58
 
55
- Observables will return either null or the value, if the value is null, it means the user is not authenticated.
56
-
59
+ Observables will return either null or the value, if the value is null, it means the
60
+ user is not authenticated.
57
61
 
58
62
  ## Store type
59
63
 
@@ -4,6 +4,7 @@ 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';
7
+ import { WA_WINDOW, WA_SCREEN } from '@ng-web-apis/common';
7
8
  import { createInjectionToken } from 'ngxtension/create-injection-token';
8
9
 
9
10
  const SUPA_STORE_OPTIONS = new InjectionToken('SUPA_STORE_OPTIONS');
@@ -53,6 +54,8 @@ const withPostAuth = () => signalStoreFeature({
53
54
  }));
54
55
 
55
56
  const withSupaStoreCore = () => signalStoreFeature(withDevtools('supaStore'), withState(() => inject(INITIAL_STATE)), withPostAuth(), withProps(({ auth: { user, session, metadata } }) => ({
57
+ _SCREEN: inject(WA_SCREEN),
58
+ _WINDOW: inject(WA_WINDOW),
56
59
  user$: toObservable(user).pipe(filter(res => res !== undefined)),
57
60
  session$: toObservable(session).pipe(filter(res => res !== undefined)),
58
61
  metadata$: toObservable(metadata).pipe(filter(res => res !== undefined))
@@ -64,6 +67,12 @@ const withSupaStoreCore = () => signalStoreFeature(withDevtools('supaStore'), wi
64
67
  _initUser: async () => {
65
68
  const { data: { user }, error } = await store.client().auth.getUser();
66
69
  updateState(store, 'Initialise User', { auth: { ...store.auth(), user } });
70
+ },
71
+ signInWithGoogle: async (options = {}) => {
72
+ const { data: { url }, error } = await store.client().auth.signInWithOAuth({ provider: 'google', ...options });
73
+ const [width, height] = [500, 600];
74
+ const [left, top] = [(store._SCREEN.width / 2) - (width / 2), (store._SCREEN.height / 2) - (height / 2)];
75
+ store._WINDOW.open(url, '_blank', `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no`);
67
76
  }
68
77
  })), withHooks({
69
78
  onInit(store) {
@@ -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 { 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, withProps, withState } from '@ngrx/signals'\r\nimport { toObservable } from '@angular/core/rxjs-interop'\r\nimport { filter } from 'rxjs'\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 withProps(({ auth: { user, session, metadata }}) => ({\r\n user$: toObservable(user).pipe(filter(res => res !== undefined)),\r\n session$: toObservable(session).pipe(filter(res => res !== undefined)),\r\n metadata$: toObservable(metadata).pipe(filter(res => res !== undefined))\r\n })),\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":";;;;;;;;AAGO,MAAM,kBAAkB,GAAG,IAAI,cAAc,CAAmB,oBAAoB,CAAC;;ACErF,MAAM,aAAa,GAAG,IAAI,cAAc,CAAiB,gBAAgB,EAAE;IAChF,OAAO,EAAE,MAAK;AAEZ,QAAA,MAAM,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,EAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC;QACzF,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC;QAE9D,OAAO;YACL,MAAM;AACN,YAAA,IAAI,EAAE;AACJ,gBAAA,OAAO,EAAE,SAAS;AAClB,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;AAChC;SACF;;AAGJ,CAAA,CAAC;;ACbK,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAElD;IACE,KAAK,EAAE,IAAI;CACZ,EAED,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM;IAE/F,SAAS,EAAE,YAAW;AAEpB,QAAA,IAAI,KAAK,IAAI,GAAG,EAAE;AAEhB,YAAA,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC,CAAwB,CAAC;AACpI,YAAA,IAAI,CAAC,OAAO;gBAAE;YAEd,IAAI,KAAK,EAAE;AACT,gBAAA,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBAClG,WAAW,CAAC,KAAK,EAAE,uBAAuB,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAC,CAAC;;iBACpF,IAAI,GAAG,EAAE;AACd,gBAAA,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAC,CAAC;gBACxF,WAAW,CAAC,KAAK,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAC,CAAC;;iBAClF;gBACL,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAC,EAAC,CAAC;;;KAInF;CAEF,CAAC,CAAC,EAEH,SAAS,CAAC;AAER,IAAA,MAAM,CAAC,KAAK,EAAA;;QAGV,KAAK,CAAC,SAAS,EAAE;;AAIpB,CAAA,CAAC,CAEH;;MCzCY,iBAAiB,GAAG,MAAM,kBAAkB,CAEvD,YAAY,CAAC,WAAW,CAAC,EACzB,SAAS,CAAiB,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,EACtD,YAAY,EAAE,EAEd,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAC,MAAM;AACnD,IAAA,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;AAChE,IAAA,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;AACtE,IAAA,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC;CACxE,CAAC,CAAC,EAEH,WAAW,CAAC,KAAK,KAAK;IAEpB,YAAY,EAAE,YAAW;QACvB,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAC,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE;AAC1E,QAAA,WAAW,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAC,CAAC;KAChF;IAED,SAAS,EAAE,YAAW;QACpB,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;AACrE,QAAA,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAC,CAAC;;CAG5E,CAAC,CAAC,EAEH,SAAS,CAAC;AAER,IAAA,MAAM,CAAC,KAAK,EAAA;;QAGV,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAG;AAC5C,YAAA,WAAW,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,EAAC,CAAC;AAC7H,SAAC,CAAC;;QAGF,KAAK,CAAC,YAAY,EAAE;;QAGpB,KAAK,CAAC,SAAS,EAAE;;AAIpB,CAAA,CAAC;;MCjDS,SAAS,GAAG,WAAW,CAClC,iBAAiB,EAAE;;ACGR,MAAA,gBAAgB,GAAG,CAAC,OAAyB,KAA2B,wBAAwB,CAAC;AAC5G,IAAA;AACE,QAAA,OAAO,EAAE,kBAAkB;AAC3B,QAAA,QAAQ,EAAE;AACX,KAAA;IACD;AACD,CAAA;AAGY,MAAA,CAAE,gBAAgB,CAAE,GAAG,oBAAoB,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM;AAC1E,MAAA,CAAE,cAAc,CAAE,GAAK,oBAAoB,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI;;ACjBrF;;AAEE;;ACFF;;AAEG;;;;"}
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, withProps, withState } from '@ngrx/signals'\r\nimport { toObservable } from '@angular/core/rxjs-interop'\r\nimport { filter } from 'rxjs'\r\nimport { SignInWithOAuthCredentials } from '@supabase/supabase-js'\r\nimport { WA_WINDOW, WA_SCREEN } from '@ng-web-apis/common'\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 withProps(({ auth: { user, session, metadata }}) => ({\r\n _SCREEN: inject(WA_SCREEN),\r\n _WINDOW: inject(WA_WINDOW),\r\n user$: toObservable(user).pipe(filter(res => res !== undefined)),\r\n session$: toObservable(session).pipe(filter(res => res !== undefined)),\r\n metadata$: toObservable(metadata).pipe(filter(res => res !== undefined))\r\n })),\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 signInWithGoogle: async (options: Pick<SignInWithOAuthCredentials, 'options'> = {}) => {\r\n const { data: { url }, error } = await store.client().auth.signInWithOAuth({ provider: 'google', ...options })\r\n const [ width, height ] = [500,600]\r\n const [ left, top ] = [(store._SCREEN.width / 2) - (width / 2), (store._SCREEN.height / 2) - (height / 2)]\r\n store._WINDOW.open(url!, '_blank', `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no`)\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,19 +1,22 @@
1
+ import { SignInWithOAuthCredentials } from '@supabase/supabase-js';
1
2
  export declare const withSupaStoreCore: () => import("@ngrx/signals").SignalStoreFeature<import("@ngrx/signals").EmptyFeatureResult, {
2
3
  state: {
3
4
  client: import("@supabase/supabase-js").SupabaseClient;
4
5
  auth: {
5
- session: undefined | null | import("@supabase/auth-js").Session;
6
- user: undefined | null | import("@supabase/auth-js").User;
6
+ session: undefined | null | import("@supabase/supabase-js").AuthSession;
7
+ user: undefined | null | import("@supabase/supabase-js").AuthUser;
7
8
  metadata: undefined | null | unknown;
8
9
  state: {
9
- prev: import("@supabase/auth-js").AuthChangeEvent | null;
10
- curr: import("@supabase/auth-js").AuthChangeEvent | null;
10
+ prev: import("@supabase/supabase-js").AuthChangeEvent | null;
11
+ curr: import("@supabase/supabase-js").AuthChangeEvent | null;
11
12
  };
12
13
  };
13
14
  };
14
15
  props: {
15
- user$: import("rxjs").Observable<import("@supabase/auth-js").User | null>;
16
- session$: import("rxjs").Observable<import("@supabase/auth-js").Session | null>;
16
+ _SCREEN: Screen;
17
+ _WINDOW: Window;
18
+ user$: import("rxjs").Observable<import("@supabase/supabase-js").AuthUser | null>;
19
+ session$: import("rxjs").Observable<import("@supabase/supabase-js").AuthSession | null>;
17
20
  metadata$: import("rxjs").Observable<{} | null>;
18
21
  };
19
22
  methods: {
@@ -21,5 +24,6 @@ export declare const withSupaStoreCore: () => import("@ngrx/signals").SignalStor
21
24
  _postAuth: () => Promise<void>;
22
25
  _initSession: () => Promise<void>;
23
26
  _initUser: () => Promise<void>;
27
+ signInWithGoogle: (options?: Pick<SignInWithOAuthCredentials, "options">) => Promise<void>;
24
28
  };
25
29
  }>;
@@ -13,6 +13,7 @@ export declare const SupaStore: import("@angular/core").Type<{
13
13
  user$: import("rxjs").Observable<import("@supabase/auth-js").User | null>;
14
14
  session$: import("rxjs").Observable<import("@supabase/auth-js").Session | null>;
15
15
  metadata$: import("rxjs").Observable<{} | null>;
16
+ signInWithGoogle: (options?: Pick<import("@supabase/auth-js").SignInWithOAuthCredentials, "options">) => Promise<void>;
16
17
  } & import("@ngrx/signals").StateSource<{
17
18
  client: import("@supabase/supabase-js").SupabaseClient;
18
19
  auth: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outbuild/supa-store",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0",