@flexnative/authentication 0.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 +10 -0
- package/dist/context.d.ts +35 -0
- package/dist/context.js +47 -0
- package/dist/context.js.map +1 -0
- package/dist/hooks.d.ts +33 -0
- package/dist/hooks.js +89 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/props.d.ts +64 -0
- package/dist/props.js +12 -0
- package/dist/props.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# 🔐 Authentication
|
2
|
+
|
3
|
+
A package to implement almost full authentication and protect routes with Expo Router.
|
4
|
+
FlexNative Authentication is part of the FlexNative and is available under the `@flexnative/authentication` NPM package.
|
5
|
+
|
6
|
+
## Dependencies
|
7
|
+
- [`expo-secure-store`](https://docs.expo.dev/versions/latest/sdk/securestore/)
|
8
|
+
|
9
|
+
|
10
|
+
For more details on how to start and how to use read the [documentation](https://redonalla.github.io/flexnative/docs/theme).x
|
@@ -0,0 +1,35 @@
|
|
1
|
+
/**
|
2
|
+
* @ Author: Redon Alla
|
3
|
+
* @ Create Time: 2025-01-10 22:28:54
|
4
|
+
* @ Modified by: Redon Alla
|
5
|
+
* @ Modified time: 2025-02-13 22:02:56
|
6
|
+
* @ Description: AuthContext is a React context that provides authentication-related data and methods to its consumers. It allows components within the application to access and manage authentication state, such as the current user, login status.
|
7
|
+
*/
|
8
|
+
import React from 'react';
|
9
|
+
import { AuthContextProps } from './props';
|
10
|
+
/**
|
11
|
+
* React context for authentication.
|
12
|
+
*
|
13
|
+
* This context provides authentication state and functions to manage authentication.
|
14
|
+
* It is initialized with `undefined` to allow for proper type checking and to ensure
|
15
|
+
* that the context is provided by a parent component.
|
16
|
+
*
|
17
|
+
* @type {React.Context<AuthContextProps<any, any>>}
|
18
|
+
*/
|
19
|
+
declare const AuthContext: React.Context<AuthContextProps<any, any>>;
|
20
|
+
/**
|
21
|
+
* Default export of the AuthContext.
|
22
|
+
*
|
23
|
+
* This context provides authentication state and functions to manage authentication.
|
24
|
+
* It should be used with a corresponding provider to supply the context value.
|
25
|
+
*
|
26
|
+
* @type {React.Context<AuthContextProps<any, any>>}
|
27
|
+
*/
|
28
|
+
export default AuthContext;
|
29
|
+
/**
|
30
|
+
* This hook provides a convenient way to access the `AuthContext` within your components.
|
31
|
+
* It uses React's `useContext` hook to retrieve the current context value.
|
32
|
+
*
|
33
|
+
* @returns {AuthContextProps<TLoginRequest, TRegisterForm>} The current value of the `AuthContext`.
|
34
|
+
*/
|
35
|
+
export declare function useAuthContext<TLoginRequest, TRegisterForm>(): AuthContextProps<TLoginRequest, TRegisterForm>;
|
package/dist/context.js
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
/**
|
2
|
+
* @ Author: Redon Alla
|
3
|
+
* @ Create Time: 2025-01-10 22:28:54
|
4
|
+
* @ Modified by: Redon Alla
|
5
|
+
* @ Modified time: 2025-02-13 22:02:56
|
6
|
+
* @ Description: AuthContext is a React context that provides authentication-related data and methods to its consumers. It allows components within the application to access and manage authentication state, such as the current user, login status.
|
7
|
+
*/
|
8
|
+
import React from 'react';
|
9
|
+
/**
|
10
|
+
* React context for authentication.
|
11
|
+
*
|
12
|
+
* This context provides authentication state and functions to manage authentication.
|
13
|
+
* It is initialized with `undefined` to allow for proper type checking and to ensure
|
14
|
+
* that the context is provided by a parent component.
|
15
|
+
*
|
16
|
+
* @type {React.Context<AuthContextProps<any, any>>}
|
17
|
+
*/
|
18
|
+
const AuthContext = React.createContext({
|
19
|
+
state: {
|
20
|
+
authenticated: false
|
21
|
+
},
|
22
|
+
onLogin: async (loginForm) => { console.log('loginForm: ', loginForm); },
|
23
|
+
onAuthentication: async () => { }
|
24
|
+
});
|
25
|
+
/**
|
26
|
+
* Default export of the AuthContext.
|
27
|
+
*
|
28
|
+
* This context provides authentication state and functions to manage authentication.
|
29
|
+
* It should be used with a corresponding provider to supply the context value.
|
30
|
+
*
|
31
|
+
* @type {React.Context<AuthContextProps<any, any>>}
|
32
|
+
*/
|
33
|
+
export default AuthContext;
|
34
|
+
/**
|
35
|
+
* This hook provides a convenient way to access the `AuthContext` within your components.
|
36
|
+
* It uses React's `useContext` hook to retrieve the current context value.
|
37
|
+
*
|
38
|
+
* @returns {AuthContextProps<TLoginRequest, TRegisterForm>} The current value of the `AuthContext`.
|
39
|
+
*/
|
40
|
+
export function useAuthContext() {
|
41
|
+
const value = React.useContext(AuthContext);
|
42
|
+
if (!value) {
|
43
|
+
throw new Error('useSession must be wrapped in a <AuthProvider />');
|
44
|
+
}
|
45
|
+
return value;
|
46
|
+
}
|
47
|
+
//# sourceMappingURL=context.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;;;;GAQG;AACH,MAAM,WAAW,GACf,KAAK,CAAC,aAAa,CAA6B;IAC9C,KAAK,EAAE;QACL,aAAa,EAAE,KAAK;KACrB;IACD,OAAO,EAAE,KAAK,EAAE,SAAc,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA,CAAA,CAAC;IAC3E,gBAAgB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;CACjC,CAAC,CAAC;AAEL;;;;;;;GAOG;AACH,eAAe,WAAW,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/hooks.d.ts
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
/**
|
2
|
+
* @ Author: Redon Alla
|
3
|
+
* @ Create Time: 2025-02-10 23:37:59
|
4
|
+
* @ Modified by: Redon Alla
|
5
|
+
* @ Modified time: 2025-02-13 23:28:34
|
6
|
+
* @ Description: The following code snippet is a basic hook that persists tokens securely on native with `expo-secure-store` and in local storage on web.
|
7
|
+
*/
|
8
|
+
/**
|
9
|
+
* Type definition for the useState hook.
|
10
|
+
* @template T - The type of the state value.
|
11
|
+
*/
|
12
|
+
type UseStateHook<T> = [[boolean, T | null], (value: T | null) => void];
|
13
|
+
/**
|
14
|
+
* Asynchronously sets an item in storage.
|
15
|
+
* @param { string } key - The key of the item to set.
|
16
|
+
* @param { string | null } value - The value of the item to set. If null, the item is removed.
|
17
|
+
* @returns { Promise<void> } - A promise that resolves when the operation is complete.
|
18
|
+
*/
|
19
|
+
export declare function setStorageItemAsync(key: string, value: string | null): Promise<void>;
|
20
|
+
/**
|
21
|
+
* Asynchronously retrieves an item from storage.
|
22
|
+
*
|
23
|
+
* @param {string} key - The key of the item to retrieve.
|
24
|
+
* @returns {string | null} - The value of the item, or null if the item does not exist.
|
25
|
+
*/
|
26
|
+
export declare function getStorageItemAsync(key: string): string | null;
|
27
|
+
/**
|
28
|
+
* Custom hook to manage authentication state.
|
29
|
+
* @param { string } key - The key of the authentication state item.
|
30
|
+
* @returns { UseStateHook<string> } - The authentication state and the state updater function.
|
31
|
+
*/
|
32
|
+
export declare function useAuthState(key: string): UseStateHook<string>;
|
33
|
+
export {};
|
package/dist/hooks.js
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
/**
|
2
|
+
* @ Author: Redon Alla
|
3
|
+
* @ Create Time: 2025-02-10 23:37:59
|
4
|
+
* @ Modified by: Redon Alla
|
5
|
+
* @ Modified time: 2025-02-13 23:28:34
|
6
|
+
* @ Description: The following code snippet is a basic hook that persists tokens securely on native with `expo-secure-store` and in local storage on web.
|
7
|
+
*/
|
8
|
+
import { useEffect, useCallback, useReducer } from 'react';
|
9
|
+
import { Platform } from 'react-native';
|
10
|
+
import * as SecureStore from 'expo-secure-store';
|
11
|
+
const isWeb = Platform.OS === 'web';
|
12
|
+
/**
|
13
|
+
* Custom hook to manage asynchronous state.
|
14
|
+
* @template T - The type of the state value.
|
15
|
+
* @param { [boolean, T | null] } [initialValue=[true, null]] - The initial state value.
|
16
|
+
* @returns { UseStateHook<T> } - The state and the state updater function.
|
17
|
+
*/
|
18
|
+
function useAsyncState(initialValue = [true, null]) {
|
19
|
+
return useReducer((_state, action = null) => [false, action], initialValue);
|
20
|
+
}
|
21
|
+
/**
|
22
|
+
* Asynchronously sets an item in storage.
|
23
|
+
* @param { string } key - The key of the item to set.
|
24
|
+
* @param { string | null } value - The value of the item to set. If null, the item is removed.
|
25
|
+
* @returns { Promise<void> } - A promise that resolves when the operation is complete.
|
26
|
+
*/
|
27
|
+
export async function setStorageItemAsync(key, value) {
|
28
|
+
if (isWeb) {
|
29
|
+
try {
|
30
|
+
if (value === null) {
|
31
|
+
localStorage.removeItem(key);
|
32
|
+
}
|
33
|
+
else {
|
34
|
+
localStorage.setItem(key, value);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
catch (e) {
|
38
|
+
console.error('Local storage is unavailable:', e);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
else {
|
42
|
+
if (value == null) {
|
43
|
+
await SecureStore.deleteItemAsync(key);
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
await SecureStore.setItemAsync(key, value);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
50
|
+
/**
|
51
|
+
* Asynchronously retrieves an item from storage.
|
52
|
+
*
|
53
|
+
* @param {string} key - The key of the item to retrieve.
|
54
|
+
* @returns {string | null} - The value of the item, or null if the item does not exist.
|
55
|
+
*/
|
56
|
+
export function getStorageItemAsync(key) {
|
57
|
+
return isWeb ? localStorage.getItem(key) : SecureStore.getItem(key);
|
58
|
+
}
|
59
|
+
/**
|
60
|
+
* Custom hook to manage authentication state.
|
61
|
+
* @param { string } key - The key of the authentication state item.
|
62
|
+
* @returns { UseStateHook<string> } - The authentication state and the state updater function.
|
63
|
+
*/
|
64
|
+
export function useAuthState(key) {
|
65
|
+
const [state, setState] = useAsyncState([true, getStorageItemAsync(key)]);
|
66
|
+
useEffect(() => {
|
67
|
+
if (isWeb) {
|
68
|
+
try {
|
69
|
+
if (typeof localStorage !== 'undefined') {
|
70
|
+
setState(localStorage.getItem(key));
|
71
|
+
}
|
72
|
+
}
|
73
|
+
catch (e) {
|
74
|
+
console.error('Local storage is unavailable:', e);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
else {
|
78
|
+
SecureStore.getItemAsync(key).then(value => {
|
79
|
+
setState(value);
|
80
|
+
});
|
81
|
+
}
|
82
|
+
}, [key]);
|
83
|
+
const setValue = useCallback((value) => {
|
84
|
+
setState(value);
|
85
|
+
setStorageItemAsync(key, value);
|
86
|
+
}, [key]);
|
87
|
+
return [state, setValue];
|
88
|
+
}
|
89
|
+
//# sourceMappingURL=hooks.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AASjD,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC;AAEpC;;;;;GAKG;AACH,SAAS,aAAa,CACpB,eAAoC,CAAC,IAAI,EAAE,IAAI,CAAC;IAEhD,OAAO,UAAU,CACf,CAAC,MAA2B,EAAE,SAAmB,IAAI,EAAuB,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAC9F,YAAY,CACM,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,KAAoB;IACzE,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAElF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;oBACxC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACzC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAoB,EAAE,EAAE;QACvB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/props.d.ts
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
/**
|
2
|
+
* @ Author: Redon Alla
|
3
|
+
* @ Create Time: 2025-02-13 21:21:15
|
4
|
+
* @ Modified by: Redon Alla
|
5
|
+
* @ Modified time: 2025-02-13 21:42:14
|
6
|
+
* @ Description: The provided TypeScript code defines several type aliases that outline the structure and expected properties for an authentication context in a React application.
|
7
|
+
*/
|
8
|
+
/**
|
9
|
+
* This is a generic type alias used to define the properties expected in an authentication context.
|
10
|
+
*
|
11
|
+
* It accepts a generic type parameter `TLoginRequest`,
|
12
|
+
* which allows the `onLogin` method to be defined with a specific login request type.
|
13
|
+
*/
|
14
|
+
export type AuthContextProps<TLoginRequest, TRegisterForm> = {
|
15
|
+
/**
|
16
|
+
* It accepts a generic type parameter `TLoginRequest`,
|
17
|
+
* which allows the `onLogin` method to be defined with a specific login request type.
|
18
|
+
*/
|
19
|
+
state: AuthStateProps;
|
20
|
+
/**
|
21
|
+
* An optional function that handles user registration.
|
22
|
+
* It takes a `registerForm` parameter of type `TRegisterForm` and returns a `Promise<void>`.
|
23
|
+
*
|
24
|
+
* @param registerForm of type `TRegisterForm`
|
25
|
+
* @returns `Promise<void>`
|
26
|
+
*/
|
27
|
+
onRegister?: (registerForm: TRegisterForm) => Promise<void>;
|
28
|
+
/**
|
29
|
+
* An optional function for handling user logout, returning a `Promise<void>`.
|
30
|
+
*
|
31
|
+
* @returns `Promise<void>`
|
32
|
+
*/
|
33
|
+
onLogout?: () => Promise<void>;
|
34
|
+
/**
|
35
|
+
* A required function that handles user login.
|
36
|
+
* It takes a `loginForm` parameter of type `TLoginRequest` (specified by the consumer of this type), and it returns a `Promise<void>`.
|
37
|
+
*
|
38
|
+
* @param loginForm of type `TLoginRequest`
|
39
|
+
* @returns `Promise<void>`
|
40
|
+
*/
|
41
|
+
onLogin: (loginForm: TLoginRequest) => Promise<void>;
|
42
|
+
/**
|
43
|
+
* A required function that triggers authentication logic, returning a `Promise<void>`.
|
44
|
+
*
|
45
|
+
* @returns `Promise<void>`
|
46
|
+
*/
|
47
|
+
onAuthentication: () => Promise<void>;
|
48
|
+
};
|
49
|
+
/**
|
50
|
+
* Defines the structure of the state object related to authentication.
|
51
|
+
*/
|
52
|
+
export type AuthStateProps = {
|
53
|
+
/**
|
54
|
+
* An optional string that may store session information or identifiers.
|
55
|
+
*/
|
56
|
+
session?: string;
|
57
|
+
/**
|
58
|
+
* A boolean indicating whether the user is currently authenticated.
|
59
|
+
*/
|
60
|
+
authenticated: boolean;
|
61
|
+
};
|
62
|
+
/**
|
63
|
+
* These type definitions help ensure that the components interacting with authentication logic within the application have well-defined interfaces, improving type safety and readability across the codebase.
|
64
|
+
*/
|
package/dist/props.js
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
/**
|
2
|
+
* @ Author: Redon Alla
|
3
|
+
* @ Create Time: 2025-02-13 21:21:15
|
4
|
+
* @ Modified by: Redon Alla
|
5
|
+
* @ Modified time: 2025-02-13 21:42:14
|
6
|
+
* @ Description: The provided TypeScript code defines several type aliases that outline the structure and expected properties for an authentication context in a React application.
|
7
|
+
*/
|
8
|
+
export {};
|
9
|
+
/**
|
10
|
+
* These type definitions help ensure that the components interacting with authentication logic within the application have well-defined interfaces, improving type safety and readability across the codebase.
|
11
|
+
*/
|
12
|
+
//# sourceMappingURL=props.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"props.js","sourceRoot":"","sources":["../src/props.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;AAgEH;;GAEG"}
|
package/package.json
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
{
|
2
|
+
"name": "@flexnative/authentication",
|
3
|
+
"version": "0.0.3",
|
4
|
+
"description": "A package to implement almost full authentication and protect routes with Expo Router.",
|
5
|
+
"main": "dist/index.js",
|
6
|
+
"types": "dist/index.d.ts",
|
7
|
+
"module": "dist/index.js",
|
8
|
+
"exports": {
|
9
|
+
"./hooks": "./dist/hooks.js",
|
10
|
+
"./context": "./dist/context.js",
|
11
|
+
"./context/props": "./dist/props.js"
|
12
|
+
},
|
13
|
+
"files": [
|
14
|
+
"dist/**/*"
|
15
|
+
],
|
16
|
+
"scripts": {
|
17
|
+
"build": "tsc",
|
18
|
+
"prepare": "npm run build",
|
19
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
20
|
+
},
|
21
|
+
"repository": {
|
22
|
+
"type": "git",
|
23
|
+
"url": "git+https://github.com/RedonAlla/flexnative.git",
|
24
|
+
"directory": "npm-packages/src/packages/authentication"
|
25
|
+
},
|
26
|
+
"keywords": [
|
27
|
+
"expo-router",
|
28
|
+
"authentication",
|
29
|
+
"protected",
|
30
|
+
"react",
|
31
|
+
"react-native"
|
32
|
+
],
|
33
|
+
"author": "Redon Alla <redon.alla@gmail.com>",
|
34
|
+
"license": "MIT",
|
35
|
+
"bugs": {
|
36
|
+
"url": "https://github.com/RedonAlla/flexnative/issues"
|
37
|
+
},
|
38
|
+
"homepage": "https://redonalla.github.io/flexnative/",
|
39
|
+
"devDependencies": {
|
40
|
+
"expo-secure-store": "*"
|
41
|
+
}
|
42
|
+
}
|