@outbuild/supa-store 0.0.11 → 0.0.12

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.
@@ -0,0 +1,18 @@
1
+ import { inject, InjectionToken } from "@angular/core";
2
+ import { SUPA_STORE_OPTIONS } from "./supabase-credentials.token";
3
+ import { createClient } from "@supabase/supabase-js";
4
+ export const INITIAL_STATE = new InjectionToken('SupaStoreState', {
5
+ factory: () => {
6
+ const { supabaseUrl, supabaseKey } = inject(SUPA_STORE_OPTIONS);
7
+ return {
8
+ client: createClient(supabaseUrl, supabaseKey),
9
+ auth: {
10
+ session: undefined,
11
+ user: undefined,
12
+ userMetadata: undefined,
13
+ state: { prev: null, curr: null }
14
+ }
15
+ };
16
+ },
17
+ });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbC1zdGF0ZS50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29iLXN1cGEtc3RvcmUvc3JjL2xpYi9jb21tb24vdG9rZW4vaW5pdGlhbC1zdGF0ZS50b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFHcEQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFpQixnQkFBZ0IsRUFBRTtJQUNoRixPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ1osTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUMvRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO1lBQzlDLElBQUksRUFBRTtnQkFDSixPQUFPLEVBQUUsU0FBUztnQkFDbEIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTthQUNsQztTQUNGLENBQUE7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcclxuaW1wb3J0IHsgU1VQQV9TVE9SRV9PUFRJT05TIH0gZnJvbSBcIi4vc3VwYWJhc2UtY3JlZGVudGlhbHMudG9rZW5cIlxyXG5pbXBvcnQgeyBjcmVhdGVDbGllbnQgfSBmcm9tIFwiQHN1cGFiYXNlL3N1cGFiYXNlLWpzXCJcclxuaW1wb3J0IHsgU3VwYVN0b3JlU3RhdGUgfSBmcm9tIFwiLi4vdHlwZS9zdXBhLXN0b3JlLnR5cGVzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBJTklUSUFMX1NUQVRFID0gbmV3IEluamVjdGlvblRva2VuPFN1cGFTdG9yZVN0YXRlPignU3VwYVN0b3JlU3RhdGUnLCB7XHJcbiAgZmFjdG9yeTogKCkgPT4ge1xyXG4gICAgY29uc3QgeyBzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXkgfSA9IGluamVjdChTVVBBX1NUT1JFX09QVElPTlMpXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnQ6IGNyZWF0ZUNsaWVudChzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXkpLFxyXG4gICAgICBhdXRoOiB7XHJcbiAgICAgICAgc2Vzc2lvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVzZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICB1c2VyTWV0YWRhdGE6IHVuZGVmaW5lZCxcclxuICAgICAgICBzdGF0ZTogeyBwcmV2OiBudWxsLCBjdXJyOiBudWxsIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcbn0pXHJcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ export const SUPA_STORE_OPTIONS = new InjectionToken('SUPA_STORE_OPTIONS');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYWJhc2UtY3JlZGVudGlhbHMudG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYi1zdXBhLXN0b3JlL3NyYy9saWIvY29tbW9uL3Rva2VuL3N1cGFiYXNlLWNyZWRlbnRpYWxzLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHOUMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQWlCLG9CQUFvQixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcclxuaW1wb3J0IHsgU3VwYVN0b3JlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZS9zdXBhLXN0b3JlLnR5cGVzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBTVVBBX1NUT1JFX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48U3VwYVN0b3JlSW5wdXQ+KCdTVVBBX1NUT1JFX09QVElPTlMnKVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYS1zdG9yZS1zdGF0ZS50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2Itc3VwYS1zdG9yZS9zcmMvbGliL2NvbW1vbi90eXBlL3N1cGEtc3RvcmUtc3RhdGUudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aENoYW5nZUV2ZW50LCBTZXNzaW9uLCBTdXBhYmFzZUNsaWVudCwgVXNlciB9IGZyb20gXCJAc3VwYWJhc2Uvc3VwYWJhc2UtanNcIlxyXG5cclxuZXhwb3J0IHR5cGUgU3VwYVN0b3JlU3RhdGUgPSB7XHJcbiAgY2xpZW50OiBTdXBhYmFzZUNsaWVudFxyXG4gIGF1dGg6IHtcclxuICAgIHNlc3Npb246IFNlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsXHJcbiAgICB1c2VyOiBVc2VyIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4gICAgc3RhdGU6IHtcclxuICAgICAgcHJldjogQXV0aENoYW5nZUV2ZW50IHwgbnVsbCxcclxuICAgICAgY3VycjogQXV0aENoYW5nZUV2ZW50IHwgbnVsbCxcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYS1zdG9yZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29iLXN1cGEtc3RvcmUvc3JjL2xpYi9jb21tb24vdHlwZS9zdXBhLXN0b3JlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoQ2hhbmdlRXZlbnQsIFNlc3Npb24sIFN1cGFiYXNlQ2xpZW50LCBVc2VyIH0gZnJvbSBcIkBzdXBhYmFzZS9zdXBhYmFzZS1qc1wiXHJcblxyXG5leHBvcnQgdHlwZSBTdXBhU3RvcmVTdGF0ZSA9IHtcclxuICBjbGllbnQ6IFN1cGFiYXNlQ2xpZW50XHJcbiAgYXV0aDoge1xyXG4gICAgc2Vzc2lvbjogU2Vzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGxcclxuICAgIHVzZXI6IFVzZXIgfCB1bmRlZmluZWQgfCBudWxsXHJcbiAgICB1c2VyTWV0YWRhdGE6IHVua25vd24gfCB1bmRlZmluZWQgfCBudWxsXHJcbiAgICBzdGF0ZToge1xyXG4gICAgICBwcmV2OiBBdXRoQ2hhbmdlRXZlbnQgfCBudWxsLFxyXG4gICAgICBjdXJyOiBBdXRoQ2hhbmdlRXZlbnQgfCBudWxsLFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgU3VwYVN0b3JlSW5wdXQgPSB7XHJcbiAgc3VwYWJhc2VVcmw6IHN0cmluZyxcclxuICBzdXBhYmFzZUtleTogc3RyaW5nLFxyXG4gIG9wdGlvbnM6IFN1cGFTdG9yZU9wdGlvbnNcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgU3VwYVN0b3JlT3B0aW9ucyA9IHtcclxuICB1c2VyTWV0YWRhdGE/OiB7XHJcbiAgICBsb2FkPzogYm9vbGVhbixcclxuICAgIHRhYmxlPzogc3RyaW5nLFxyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { makeEnvironmentProviders } from "@angular/core";
2
+ import { SupaStore } from "./supa-store.store";
3
+ import { SUPA_STORE_OPTIONS } from "./common/token/supabase-credentials.token";
4
+ import { merge } from "lodash-es";
5
+ const defaultOptions = {
6
+ userMetadata: {
7
+ load: false,
8
+ table: 'users',
9
+ }
10
+ };
11
+ export const provideSupaStore = (supabaseUrl, supabaseKey, opts = {}) => {
12
+ const options = merge(defaultOptions, opts);
13
+ return makeEnvironmentProviders([
14
+ {
15
+ provide: SUPA_STORE_OPTIONS,
16
+ useValue: { supabaseUrl, supabaseKey, options }
17
+ },
18
+ SupaStore
19
+ ]);
20
+ };
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYS1zdG9yZS5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29iLXN1cGEtc3RvcmUvc3JjL2xpYi9zdXBhLXN0b3JlLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0Isd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFBO0FBRTlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFakMsTUFBTSxjQUFjLEdBQXFCO0lBQ3ZDLFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxLQUFLO1FBQ1gsS0FBSyxFQUFFLE9BQU87S0FDZjtDQUNGLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFdBQW1CLEVBQUUsV0FBbUIsRUFBRSxPQUF5QixFQUFFLEVBQXdCLEVBQUU7SUFFOUgsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUUzQyxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLGtCQUFrQjtZQUMzQixRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRTtTQUNoRDtRQUNELFNBQVM7S0FDVixDQUFDLENBQUE7QUFDSixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxyXG5pbXBvcnQgeyBTdXBhU3RvcmUgfSBmcm9tIFwiLi9zdXBhLXN0b3JlLnN0b3JlXCJcclxuaW1wb3J0IHsgU1VQQV9TVE9SRV9PUFRJT05TIH0gZnJvbSBcIi4vY29tbW9uL3Rva2VuL3N1cGFiYXNlLWNyZWRlbnRpYWxzLnRva2VuXCJcclxuaW1wb3J0IHsgU3VwYVN0b3JlT3B0aW9ucyB9IGZyb20gXCIuL2NvbW1vbi90eXBlL3N1cGEtc3RvcmUudHlwZXNcIlxyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIlxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFN1cGFTdG9yZU9wdGlvbnMgPSB7XHJcbiAgdXNlck1ldGFkYXRhOiB7XHJcbiAgICBsb2FkOiBmYWxzZSxcclxuICAgIHRhYmxlOiAndXNlcnMnLFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHByb3ZpZGVTdXBhU3RvcmUgPSAoc3VwYWJhc2VVcmw6IHN0cmluZywgc3VwYWJhc2VLZXk6IHN0cmluZywgb3B0czogU3VwYVN0b3JlT3B0aW9ucyA9IHt9KTogRW52aXJvbm1lbnRQcm92aWRlcnMgPT4ge1xyXG5cclxuICBjb25zdCBvcHRpb25zID0gbWVyZ2UoZGVmYXVsdE9wdGlvbnMsIG9wdHMpXHJcblxyXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBTVVBBX1NUT1JFX09QVElPTlMsXHJcbiAgICAgIHVzZVZhbHVlOiB7IHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwgb3B0aW9ucyB9XHJcbiAgICB9LFxyXG4gICAgU3VwYVN0b3JlXHJcbiAgXSlcclxufVxyXG4iXX0=
@@ -0,0 +1,36 @@
1
+ import { inject } from '@angular/core';
2
+ import { withDevtools } from '@angular-architects/ngrx-toolkit';
3
+ import { INITIAL_STATE } from './common/token/initial-state.token';
4
+ import { patchState, signalStore, signalStoreFeature, withHooks, withMethods, withState } from '@ngrx/signals';
5
+ import { SUPA_STORE_OPTIONS } from './common/token/supabase-credentials.token';
6
+ import { filter, firstValueFrom } from 'rxjs';
7
+ import { toObservable } from "@angular/core/rxjs-interop";
8
+ export const withSupaStore = () => signalStoreFeature(withDevtools('supaStore'), withState(() => inject(INITIAL_STATE)), withMethods((store, options = inject(SUPA_STORE_OPTIONS).options) => ({
9
+ initSession: async () => {
10
+ const { data: { session } } = await store.client().auth.getSession();
11
+ patchState(store, { auth: { ...store.auth(), session } });
12
+ },
13
+ initUser: async () => {
14
+ const { data: { user } } = await store.client().auth.getUser();
15
+ patchState(store, { auth: { ...store.auth(), user } });
16
+ },
17
+ setMetadata: async (id) => {
18
+ const { data: userMetadata } = await store.client().from(options?.userMetadata?.table).select('*').eq('id', id).single();
19
+ patchState(store, { auth: { ...store.auth(), userMetadata } });
20
+ }
21
+ })), withHooks({
22
+ async onInit(store, options = inject(SUPA_STORE_OPTIONS).options) {
23
+ store.initSession();
24
+ store.initUser();
25
+ store.client().auth.onAuthStateChange(state => patchState(store, { auth: { ...store.auth(), state: { prev: store.auth.state.curr(), curr: state } } }));
26
+ if (options?.userMetadata?.load) {
27
+ const session = await firstValueFrom(toObservable(store.auth.session).pipe(filter(res => res !== undefined)));
28
+ session?.user ? store.setMetadata(session?.user?.id) : patchState(store, { auth: { ...store.auth(), userMetadata: null } });
29
+ }
30
+ else {
31
+ patchState(store, { auth: { ...store.auth(), userMetadata: null } });
32
+ }
33
+ }
34
+ }));
35
+ export const SupaStore = signalStore(withSupaStore());
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYS1zdG9yZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29iLXN1cGEtc3RvcmUvc3JjL2xpYi9zdXBhLXN0b3JlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUVsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM5RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFekQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUVuRCxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQ3pCLFNBQVMsQ0FBaUIsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBRXRELFdBQVcsQ0FBQyxDQUFFLEtBQUssRUFBRSxPQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXJFLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDbkUsVUFBVSxDQUFDLEtB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bmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB3aXRoRGV2dG9vbHMgfSBmcm9tICdAYW5ndWxhci1hcmNoaXRlY3RzL25ncngtdG9vbGtpdCdcclxuaW1wb3J0IHsgSU5JVElBTF9TVEFURSB9IGZyb20gJy4vY29tbW9uL3Rva2VuL2luaXRpYWwtc3RhdGUudG9rZW4nXHJcbmltcG9ydCB7IFN1cGFTdG9yZVN0YXRlIH0gZnJvbSAnLi9jb21tb24vdHlwZS9zdXBhLXN0b3JlLnR5cGVzJ1xyXG5pbXBvcnQgeyBwYXRjaFN0YXRlLCBzaWduYWxTdG9yZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoSG9va3MsIHdpdGhNZXRob2RzLCB3aXRoU3RhdGUgfSBmcm9tICdAbmdyeC9zaWduYWxzJ1xyXG5pbXBvcnQgeyBTVVBBX1NUT1JFX09QVElPTlMgfSBmcm9tICcuL2NvbW1vbi90b2tlbi9zdXBhYmFzZS1jcmVkZW50aWFscy50b2tlbidcclxuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcFwiXHJcblxyXG5leHBvcnQgY29uc3Qgd2l0aFN1cGFTdG9yZSA9ICgpID0+IHNpZ25hbFN0b3JlRmVhdHVyZShcclxuXHJcbiAgd2l0aERldnRvb2xzKCdzdXBhU3RvcmUnKSxcclxuICB3aXRoU3RhdGU8U3VwYVN0b3JlU3RhdGU+KCgpID0+IGluamVjdChJTklUSUFMX1NUQVRFKSksXHJcblxyXG4gIHdpdGhNZXRob2RzKCggc3RvcmUsIG9wdGlvbnMgPSBpbmplY3QoU1VQQV9TVE9SRV9PUFRJT05TKS5vcHRpb25zKSA9PiAoe1xyXG5cclxuICAgIGluaXRTZXNzaW9uOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH19ID0gYXdhaXQgc3RvcmUuY2xpZW50KCkuYXV0aC5nZXRTZXNzaW9uKClcclxuICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBhdXRoOiB7IC4uLnN0b3JlLmF1dGgoKSwgc2Vzc2lvbiB9fSlcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdFVzZXI6IGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgeyBkYXRhOiB7IHVzZXIgfX0gPSBhd2FpdCBzdG9yZS5jbGllbnQoKS5hdXRoLmdldFVzZXIoKVxyXG4gICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IGF1dGg6IHsgLi4uc3RvcmUuYXV0aCgpLCB1c2VyIH19KVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRNZXRhZGF0YTogYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgeyBkYXRhOiB1c2VyTWV0YWRhdGEgfSA9IGF3YWl0IHN0b3JlLmNsaWVudCgpLmZyb20ob3B0aW9ucz8udXNlck1ldGFkYXRhPy50YWJsZSBhcyBzdHJpbmcpLnNlbGVjdCgnKicpLmVxKCdpZCcsIGlkKS5zaW5nbGUoKVxyXG4gICAgICBwYXRjaFN0YXRlKHN0b3JlLCAgeyBhdXRoOiB7IC4uLnN0b3JlLmF1dGgoKSwgdXNlck1ldGFkYXRhIH19KVxyXG4gICAgfVxyXG5cclxuICB9KSksXHJcblxyXG4gIHdpdGhIb29rcyh7XHJcbiAgICBhc3luYyBvbkluaXQoc3RvcmUsIG9wdGlvbnMgPSBpbmplY3QoU1VQQV9TVE9SRV9PUFRJT05TKS5vcHRpb25zKSB7XHJcblxyXG4gICAgICBzdG9yZS5pbml0U2Vzc2lvbigpXHJcbiAgICAgIHN0b3JlLmluaXRVc2VyKClcclxuICAgICAgc3RvcmUuY2xpZW50KCkuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZShzdGF0ZSA9PiBwYXRjaFN0YXRlKHN0b3JlLCB7IGF1dGg6IHsgLi4uc3RvcmUuYXV0aCgpLCBzdGF0ZTogeyBwcmV2OiBzdG9yZS5hdXRoLnN0YXRlLmN1cnIoKSwgY3Vycjogc3RhdGUgfSB9fSkpXHJcblxyXG4gICAgICBpZiAob3B0aW9ucz8udXNlck1ldGFkYXRhPy5sb2FkKSB7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRvT2JzZXJ2YWJsZShzdG9yZS5hdXRoLnNlc3Npb24pLnBpcGUoZmlsdGVyKHJlcyA9PiByZXMgIT09IHVuZGVmaW5lZCkpKVxyXG4gICAgICAgIHNlc3Npb24/LnVzZXIgPyBzdG9yZS5zZXRNZXRhZGF0YShzZXNzaW9uPy51c2VyPy5pZCkgOiBwYXRjaFN0YXRlKHN0b3JlLCAgeyBhdXRoOiB7IC4uLnN0b3JlLmF1dGgoKSwgdXNlck1ldGFkYXRhOiBudWxsfX0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgIHsgYXV0aDogeyAuLi5zdG9yZS5hdXRoKCksIHVzZXJNZXRhZGF0YTogbnVsbH19KVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4pXHJcblxyXG5leHBvcnQgY29uc3QgU3VwYVN0b3JlID0gc2lnbmFsU3RvcmUoXHJcbiAgd2l0aFN1cGFTdG9yZSgpXHJcbilcclxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0YnVpbGQtc3VwYS1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL29iLXN1cGEtc3RvcmUvc3JjL291dGJ1aWxkLXN1cGEtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Public API Surface of ob-supa-store
3
+ */
4
+ export * from './lib/supa-store.store';
5
+ export * from './lib/supa-store.provider';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL29iLXN1cGEtc3RvcmUvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdCQUF3QixDQUFBO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygb2Itc3VwYS1zdG9yZVxyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3N1cGEtc3RvcmUuc3RvcmUnXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3N1cGEtc3RvcmUucHJvdmlkZXInXHJcbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import { InjectionToken, inject, makeEnvironmentProviders } from '@angular/core';
2
+ import { withDevtools } from '@angular-architects/ngrx-toolkit';
3
+ import { createClient } from '@supabase/supabase-js';
4
+ import { signalStoreFeature, withState, withMethods, patchState, withHooks, signalStore } from '@ngrx/signals';
5
+ import { firstValueFrom, filter } from 'rxjs';
6
+ import { toObservable } from '@angular/core/rxjs-interop';
7
+ import { merge } from 'lodash-es';
8
+
9
+ const SUPA_STORE_OPTIONS = new InjectionToken('SUPA_STORE_OPTIONS');
10
+
11
+ const INITIAL_STATE = new InjectionToken('SupaStoreState', {
12
+ factory: () => {
13
+ const { supabaseUrl, supabaseKey } = inject(SUPA_STORE_OPTIONS);
14
+ return {
15
+ client: createClient(supabaseUrl, supabaseKey),
16
+ auth: {
17
+ session: undefined,
18
+ user: undefined,
19
+ userMetadata: undefined,
20
+ state: { prev: null, curr: null }
21
+ }
22
+ };
23
+ },
24
+ });
25
+
26
+ const withSupaStore = () => signalStoreFeature(withDevtools('supaStore'), withState(() => inject(INITIAL_STATE)), withMethods((store, options = inject(SUPA_STORE_OPTIONS).options) => ({
27
+ initSession: async () => {
28
+ const { data: { session } } = await store.client().auth.getSession();
29
+ patchState(store, { auth: { ...store.auth(), session } });
30
+ },
31
+ initUser: async () => {
32
+ const { data: { user } } = await store.client().auth.getUser();
33
+ patchState(store, { auth: { ...store.auth(), user } });
34
+ },
35
+ setMetadata: async (id) => {
36
+ const { data: userMetadata } = await store.client().from(options?.userMetadata?.table).select('*').eq('id', id).single();
37
+ patchState(store, { auth: { ...store.auth(), userMetadata } });
38
+ }
39
+ })), withHooks({
40
+ async onInit(store, options = inject(SUPA_STORE_OPTIONS).options) {
41
+ store.initSession();
42
+ store.initUser();
43
+ store.client().auth.onAuthStateChange(state => patchState(store, { auth: { ...store.auth(), state: { prev: store.auth.state.curr(), curr: state } } }));
44
+ if (options?.userMetadata?.load) {
45
+ const session = await firstValueFrom(toObservable(store.auth.session).pipe(filter(res => res !== undefined)));
46
+ session?.user ? store.setMetadata(session?.user?.id) : patchState(store, { auth: { ...store.auth(), userMetadata: null } });
47
+ }
48
+ else {
49
+ patchState(store, { auth: { ...store.auth(), userMetadata: null } });
50
+ }
51
+ }
52
+ }));
53
+ const SupaStore = signalStore(withSupaStore());
54
+
55
+ const defaultOptions = {
56
+ userMetadata: {
57
+ load: false,
58
+ table: 'users',
59
+ }
60
+ };
61
+ const provideSupaStore = (supabaseUrl, supabaseKey, opts = {}) => {
62
+ const options = merge(defaultOptions, opts);
63
+ return makeEnvironmentProviders([
64
+ {
65
+ provide: SUPA_STORE_OPTIONS,
66
+ useValue: { supabaseUrl, supabaseKey, options }
67
+ },
68
+ SupaStore
69
+ ]);
70
+ };
71
+
72
+ /*
73
+ * Public API Surface of ob-supa-store
74
+ */
75
+
76
+ /**
77
+ * Generated bundle index. Do not edit.
78
+ */
79
+
80
+ export { SupaStore, provideSupaStore, withSupaStore };
81
+ //# sourceMappingURL=outbuild-supa-store.mjs.map
@@ -0,0 +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/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 { SupaStoreInput } from \"../type/supa-store.types\"\r\n\r\nexport const SUPA_STORE_OPTIONS = new InjectionToken<SupaStoreInput>('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 const { supabaseUrl, supabaseKey } = inject(SUPA_STORE_OPTIONS)\r\n return {\r\n client: createClient(supabaseUrl, supabaseKey),\r\n auth: {\r\n session: undefined,\r\n user: undefined,\r\n userMetadata: undefined,\r\n state: { prev: null, curr: null }\r\n }\r\n }\r\n },\r\n})\r\n","import { inject } from '@angular/core';\r\nimport { withDevtools } from '@angular-architects/ngrx-toolkit'\r\nimport { INITIAL_STATE } from './common/token/initial-state.token'\r\nimport { SupaStoreState } from './common/type/supa-store.types'\r\nimport { patchState, signalStore, signalStoreFeature, withHooks, withMethods, withState } from '@ngrx/signals'\r\nimport { SUPA_STORE_OPTIONS } from './common/token/supabase-credentials.token'\r\nimport { filter, firstValueFrom } from 'rxjs'\r\nimport { toObservable } from \"@angular/core/rxjs-interop\"\r\n\r\nexport const withSupaStore = () => signalStoreFeature(\r\n\r\n withDevtools('supaStore'),\r\n withState<SupaStoreState>(() => inject(INITIAL_STATE)),\r\n\r\n withMethods(( store, options = inject(SUPA_STORE_OPTIONS).options) => ({\r\n\r\n initSession: async () => {\r\n const { data: { session }} = await store.client().auth.getSession()\r\n patchState(store, { auth: { ...store.auth(), session }})\r\n },\r\n\r\n initUser: async () => {\r\n const { data: { user }} = await store.client().auth.getUser()\r\n patchState(store, { auth: { ...store.auth(), user }})\r\n },\r\n\r\n setMetadata: async (id: string) => {\r\n const { data: userMetadata } = await store.client().from(options?.userMetadata?.table as string).select('*').eq('id', id).single()\r\n patchState(store, { auth: { ...store.auth(), userMetadata }})\r\n }\r\n\r\n })),\r\n\r\n withHooks({\r\n async onInit(store, options = inject(SUPA_STORE_OPTIONS).options) {\r\n\r\n store.initSession()\r\n store.initUser()\r\n store.client().auth.onAuthStateChange(state => patchState(store, { auth: { ...store.auth(), state: { prev: store.auth.state.curr(), curr: state } }}))\r\n\r\n if (options?.userMetadata?.load) {\r\n const session = await firstValueFrom(toObservable(store.auth.session).pipe(filter(res => res !== undefined)))\r\n session?.user ? store.setMetadata(session?.user?.id) : patchState(store, { auth: { ...store.auth(), userMetadata: null}})\r\n } else {\r\n patchState(store, { auth: { ...store.auth(), userMetadata: null}})\r\n }\r\n\r\n }\r\n })\r\n\r\n)\r\n\r\nexport const SupaStore = signalStore(\r\n withSupaStore()\r\n)\r\n","import { EnvironmentProviders, 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 { merge } from \"lodash-es\"\r\n\r\nconst defaultOptions: SupaStoreOptions = {\r\n userMetadata: {\r\n load: false,\r\n table: 'users',\r\n }\r\n}\r\n\r\nexport const provideSupaStore = (supabaseUrl: string, supabaseKey: string, opts: SupaStoreOptions = {}): EnvironmentProviders => {\r\n\r\n const options = merge(defaultOptions, opts)\r\n\r\n return makeEnvironmentProviders([\r\n {\r\n provide: SUPA_STORE_OPTIONS,\r\n useValue: { supabaseUrl, supabaseKey, options }\r\n },\r\n SupaStore\r\n ])\r\n}\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\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAGO,MAAM,kBAAkB,GAAG,IAAI,cAAc,CAAiB,oBAAoB,CAAC;;ACEnF,MAAM,aAAa,GAAG,IAAI,cAAc,CAAiB,gBAAgB,EAAE;IAChF,OAAO,EAAE,MAAK;QACZ,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAC/D,OAAO;AACL,YAAA,MAAM,EAAE,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC;AAC9C,YAAA,IAAI,EAAE;AACJ,gBAAA,OAAO,EAAE,SAAS;AAClB,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,YAAY,EAAE,SAAS;gBACvB,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAClC,aAAA;SACF,CAAA;KACF;AACF,CAAA,CAAC;;ACTW,MAAA,aAAa,GAAG,MAAM,kBAAkB,CAEnD,YAAY,CAAC,WAAW,CAAC,EACzB,SAAS,CAAiB,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,EAEtD,WAAW,CAAC,CAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,MAAM;IAErE,WAAW,EAAE,YAAW;AACtB,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAC,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;AACnE,QAAA,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAC,CAAC,CAAA;KACzD;IAED,QAAQ,EAAE,YAAW;AACnB,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAC,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;AAC7D,QAAA,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAC,CAAC,CAAA;KACtD;AAED,IAAA,WAAW,EAAE,OAAO,EAAU,KAAI;AAChC,QAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,KAAe,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;AAClI,QAAA,UAAU,CAAC,KAAK,EAAG,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,EAAC,CAAC,CAAA;KAC/D;CAEF,CAAC,CAAC,EAEH,SAAS,CAAC;AACR,IAAA,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAA;QAE9D,KAAK,CAAC,WAAW,EAAE,CAAA;QACnB,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChB,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,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,EAAE,EAAC,CAAC,CAAC,CAAA;AAEtJ,QAAA,IAAI,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE;AAC/B,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,CAAC,CAAC,CAAA;AAC7G,YAAA,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAG,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAC,EAAC,CAAC,CAAA;SAC3H;aAAM;AACL,YAAA,UAAU,CAAC,KAAK,EAAG,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAC,EAAC,CAAC,CAAA;SACpE;KAEF;AACF,CAAA,CAAC,EAEH;MAEY,SAAS,GAAG,WAAW,CAClC,aAAa,EAAE;;AC/CjB,MAAM,cAAc,GAAqB;AACvC,IAAA,YAAY,EAAE;AACZ,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,OAAO;AACf,KAAA;CACF,CAAA;AAEM,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAE,WAAmB,EAAE,IAAA,GAAyB,EAAE,KAA0B;IAE9H,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AAE3C,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,kBAAkB;AAC3B,YAAA,QAAQ,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE;AAChD,SAAA;QACD,SAAS;AACV,KAAA,CAAC,CAAA;AACJ;;ACxBA;;AAEG;;ACFH;;AAEG;;;;"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@outbuild/supa-store" />
5
+ export * from './public-api';
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ import { SupaStoreState } from "../type/supa-store.types";
3
+ export declare const INITIAL_STATE: InjectionToken<SupaStoreState>;
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ import { SupaStoreInput } from "../type/supa-store.types";
3
+ export declare const SUPA_STORE_OPTIONS: InjectionToken<SupaStoreInput>;
@@ -0,0 +1,12 @@
1
+ import { AuthChangeEvent, Session, SupabaseClient, User } from "@supabase/supabase-js";
2
+ export type SupaStoreState = {
3
+ client: SupabaseClient;
4
+ auth: {
5
+ session: Session | undefined | null;
6
+ user: User | undefined | null;
7
+ state: {
8
+ prev: AuthChangeEvent | null;
9
+ curr: AuthChangeEvent | null;
10
+ };
11
+ };
12
+ };
@@ -0,0 +1,24 @@
1
+ import { AuthChangeEvent, Session, SupabaseClient, User } from "@supabase/supabase-js";
2
+ export type SupaStoreState = {
3
+ client: SupabaseClient;
4
+ auth: {
5
+ session: Session | undefined | null;
6
+ user: User | undefined | null;
7
+ userMetadata: unknown | undefined | null;
8
+ state: {
9
+ prev: AuthChangeEvent | null;
10
+ curr: AuthChangeEvent | null;
11
+ };
12
+ };
13
+ };
14
+ export type SupaStoreInput = {
15
+ supabaseUrl: string;
16
+ supabaseKey: string;
17
+ options: SupaStoreOptions;
18
+ };
19
+ export type SupaStoreOptions = {
20
+ userMetadata?: {
21
+ load?: boolean;
22
+ table?: string;
23
+ };
24
+ };
@@ -0,0 +1,3 @@
1
+ import { EnvironmentProviders } from "@angular/core";
2
+ import { SupaStoreOptions } from "./common/type/supa-store.types";
3
+ export declare const provideSupaStore: (supabaseUrl: string, supabaseKey: string, opts?: SupaStoreOptions) => EnvironmentProviders;
@@ -0,0 +1,46 @@
1
+ export declare const withSupaStore: () => import("@ngrx/signals").SignalStoreFeature<import("@ngrx/signals").EmptyFeatureResult, {
2
+ state: {
3
+ client: import("@supabase/supabase-js").SupabaseClient;
4
+ auth: {
5
+ session: import("@supabase/auth-js").Session | undefined | null;
6
+ user: import("@supabase/auth-js").User | undefined | null;
7
+ userMetadata: unknown | undefined | null;
8
+ state: {
9
+ prev: import("@supabase/auth-js").AuthChangeEvent | null;
10
+ curr: import("@supabase/auth-js").AuthChangeEvent | null;
11
+ };
12
+ };
13
+ };
14
+ computed: {};
15
+ methods: {
16
+ initSession: () => Promise<void>;
17
+ initUser: () => Promise<void>;
18
+ setMetadata: (id: string) => Promise<void>;
19
+ };
20
+ }>;
21
+ export declare const SupaStore: import("@angular/core").Type<{
22
+ client: import("@ngrx/signals").DeepSignal<import("@supabase/supabase-js").SupabaseClient<any, "public", any>>;
23
+ auth: import("@ngrx/signals").DeepSignal<{
24
+ session: import("@supabase/auth-js").Session | undefined | null;
25
+ user: import("@supabase/auth-js").User | undefined | null;
26
+ userMetadata: unknown | undefined | null;
27
+ state: {
28
+ prev: import("@supabase/auth-js").AuthChangeEvent | null;
29
+ curr: import("@supabase/auth-js").AuthChangeEvent | null;
30
+ };
31
+ }>;
32
+ initSession: () => Promise<void>;
33
+ initUser: () => Promise<void>;
34
+ setMetadata: (id: string) => Promise<void>;
35
+ } & import("@ngrx/signals").StateSource<{
36
+ client: import("@supabase/supabase-js").SupabaseClient;
37
+ auth: {
38
+ session: import("@supabase/auth-js").Session | undefined | null;
39
+ user: import("@supabase/auth-js").User | undefined | null;
40
+ userMetadata: unknown | undefined | null;
41
+ state: {
42
+ prev: import("@supabase/auth-js").AuthChangeEvent | null;
43
+ curr: import("@supabase/auth-js").AuthChangeEvent | null;
44
+ };
45
+ };
46
+ }>>;
package/package.json CHANGED
@@ -1,19 +1,32 @@
1
- {
2
- "name": "@outbuild/supa-store",
3
- "version": "0.0.11",
4
- "peerDependencies": {
5
- "@angular/common": "^18.2.0",
6
- "@angular/core": "^18.2.0",
7
- "@ngrx/signals": "^18.0.2",
8
- "@supabase/supabase-js": "^2.45.3",
9
- "@angular-architects/ngrx-toolkit": "18.0.3",
10
- "lodash-es": "^4.17.21"
11
- },
12
- "dependencies": {
13
- "tslib": "^2.3.0"
14
- },
15
- "resolutions": {
16
- "@supabase/auth-js": "2.61.0"
17
- },
18
- "sideEffects": false
19
- }
1
+ {
2
+ "name": "@outbuild/supa-store",
3
+ "version": "0.0.12",
4
+ "peerDependencies": {
5
+ "@angular/common": "^18.2.0",
6
+ "@angular/core": "^18.2.0",
7
+ "@ngrx/signals": "^18.0.2",
8
+ "@supabase/supabase-js": "^2.45.3",
9
+ "@angular-architects/ngrx-toolkit": "18.0.3",
10
+ "lodash-es": "^4.17.21"
11
+ },
12
+ "dependencies": {
13
+ "tslib": "^2.3.0"
14
+ },
15
+ "resolutions": {
16
+ "@supabase/auth-js": "2.61.0"
17
+ },
18
+ "sideEffects": false,
19
+ "module": "fesm2022/outbuild-supa-store.mjs",
20
+ "typings": "index.d.ts",
21
+ "exports": {
22
+ "./package.json": {
23
+ "default": "./package.json"
24
+ },
25
+ ".": {
26
+ "types": "./index.d.ts",
27
+ "esm2022": "./esm2022/outbuild-supa-store.mjs",
28
+ "esm": "./esm2022/outbuild-supa-store.mjs",
29
+ "default": "./fesm2022/outbuild-supa-store.mjs"
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,2 @@
1
+ export * from './lib/supa-store.store';
2
+ export * from './lib/supa-store.provider';
package/ng-package.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
- "dest": "../../dist/ob-supa-store",
4
- "lib": {
5
- "entryFile": "src/public-api.ts"
6
- }
7
- }
@@ -1,19 +0,0 @@
1
- import { inject, InjectionToken } from "@angular/core"
2
- import { SUPA_STORE_OPTIONS } from "./supabase-credentials.token"
3
- import { createClient } from "@supabase/supabase-js"
4
- import { SupaStoreState } from "../type/supa-store.types"
5
-
6
- export const INITIAL_STATE = new InjectionToken<SupaStoreState>('SupaStoreState', {
7
- factory: () => {
8
- const { supabaseUrl, supabaseKey } = inject(SUPA_STORE_OPTIONS)
9
- return {
10
- client: createClient(supabaseUrl, supabaseKey),
11
- auth: {
12
- session: undefined,
13
- user: undefined,
14
- userMetadata: undefined,
15
- state: { prev: null, curr: null }
16
- }
17
- }
18
- },
19
- })
@@ -1,4 +0,0 @@
1
- import { InjectionToken } from "@angular/core"
2
- import { SupaStoreInput } from "../type/supa-store.types"
3
-
4
- export const SUPA_STORE_OPTIONS = new InjectionToken<SupaStoreInput>('SUPA_STORE_OPTIONS')
@@ -1,27 +0,0 @@
1
- import { AuthChangeEvent, Session, SupabaseClient, User } from "@supabase/supabase-js"
2
-
3
- export type SupaStoreState = {
4
- client: SupabaseClient
5
- auth: {
6
- session: Session | undefined | null
7
- user: User | undefined | null
8
- userMetadata: unknown | undefined | null
9
- state: {
10
- prev: AuthChangeEvent | null,
11
- curr: AuthChangeEvent | null,
12
- }
13
- }
14
- }
15
-
16
- export type SupaStoreInput = {
17
- supabaseUrl: string,
18
- supabaseKey: string,
19
- options: SupaStoreOptions
20
- }
21
-
22
- export type SupaStoreOptions = {
23
- userMetadata?: {
24
- load?: boolean,
25
- table?: string,
26
- }
27
- }
@@ -1,25 +0,0 @@
1
- import { EnvironmentProviders, makeEnvironmentProviders } from "@angular/core"
2
- import { SupaStore } from "./supa-store.store"
3
- import { SUPA_STORE_OPTIONS } from "./common/token/supabase-credentials.token"
4
- import { SupaStoreOptions } from "./common/type/supa-store.types"
5
- import { merge } from "lodash-es"
6
-
7
- const defaultOptions: SupaStoreOptions = {
8
- userMetadata: {
9
- load: false,
10
- table: 'users',
11
- }
12
- }
13
-
14
- export const provideSupaStore = (supabaseUrl: string, supabaseKey: string, opts: SupaStoreOptions = {}): EnvironmentProviders => {
15
-
16
- const options = merge(defaultOptions, opts)
17
-
18
- return makeEnvironmentProviders([
19
- {
20
- provide: SUPA_STORE_OPTIONS,
21
- useValue: { supabaseUrl, supabaseKey, options }
22
- },
23
- SupaStore
24
- ])
25
- }
@@ -1,55 +0,0 @@
1
- import { inject } from '@angular/core';
2
- import { withDevtools } from '@angular-architects/ngrx-toolkit'
3
- import { INITIAL_STATE } from './common/token/initial-state.token'
4
- import { SupaStoreState } from './common/type/supa-store.types'
5
- import { patchState, signalStore, signalStoreFeature, withHooks, withMethods, withState } from '@ngrx/signals'
6
- import { SUPA_STORE_OPTIONS } from './common/token/supabase-credentials.token'
7
- import { filter, firstValueFrom } from 'rxjs'
8
- import { toObservable } from "@angular/core/rxjs-interop"
9
-
10
- export const withSupaStore = () => signalStoreFeature(
11
-
12
- withDevtools('supaStore'),
13
- withState<SupaStoreState>(() => inject(INITIAL_STATE)),
14
-
15
- withMethods(( store, options = inject(SUPA_STORE_OPTIONS).options) => ({
16
-
17
- initSession: async () => {
18
- const { data: { session }} = await store.client().auth.getSession()
19
- patchState(store, { auth: { ...store.auth(), session }})
20
- },
21
-
22
- initUser: async () => {
23
- const { data: { user }} = await store.client().auth.getUser()
24
- patchState(store, { auth: { ...store.auth(), user }})
25
- },
26
-
27
- setMetadata: async (id: string) => {
28
- const { data: userMetadata } = await store.client().from(options?.userMetadata?.table as string).select('*').eq('id', id).single()
29
- patchState(store, { auth: { ...store.auth(), userMetadata }})
30
- }
31
-
32
- })),
33
-
34
- withHooks({
35
- async onInit(store, options = inject(SUPA_STORE_OPTIONS).options) {
36
-
37
- store.initSession()
38
- store.initUser()
39
- store.client().auth.onAuthStateChange(state => patchState(store, { auth: { ...store.auth(), state: { prev: store.auth.state.curr(), curr: state } }}))
40
-
41
- if (options?.userMetadata?.load) {
42
- const session = await firstValueFrom(toObservable(store.auth.session).pipe(filter(res => res !== undefined)))
43
- session?.user ? store.setMetadata(session?.user?.id) : patchState(store, { auth: { ...store.auth(), userMetadata: null}})
44
- } else {
45
- patchState(store, { auth: { ...store.auth(), userMetadata: null}})
46
- }
47
-
48
- }
49
- })
50
-
51
- )
52
-
53
- export const SupaStore = signalStore(
54
- withSupaStore()
55
- )
package/src/public-api.ts DELETED
@@ -1,6 +0,0 @@
1
- /*
2
- * Public API Surface of ob-supa-store
3
- */
4
-
5
- export * from './lib/supa-store.store'
6
- export * from './lib/supa-store.provider'
package/tsconfig.lib.json DELETED
@@ -1,15 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
- {
4
- "extends": "../../tsconfig.json",
5
- "compilerOptions": {
6
- "outDir": "../../out-tsc/lib",
7
- "declaration": true,
8
- "declarationMap": true,
9
- "inlineSources": true,
10
- "types": []
11
- },
12
- "exclude": [
13
- "**/*.spec.ts"
14
- ]
15
- }
@@ -1,11 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
- {
4
- "extends": "./tsconfig.lib.json",
5
- "compilerOptions": {
6
- "declarationMap": false
7
- },
8
- "angularCompilerOptions": {
9
- "compilationMode": "partial"
10
- }
11
- }
@@ -1,15 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
- {
4
- "extends": "../../tsconfig.json",
5
- "compilerOptions": {
6
- "outDir": "../../out-tsc/spec",
7
- "types": [
8
- "jasmine"
9
- ]
10
- },
11
- "include": [
12
- "**/*.spec.ts",
13
- "**/*.d.ts"
14
- ]
15
- }