react-native-keychain
Advanced tools
Comparing version
@@ -6,3 +6,3 @@ "use strict"; | ||
}); | ||
exports.STORAGE_TYPE = exports.SECURITY_RULES = exports.SECURITY_LEVEL = exports.BIOMETRY_TYPE = exports.AUTHENTICATION_TYPE = exports.ACCESS_CONTROL = exports.ACCESSIBLE = void 0; | ||
exports.STORAGE_TYPE = exports.SECURITY_LEVEL = exports.BIOMETRY_TYPE = exports.AUTHENTICATION_TYPE = exports.ACCESS_CONTROL = exports.ACCESSIBLE = void 0; | ||
var _reactNative = require("react-native"); | ||
@@ -82,3 +82,2 @@ const { | ||
* - AES_CBC: Outdated, use AES_GCM_NO_AUTH instead | ||
* - FB: Archived Facebook Conceal implementation | ||
* | ||
@@ -88,4 +87,2 @@ * @platform Android | ||
let STORAGE_TYPE = exports.STORAGE_TYPE = /*#__PURE__*/function (STORAGE_TYPE) { | ||
STORAGE_TYPE["FB"] = "FacebookConceal"; | ||
STORAGE_TYPE["AES"] = "KeystoreAES"; | ||
STORAGE_TYPE["AES_CBC"] = "KeystoreAESCBC"; | ||
@@ -97,11 +94,2 @@ STORAGE_TYPE["AES_GCM_NO_AUTH"] = "KeystoreAESGCM_NoAuth"; | ||
}({}); | ||
/** | ||
* Enum representing security rules for storage. | ||
* @platform Android | ||
*/ | ||
let SECURITY_RULES = exports.SECURITY_RULES = /*#__PURE__*/function (SECURITY_RULES) { | ||
SECURITY_RULES["NONE"] = "none"; | ||
SECURITY_RULES["AUTOMATIC_UPGRADE"] = "automaticUpgradeToMoreSecuredStorage"; | ||
return SECURITY_RULES; | ||
}({}); | ||
//# sourceMappingURL=enums.js.map |
@@ -20,3 +20,4 @@ "use strict"; | ||
canImplyAuthentication: true, | ||
getSecurityLevel: true | ||
getSecurityLevel: true, | ||
isPasscodeAuthAvailable: true | ||
}; | ||
@@ -32,2 +33,3 @@ exports.canImplyAuthentication = canImplyAuthentication; | ||
exports.hasInternetCredentials = hasInternetCredentials; | ||
exports.isPasscodeAuthAvailable = isPasscodeAuthAvailable; | ||
exports.requestSharedWebCredentials = requestSharedWebCredentials; | ||
@@ -74,3 +76,3 @@ exports.resetGenericPassword = resetGenericPassword; | ||
* @param {string} password - The password to be saved. | ||
* @param {SetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. Passing a service name as a string is deprecated. | ||
* @param {SetOptions} [options] - A keychain options object. | ||
* | ||
@@ -84,5 +86,4 @@ * @returns {Promise<false | Result>} Resolves to an object containing `service` and `storage` when successful, or `false` on failure. | ||
*/ | ||
function setGenericPassword(username, password, serviceOrOptions) { | ||
const options = (0, _normalizeOptions.normalizeOptions)(serviceOrOptions); | ||
return RNKeychainManager.setGenericPasswordForOptions(options, username, password); | ||
function setGenericPassword(username, password, options) { | ||
return RNKeychainManager.setGenericPasswordForOptions((0, _normalizeOptions.normalizeAuthPrompt)(options), username, password); | ||
} | ||
@@ -93,3 +94,3 @@ | ||
* | ||
* @param {GetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {GetOptions} [options] - A keychain options object. | ||
* | ||
@@ -108,5 +109,4 @@ * @returns {Promise<false | UserCredentials>} Resolves to an object containing `service`, `username`, `password`, and `storage` when successful, or `false` on failure. | ||
*/ | ||
function getGenericPassword(serviceOrOptions) { | ||
const options = (0, _normalizeOptions.normalizeOptions)(serviceOrOptions); | ||
return RNKeychainManager.getGenericPasswordForOptions(options); | ||
function getGenericPassword(options) { | ||
return RNKeychainManager.getGenericPasswordForOptions((0, _normalizeOptions.normalizeAuthPrompt)(options)); | ||
} | ||
@@ -117,3 +117,3 @@ | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -128,4 +128,3 @@ * @returns {Promise<boolean>} Resolves to `true` if a password exists, otherwise `false`. | ||
*/ | ||
function hasGenericPassword(serviceOrOptions) { | ||
const options = (0, _normalizeOptions.normalizeServiceOption)(serviceOrOptions); | ||
function hasGenericPassword(options) { | ||
return RNKeychainManager.hasGenericPasswordForOptions(options); | ||
@@ -137,3 +136,3 @@ } | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -148,4 +147,3 @@ * @returns {Promise<boolean>} Resolves to `true` when successful, otherwise `false`. | ||
*/ | ||
function resetGenericPassword(serviceOrOptions) { | ||
const options = (0, _normalizeOptions.normalizeServiceOption)(serviceOrOptions); | ||
function resetGenericPassword(options) { | ||
return RNKeychainManager.resetGenericPasswordForOptions(options); | ||
@@ -165,4 +163,4 @@ } | ||
*/ | ||
function getAllGenericPasswordServices() { | ||
return RNKeychainManager.getAllGenericPasswordServices(); | ||
function getAllGenericPasswordServices(options) { | ||
return RNKeychainManager.getAllGenericPasswordServices(options); | ||
} | ||
@@ -173,3 +171,3 @@ | ||
* | ||
* @param {string} serverOrOptions - A keychain options object or a server name string. | ||
* @param {BaseOptions} options - A keychain options objectnormalizeAuthPrompt(options). | ||
* | ||
@@ -184,4 +182,3 @@ * @returns {Promise<boolean>} Resolves to `true` if internet credentials exist, otherwise `false`. | ||
*/ | ||
function hasInternetCredentials(serverOrOptions) { | ||
const options = (0, _normalizeOptions.normalizeServerOption)(serverOrOptions); | ||
function hasInternetCredentials(options) { | ||
return RNKeychainManager.hasInternetCredentialsForOptions(options); | ||
@@ -206,3 +203,3 @@ } | ||
function setInternetCredentials(server, username, password, options) { | ||
return RNKeychainManager.setInternetCredentialsForServer(server, username, password, (0, _normalizeOptions.normalizeOptions)(options)); | ||
return RNKeychainManager.setInternetCredentialsForServer(server, username, password, (0, _normalizeOptions.normalizeAuthPrompt)(options)); | ||
} | ||
@@ -229,3 +226,3 @@ | ||
function getInternetCredentials(server, options) { | ||
return RNKeychainManager.getInternetCredentialsForServer(server, (0, _normalizeOptions.normalizeOptions)(options)); | ||
return RNKeychainManager.getInternetCredentialsForServer(server, (0, _normalizeOptions.normalizeAuthPrompt)(options)); | ||
} | ||
@@ -236,3 +233,3 @@ | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -247,4 +244,3 @@ * @returns {Promise<void>} Resolves when the operation is completed. | ||
*/ | ||
function resetInternetCredentials(serverOrOptions) { | ||
const options = (0, _normalizeOptions.normalizeServerOption)(serverOrOptions); | ||
function resetInternetCredentials(options) { | ||
return RNKeychainManager.resetInternetCredentialsForOptions(options); | ||
@@ -362,2 +358,20 @@ } | ||
} | ||
/** | ||
* Checks if passcode authentication is available on the current device. | ||
* | ||
* @returns {Promise<boolean>} Resolves to `true` if passcode authentication is available, otherwise `false`. | ||
* | ||
* @example | ||
* ```typescript | ||
* const isAvailable = await Keychain.isPasscodeAuthAvailable(); | ||
* console.log('Passcode authentication available:', isAvailable); | ||
* ``` | ||
*/ | ||
function isPasscodeAuthAvailable() { | ||
if (!RNKeychainManager.isPasscodeAuthAvailable) { | ||
return Promise.resolve(false); | ||
} | ||
return RNKeychainManager.isPasscodeAuthAvailable(); | ||
} | ||
/** @ignore */ | ||
@@ -371,3 +385,2 @@ var _default = exports.default = { | ||
STORAGE_TYPE: _enums.STORAGE_TYPE, | ||
SECURITY_RULES: _enums.SECURITY_RULES, | ||
getSecurityLevel, | ||
@@ -377,2 +390,3 @@ canImplyAuthentication, | ||
setInternetCredentials, | ||
isPasscodeAuthAvailable, | ||
getInternetCredentials, | ||
@@ -379,0 +393,0 @@ resetInternetCredentials, |
@@ -7,7 +7,3 @@ "use strict"; | ||
exports.AUTH_PROMPT_DEFAULTS = void 0; | ||
exports.normalizeOptions = normalizeOptions; | ||
exports.normalizeServerOption = normalizeServerOption; | ||
exports.normalizeServiceOption = normalizeServiceOption; | ||
exports.normalizeStorageOptions = normalizeStorageOptions; | ||
var _enums = require("./enums.js"); | ||
exports.normalizeAuthPrompt = normalizeAuthPrompt; | ||
// Default authentication prompt options | ||
@@ -18,59 +14,14 @@ const AUTH_PROMPT_DEFAULTS = exports.AUTH_PROMPT_DEFAULTS = { | ||
}; | ||
function normalizeStorageOptions(options) { | ||
if ('storage' in options && options.storage === _enums.STORAGE_TYPE.AES) { | ||
console.warn(`You passed 'AES' as a storage option to one of the react-native-keychain functions. | ||
This way of passing storage is deprecated and will be removed in a future major.`); | ||
return { | ||
...options, | ||
storage: _enums.STORAGE_TYPE.AES_CBC | ||
}; | ||
} | ||
return options; | ||
} | ||
function normalizeServiceOption(serviceOrOptions) { | ||
if (typeof serviceOrOptions === 'string') { | ||
console.warn(`You passed a service string as an argument to one of the react-native-keychain functions. | ||
This way of passing service is deprecated and will be removed in a future major. | ||
Please update your code to use { service: ${JSON.stringify(serviceOrOptions)} }`); | ||
return { | ||
service: serviceOrOptions | ||
}; | ||
} | ||
return serviceOrOptions || {}; | ||
} | ||
function normalizeServerOption(serverOrOptions) { | ||
if (typeof serverOrOptions === 'string') { | ||
console.warn(`You passed a server string as an argument to one of the react-native-keychain functions. | ||
This way of passing service is deprecated and will be removed in a future major. | ||
Please update your code to use { service: ${JSON.stringify(serverOrOptions)} }`); | ||
return { | ||
server: serverOrOptions | ||
}; | ||
} | ||
return serverOrOptions || {}; | ||
} | ||
function normalizeOptions(serviceOrOptions) { | ||
const options = normalizeStorageOptions({ | ||
authenticationPrompt: AUTH_PROMPT_DEFAULTS, | ||
...normalizeServiceOption(serviceOrOptions) | ||
}); | ||
function normalizeAuthPrompt( | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
options = {}) { | ||
const { | ||
authenticationPrompt | ||
} = options; | ||
if (typeof authenticationPrompt === 'string') { | ||
console.warn(`You passed a authenticationPrompt string as an argument to one of the react-native-keychain functions. | ||
This way of passing authenticationPrompt is deprecated and will be removed in a future major. | ||
Please update your code to use { authenticationPrompt: { title: ${JSON.stringify(authenticationPrompt)} }`); | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
title: authenticationPrompt | ||
}; | ||
} else { | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
...authenticationPrompt | ||
}; | ||
} | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
...authenticationPrompt | ||
}; | ||
return options; | ||
} | ||
//# sourceMappingURL=normalizeOptions.js.map |
@@ -82,3 +82,2 @@ "use strict"; | ||
* - AES_CBC: Outdated, use AES_GCM_NO_AUTH instead | ||
* - FB: Archived Facebook Conceal implementation | ||
* | ||
@@ -88,4 +87,2 @@ * @platform Android | ||
export let STORAGE_TYPE = /*#__PURE__*/function (STORAGE_TYPE) { | ||
STORAGE_TYPE["FB"] = "FacebookConceal"; | ||
STORAGE_TYPE["AES"] = "KeystoreAES"; | ||
STORAGE_TYPE["AES_CBC"] = "KeystoreAESCBC"; | ||
@@ -97,12 +94,2 @@ STORAGE_TYPE["AES_GCM_NO_AUTH"] = "KeystoreAESGCM_NoAuth"; | ||
}({}); | ||
/** | ||
* Enum representing security rules for storage. | ||
* @platform Android | ||
*/ | ||
export let SECURITY_RULES = /*#__PURE__*/function (SECURITY_RULES) { | ||
SECURITY_RULES["NONE"] = "none"; | ||
SECURITY_RULES["AUTOMATIC_UPGRADE"] = "automaticUpgradeToMoreSecuredStorage"; | ||
return SECURITY_RULES; | ||
}({}); | ||
//# sourceMappingURL=enums.js.map |
"use strict"; | ||
import { NativeModules, Platform } from 'react-native'; | ||
import { ACCESSIBLE, ACCESS_CONTROL, AUTHENTICATION_TYPE, SECURITY_LEVEL, SECURITY_RULES, STORAGE_TYPE, BIOMETRY_TYPE } from "./enums.js"; | ||
import { normalizeOptions, normalizeServerOption, normalizeServiceOption } from "./normalizeOptions.js"; | ||
import { ACCESSIBLE, ACCESS_CONTROL, AUTHENTICATION_TYPE, SECURITY_LEVEL, STORAGE_TYPE, BIOMETRY_TYPE } from "./enums.js"; | ||
import { normalizeAuthPrompt } from "./normalizeOptions.js"; | ||
const { | ||
@@ -15,3 +15,3 @@ RNKeychainManager | ||
* @param {string} password - The password to be saved. | ||
* @param {SetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. Passing a service name as a string is deprecated. | ||
* @param {SetOptions} [options] - A keychain options object. | ||
* | ||
@@ -25,5 +25,4 @@ * @returns {Promise<false | Result>} Resolves to an object containing `service` and `storage` when successful, or `false` on failure. | ||
*/ | ||
export function setGenericPassword(username, password, serviceOrOptions) { | ||
const options = normalizeOptions(serviceOrOptions); | ||
return RNKeychainManager.setGenericPasswordForOptions(options, username, password); | ||
export function setGenericPassword(username, password, options) { | ||
return RNKeychainManager.setGenericPasswordForOptions(normalizeAuthPrompt(options), username, password); | ||
} | ||
@@ -34,3 +33,3 @@ | ||
* | ||
* @param {GetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {GetOptions} [options] - A keychain options object. | ||
* | ||
@@ -49,5 +48,4 @@ * @returns {Promise<false | UserCredentials>} Resolves to an object containing `service`, `username`, `password`, and `storage` when successful, or `false` on failure. | ||
*/ | ||
export function getGenericPassword(serviceOrOptions) { | ||
const options = normalizeOptions(serviceOrOptions); | ||
return RNKeychainManager.getGenericPasswordForOptions(options); | ||
export function getGenericPassword(options) { | ||
return RNKeychainManager.getGenericPasswordForOptions(normalizeAuthPrompt(options)); | ||
} | ||
@@ -58,3 +56,3 @@ | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -69,4 +67,3 @@ * @returns {Promise<boolean>} Resolves to `true` if a password exists, otherwise `false`. | ||
*/ | ||
export function hasGenericPassword(serviceOrOptions) { | ||
const options = normalizeServiceOption(serviceOrOptions); | ||
export function hasGenericPassword(options) { | ||
return RNKeychainManager.hasGenericPasswordForOptions(options); | ||
@@ -78,3 +75,3 @@ } | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -89,4 +86,3 @@ * @returns {Promise<boolean>} Resolves to `true` when successful, otherwise `false`. | ||
*/ | ||
export function resetGenericPassword(serviceOrOptions) { | ||
const options = normalizeServiceOption(serviceOrOptions); | ||
export function resetGenericPassword(options) { | ||
return RNKeychainManager.resetGenericPasswordForOptions(options); | ||
@@ -106,4 +102,4 @@ } | ||
*/ | ||
export function getAllGenericPasswordServices() { | ||
return RNKeychainManager.getAllGenericPasswordServices(); | ||
export function getAllGenericPasswordServices(options) { | ||
return RNKeychainManager.getAllGenericPasswordServices(options); | ||
} | ||
@@ -114,3 +110,3 @@ | ||
* | ||
* @param {string} serverOrOptions - A keychain options object or a server name string. | ||
* @param {BaseOptions} options - A keychain options objectnormalizeAuthPrompt(options). | ||
* | ||
@@ -125,4 +121,3 @@ * @returns {Promise<boolean>} Resolves to `true` if internet credentials exist, otherwise `false`. | ||
*/ | ||
export function hasInternetCredentials(serverOrOptions) { | ||
const options = normalizeServerOption(serverOrOptions); | ||
export function hasInternetCredentials(options) { | ||
return RNKeychainManager.hasInternetCredentialsForOptions(options); | ||
@@ -147,3 +142,3 @@ } | ||
export function setInternetCredentials(server, username, password, options) { | ||
return RNKeychainManager.setInternetCredentialsForServer(server, username, password, normalizeOptions(options)); | ||
return RNKeychainManager.setInternetCredentialsForServer(server, username, password, normalizeAuthPrompt(options)); | ||
} | ||
@@ -170,3 +165,3 @@ | ||
export function getInternetCredentials(server, options) { | ||
return RNKeychainManager.getInternetCredentialsForServer(server, normalizeOptions(options)); | ||
return RNKeychainManager.getInternetCredentialsForServer(server, normalizeAuthPrompt(options)); | ||
} | ||
@@ -177,3 +172,3 @@ | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -188,4 +183,3 @@ * @returns {Promise<void>} Resolves when the operation is completed. | ||
*/ | ||
export function resetInternetCredentials(serverOrOptions) { | ||
const options = normalizeServerOption(serverOrOptions); | ||
export function resetInternetCredentials(options) { | ||
return RNKeychainManager.resetInternetCredentialsForOptions(options); | ||
@@ -303,2 +297,20 @@ } | ||
} | ||
/** | ||
* Checks if passcode authentication is available on the current device. | ||
* | ||
* @returns {Promise<boolean>} Resolves to `true` if passcode authentication is available, otherwise `false`. | ||
* | ||
* @example | ||
* ```typescript | ||
* const isAvailable = await Keychain.isPasscodeAuthAvailable(); | ||
* console.log('Passcode authentication available:', isAvailable); | ||
* ``` | ||
*/ | ||
export function isPasscodeAuthAvailable() { | ||
if (!RNKeychainManager.isPasscodeAuthAvailable) { | ||
return Promise.resolve(false); | ||
} | ||
return RNKeychainManager.isPasscodeAuthAvailable(); | ||
} | ||
export * from "./enums.js"; | ||
@@ -314,3 +326,2 @@ export * from "./types.js"; | ||
STORAGE_TYPE, | ||
SECURITY_RULES, | ||
getSecurityLevel, | ||
@@ -320,2 +331,3 @@ canImplyAuthentication, | ||
setInternetCredentials, | ||
isPasscodeAuthAvailable, | ||
getInternetCredentials, | ||
@@ -322,0 +334,0 @@ resetInternetCredentials, |
"use strict"; | ||
import { STORAGE_TYPE } from "./enums.js"; | ||
// Default authentication prompt options | ||
@@ -9,59 +8,14 @@ export const AUTH_PROMPT_DEFAULTS = { | ||
}; | ||
export function normalizeStorageOptions(options) { | ||
if ('storage' in options && options.storage === STORAGE_TYPE.AES) { | ||
console.warn(`You passed 'AES' as a storage option to one of the react-native-keychain functions. | ||
This way of passing storage is deprecated and will be removed in a future major.`); | ||
return { | ||
...options, | ||
storage: STORAGE_TYPE.AES_CBC | ||
}; | ||
} | ||
return options; | ||
} | ||
export function normalizeServiceOption(serviceOrOptions) { | ||
if (typeof serviceOrOptions === 'string') { | ||
console.warn(`You passed a service string as an argument to one of the react-native-keychain functions. | ||
This way of passing service is deprecated and will be removed in a future major. | ||
Please update your code to use { service: ${JSON.stringify(serviceOrOptions)} }`); | ||
return { | ||
service: serviceOrOptions | ||
}; | ||
} | ||
return serviceOrOptions || {}; | ||
} | ||
export function normalizeServerOption(serverOrOptions) { | ||
if (typeof serverOrOptions === 'string') { | ||
console.warn(`You passed a server string as an argument to one of the react-native-keychain functions. | ||
This way of passing service is deprecated and will be removed in a future major. | ||
Please update your code to use { service: ${JSON.stringify(serverOrOptions)} }`); | ||
return { | ||
server: serverOrOptions | ||
}; | ||
} | ||
return serverOrOptions || {}; | ||
} | ||
export function normalizeOptions(serviceOrOptions) { | ||
const options = normalizeStorageOptions({ | ||
authenticationPrompt: AUTH_PROMPT_DEFAULTS, | ||
...normalizeServiceOption(serviceOrOptions) | ||
}); | ||
export function normalizeAuthPrompt( | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
options = {}) { | ||
const { | ||
authenticationPrompt | ||
} = options; | ||
if (typeof authenticationPrompt === 'string') { | ||
console.warn(`You passed a authenticationPrompt string as an argument to one of the react-native-keychain functions. | ||
This way of passing authenticationPrompt is deprecated and will be removed in a future major. | ||
Please update your code to use { authenticationPrompt: { title: ${JSON.stringify(authenticationPrompt)} }`); | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
title: authenticationPrompt | ||
}; | ||
} else { | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
...authenticationPrompt | ||
}; | ||
} | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
...authenticationPrompt | ||
}; | ||
return options; | ||
} | ||
//# sourceMappingURL=normalizeOptions.js.map |
@@ -103,3 +103,2 @@ /** | ||
* - AES_CBC: Outdated, use AES_GCM_NO_AUTH instead | ||
* - FB: Archived Facebook Conceal implementation | ||
* | ||
@@ -109,10 +108,2 @@ * @platform Android | ||
export declare enum STORAGE_TYPE { | ||
/** Facebook compatibility cipher. | ||
* @deprecated Facebook Conceal was deprecated and archived in Mar 3, 2020. https://github.com/facebookarchive/conceal | ||
*/ | ||
FB = "FacebookConceal", | ||
/** Encryptions without human interaction. | ||
* @deprecated Use AES_GCM_NO_AUTH instead. | ||
*/ | ||
AES = "KeystoreAES", | ||
/** | ||
@@ -140,12 +131,2 @@ * AES encryption in CBC (Cipher Block Chaining) mode. | ||
} | ||
/** | ||
* Enum representing security rules for storage. | ||
* @platform Android | ||
*/ | ||
export declare enum SECURITY_RULES { | ||
/** No special security rules applied. */ | ||
NONE = "none", | ||
/** Upgrade secret to the best available storage as soon as it is available and user request secret extraction. Upgrade not applied till we request the secret. This rule only applies to secrets stored with FacebookConseal. */ | ||
AUTOMATIC_UPGRADE = "automaticUpgradeToMoreSecuredStorage" | ||
} | ||
//# sourceMappingURL=enums.d.ts.map |
@@ -1,3 +0,3 @@ | ||
import { ACCESSIBLE, ACCESS_CONTROL, AUTHENTICATION_TYPE, SECURITY_LEVEL, SECURITY_RULES, STORAGE_TYPE, BIOMETRY_TYPE } from './enums'; | ||
import type { Result, UserCredentials, SharedWebCredentials, GetOptions, BaseOptions, SetOptions, AuthenticationTypeOption, AccessControlOption } from './types'; | ||
import { ACCESSIBLE, ACCESS_CONTROL, AUTHENTICATION_TYPE, SECURITY_LEVEL, STORAGE_TYPE, BIOMETRY_TYPE } from './enums'; | ||
import type { Result, UserCredentials, SharedWebCredentials, GetOptions, GetAllOptions, BaseOptions, SetOptions, AuthenticationTypeOption, AccessControlOption } from './types'; | ||
/** | ||
@@ -8,3 +8,3 @@ * Saves the `username` and `password` combination for the given service. | ||
* @param {string} password - The password to be saved. | ||
* @param {SetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. Passing a service name as a string is deprecated. | ||
* @param {SetOptions} [options] - A keychain options object. | ||
* | ||
@@ -18,7 +18,7 @@ * @returns {Promise<false | Result>} Resolves to an object containing `service` and `storage` when successful, or `false` on failure. | ||
*/ | ||
export declare function setGenericPassword(username: string, password: string, serviceOrOptions?: string | SetOptions): Promise<false | Result>; | ||
export declare function setGenericPassword(username: string, password: string, options?: SetOptions): Promise<false | Result>; | ||
/** | ||
* Fetches the `username` and `password` combination for the given service. | ||
* | ||
* @param {GetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {GetOptions} [options] - A keychain options object. | ||
* | ||
@@ -37,7 +37,7 @@ * @returns {Promise<false | UserCredentials>} Resolves to an object containing `service`, `username`, `password`, and `storage` when successful, or `false` on failure. | ||
*/ | ||
export declare function getGenericPassword(serviceOrOptions?: string | GetOptions): Promise<false | UserCredentials>; | ||
export declare function getGenericPassword(options?: GetOptions): Promise<false | UserCredentials>; | ||
/** | ||
* Checks if generic password exists for the given service. | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -52,7 +52,7 @@ * @returns {Promise<boolean>} Resolves to `true` if a password exists, otherwise `false`. | ||
*/ | ||
export declare function hasGenericPassword(serviceOrOptions?: string | BaseOptions): Promise<boolean>; | ||
export declare function hasGenericPassword(options?: BaseOptions): Promise<boolean>; | ||
/** | ||
* Deletes all generic password keychain entries for the given service. | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -67,3 +67,3 @@ * @returns {Promise<boolean>} Resolves to `true` when successful, otherwise `false`. | ||
*/ | ||
export declare function resetGenericPassword(serviceOrOptions?: string | BaseOptions): Promise<boolean>; | ||
export declare function resetGenericPassword(options?: BaseOptions): Promise<boolean>; | ||
/** | ||
@@ -80,7 +80,7 @@ * Gets all service keys used in generic password keychain entries. | ||
*/ | ||
export declare function getAllGenericPasswordServices(): Promise<string[]>; | ||
export declare function getAllGenericPasswordServices(options?: GetAllOptions): Promise<string[]>; | ||
/** | ||
* Checks if internet credentials exist for the given server. | ||
* | ||
* @param {string} serverOrOptions - A keychain options object or a server name string. | ||
* @param {BaseOptions} options - A keychain options objectnormalizeAuthPrompt(options). | ||
* | ||
@@ -95,3 +95,3 @@ * @returns {Promise<boolean>} Resolves to `true` if internet credentials exist, otherwise `false`. | ||
*/ | ||
export declare function hasInternetCredentials(serverOrOptions: string | BaseOptions): Promise<boolean>; | ||
export declare function hasInternetCredentials(options: string | BaseOptions): Promise<boolean>; | ||
/** | ||
@@ -135,3 +135,3 @@ * Saves the internet credentials for the given server. | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -146,3 +146,3 @@ * @returns {Promise<void>} Resolves when the operation is completed. | ||
*/ | ||
export declare function resetInternetCredentials(serverOrOptions: string | BaseOptions): Promise<void>; | ||
export declare function resetInternetCredentials(options: BaseOptions): Promise<void>; | ||
/** | ||
@@ -228,2 +228,14 @@ * Gets the type of biometric authentication supported by the device. | ||
export declare function getSecurityLevel(options?: AccessControlOption): Promise<null | SECURITY_LEVEL>; | ||
/** | ||
* Checks if passcode authentication is available on the current device. | ||
* | ||
* @returns {Promise<boolean>} Resolves to `true` if passcode authentication is available, otherwise `false`. | ||
* | ||
* @example | ||
* ```typescript | ||
* const isAvailable = await Keychain.isPasscodeAuthAvailable(); | ||
* console.log('Passcode authentication available:', isAvailable); | ||
* ``` | ||
*/ | ||
export declare function isPasscodeAuthAvailable(): Promise<boolean>; | ||
export * from './enums'; | ||
@@ -239,3 +251,2 @@ export * from './types'; | ||
STORAGE_TYPE: typeof STORAGE_TYPE; | ||
SECURITY_RULES: typeof SECURITY_RULES; | ||
getSecurityLevel: typeof getSecurityLevel; | ||
@@ -245,2 +256,3 @@ canImplyAuthentication: typeof canImplyAuthentication; | ||
setInternetCredentials: typeof setInternetCredentials; | ||
isPasscodeAuthAvailable: typeof isPasscodeAuthAvailable; | ||
getInternetCredentials: typeof getInternetCredentials; | ||
@@ -247,0 +259,0 @@ resetInternetCredentials: typeof resetInternetCredentials; |
@@ -1,7 +0,4 @@ | ||
import type { AuthenticationPrompt, BaseOptions, GetOptions, SetOptions } from './types'; | ||
import type { AuthenticationPrompt, GetOptions, SetOptions } from './types'; | ||
export declare const AUTH_PROMPT_DEFAULTS: AuthenticationPrompt; | ||
export declare function normalizeStorageOptions(options: SetOptions | GetOptions): SetOptions; | ||
export declare function normalizeServiceOption(serviceOrOptions?: string | BaseOptions): BaseOptions; | ||
export declare function normalizeServerOption(serverOrOptions?: string | BaseOptions): BaseOptions; | ||
export declare function normalizeOptions(serviceOrOptions?: string | SetOptions | GetOptions): SetOptions | GetOptions; | ||
export declare function normalizeAuthPrompt<T extends SetOptions | GetOptions>(options?: T): T; | ||
//# sourceMappingURL=normalizeOptions.d.ts.map |
@@ -1,2 +0,2 @@ | ||
import type { ACCESS_CONTROL, ACCESSIBLE, AUTHENTICATION_TYPE, SECURITY_LEVEL, SECURITY_RULES, STORAGE_TYPE } from './enums'; | ||
import type { ACCESS_CONTROL, ACCESSIBLE, AUTHENTICATION_TYPE, SECURITY_LEVEL, STORAGE_TYPE } from './enums'; | ||
/** | ||
@@ -32,5 +32,2 @@ * Options for authentication prompt displayed to the user. | ||
cloudSync?: boolean; | ||
}; | ||
/** Base options for keychain functions. */ | ||
export type SetOptions = { | ||
/** The access group to share keychain items between apps. | ||
@@ -40,2 +37,4 @@ * @platform iOS, visionOS | ||
accessGroup?: string; | ||
}; | ||
export type SetOptions = { | ||
/** Specifies when a keychain item is accessible. | ||
@@ -65,13 +64,7 @@ * @platform iOS, visionOS | ||
*/ | ||
authenticationPrompt?: string | AuthenticationPrompt; | ||
authenticationPrompt?: AuthenticationPrompt; | ||
} & BaseOptions & AccessControlOption; | ||
/** Base options for keychain functions. */ | ||
export type GetOptions = { | ||
/** The access control policy to use for the keychain item. */ | ||
accessControl?: ACCESS_CONTROL; | ||
/** The security rules to apply when storing the keychain item. | ||
* @platform Android | ||
* @default SECURITY_RULES.AUTOMATIC_UPGRADE | ||
*/ | ||
rules?: SECURITY_RULES; | ||
/** Authentication prompt details or a title string. | ||
@@ -87,4 +80,10 @@ * @default | ||
*/ | ||
authenticationPrompt?: string | AuthenticationPrompt; | ||
authenticationPrompt?: AuthenticationPrompt; | ||
} & BaseOptions & AccessControlOption; | ||
export type GetAllOptions = { | ||
/** Whether items requiring user authentication should be skipped | ||
* @platform iOS | ||
*/ | ||
skipUIAuth?: boolean; | ||
}; | ||
export type AccessControlOption = { | ||
@@ -91,0 +90,0 @@ /** The access control policy to use for the keychain item. */ |
{ | ||
"name": "react-native-keychain", | ||
"version": "9.2.3", | ||
"version": "10.0.0", | ||
"description": "Keychain Access for React Native", | ||
@@ -59,2 +59,3 @@ "main": "./lib/commonjs/index.js", | ||
"devDependencies": { | ||
"@react-native-community/cli": "^15.0.1", | ||
"@react-native/eslint-config": "^0.74.84", | ||
@@ -65,5 +66,5 @@ "@react-native/typescript-config": "^0.74.84", | ||
"prettier": "^3.0.3", | ||
"react": "18.2.0", | ||
"react-native": "0.74.5", | ||
"react-native-builder-bob": "^0.30.0", | ||
"react": "18.3.0", | ||
"react-native": "0.77.1", | ||
"react-native-builder-bob": "^0.37.0", | ||
"typescript": "^5.2.2" | ||
@@ -70,0 +71,0 @@ }, |
@@ -114,3 +114,2 @@ import { NativeModules } from 'react-native'; | ||
* - AES_CBC: Outdated, use AES_GCM_NO_AUTH instead | ||
* - FB: Archived Facebook Conceal implementation | ||
* | ||
@@ -120,10 +119,2 @@ * @platform Android | ||
export enum STORAGE_TYPE { | ||
/** Facebook compatibility cipher. | ||
* @deprecated Facebook Conceal was deprecated and archived in Mar 3, 2020. https://github.com/facebookarchive/conceal | ||
*/ | ||
FB = 'FacebookConceal', | ||
/** Encryptions without human interaction. | ||
* @deprecated Use AES_GCM_NO_AUTH instead. | ||
*/ | ||
AES = 'KeystoreAES', | ||
/** | ||
@@ -151,12 +142,1 @@ * AES encryption in CBC (Cipher Block Chaining) mode. | ||
} | ||
/** | ||
* Enum representing security rules for storage. | ||
* @platform Android | ||
*/ | ||
export enum SECURITY_RULES { | ||
/** No special security rules applied. */ | ||
NONE = 'none', | ||
/** Upgrade secret to the best available storage as soon as it is available and user request secret extraction. Upgrade not applied till we request the secret. This rule only applies to secrets stored with FacebookConseal. */ | ||
AUTOMATIC_UPGRADE = 'automaticUpgradeToMoreSecuredStorage', | ||
} |
@@ -7,3 +7,2 @@ import { NativeModules, Platform } from 'react-native'; | ||
SECURITY_LEVEL, | ||
SECURITY_RULES, | ||
STORAGE_TYPE, | ||
@@ -17,2 +16,3 @@ BIOMETRY_TYPE, | ||
GetOptions, | ||
GetAllOptions, | ||
BaseOptions, | ||
@@ -23,7 +23,3 @@ SetOptions, | ||
} from './types'; | ||
import { | ||
normalizeOptions, | ||
normalizeServerOption, | ||
normalizeServiceOption, | ||
} from './normalizeOptions'; | ||
import { normalizeAuthPrompt } from './normalizeOptions'; | ||
@@ -37,3 +33,3 @@ const { RNKeychainManager } = NativeModules; | ||
* @param {string} password - The password to be saved. | ||
* @param {SetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. Passing a service name as a string is deprecated. | ||
* @param {SetOptions} [options] - A keychain options object. | ||
* | ||
@@ -50,7 +46,6 @@ * @returns {Promise<false | Result>} Resolves to an object containing `service` and `storage` when successful, or `false` on failure. | ||
password: string, | ||
serviceOrOptions?: string | SetOptions | ||
options?: SetOptions | ||
): Promise<false | Result> { | ||
const options = normalizeOptions(serviceOrOptions); | ||
return RNKeychainManager.setGenericPasswordForOptions( | ||
options, | ||
normalizeAuthPrompt(options), | ||
username, | ||
@@ -64,3 +59,3 @@ password | ||
* | ||
* @param {GetOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {GetOptions} [options] - A keychain options object. | ||
* | ||
@@ -80,6 +75,7 @@ * @returns {Promise<false | UserCredentials>} Resolves to an object containing `service`, `username`, `password`, and `storage` when successful, or `false` on failure. | ||
export function getGenericPassword( | ||
serviceOrOptions?: string | GetOptions | ||
options?: GetOptions | ||
): Promise<false | UserCredentials> { | ||
const options = normalizeOptions(serviceOrOptions); | ||
return RNKeychainManager.getGenericPasswordForOptions(options); | ||
return RNKeychainManager.getGenericPasswordForOptions( | ||
normalizeAuthPrompt(options) | ||
); | ||
} | ||
@@ -90,3 +86,3 @@ | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -101,6 +97,3 @@ * @returns {Promise<boolean>} Resolves to `true` if a password exists, otherwise `false`. | ||
*/ | ||
export function hasGenericPassword( | ||
serviceOrOptions?: string | BaseOptions | ||
): Promise<boolean> { | ||
const options = normalizeServiceOption(serviceOrOptions); | ||
export function hasGenericPassword(options?: BaseOptions): Promise<boolean> { | ||
return RNKeychainManager.hasGenericPasswordForOptions(options); | ||
@@ -112,3 +105,3 @@ } | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -123,6 +116,3 @@ * @returns {Promise<boolean>} Resolves to `true` when successful, otherwise `false`. | ||
*/ | ||
export function resetGenericPassword( | ||
serviceOrOptions?: string | BaseOptions | ||
): Promise<boolean> { | ||
const options = normalizeServiceOption(serviceOrOptions); | ||
export function resetGenericPassword(options?: BaseOptions): Promise<boolean> { | ||
return RNKeychainManager.resetGenericPasswordForOptions(options); | ||
@@ -142,4 +132,6 @@ } | ||
*/ | ||
export function getAllGenericPasswordServices(): Promise<string[]> { | ||
return RNKeychainManager.getAllGenericPasswordServices(); | ||
export function getAllGenericPasswordServices( | ||
options?: GetAllOptions | ||
): Promise<string[]> { | ||
return RNKeychainManager.getAllGenericPasswordServices(options); | ||
} | ||
@@ -150,3 +142,3 @@ | ||
* | ||
* @param {string} serverOrOptions - A keychain options object or a server name string. | ||
* @param {BaseOptions} options - A keychain options objectnormalizeAuthPrompt(options). | ||
* | ||
@@ -162,5 +154,4 @@ * @returns {Promise<boolean>} Resolves to `true` if internet credentials exist, otherwise `false`. | ||
export function hasInternetCredentials( | ||
serverOrOptions: string | BaseOptions | ||
options: string | BaseOptions | ||
): Promise<boolean> { | ||
const options = normalizeServerOption(serverOrOptions); | ||
return RNKeychainManager.hasInternetCredentialsForOptions(options); | ||
@@ -194,3 +185,3 @@ } | ||
password, | ||
normalizeOptions(options) | ||
normalizeAuthPrompt(options) | ||
); | ||
@@ -223,3 +214,3 @@ } | ||
server, | ||
normalizeOptions(options) | ||
normalizeAuthPrompt(options) | ||
); | ||
@@ -231,3 +222,3 @@ } | ||
* | ||
* @param {BaseOptions | string} [serviceOrOptions] - A keychain options object or a service name string. | ||
* @param {BaseOptions} [options] - A keychain options object. | ||
* | ||
@@ -242,6 +233,3 @@ * @returns {Promise<void>} Resolves when the operation is completed. | ||
*/ | ||
export function resetInternetCredentials( | ||
serverOrOptions: string | BaseOptions | ||
): Promise<void> { | ||
const options = normalizeServerOption(serverOrOptions); | ||
export function resetInternetCredentials(options: BaseOptions): Promise<void> { | ||
return RNKeychainManager.resetInternetCredentialsForOptions(options); | ||
@@ -383,2 +371,20 @@ } | ||
/** | ||
* Checks if passcode authentication is available on the current device. | ||
* | ||
* @returns {Promise<boolean>} Resolves to `true` if passcode authentication is available, otherwise `false`. | ||
* | ||
* @example | ||
* ```typescript | ||
* const isAvailable = await Keychain.isPasscodeAuthAvailable(); | ||
* console.log('Passcode authentication available:', isAvailable); | ||
* ``` | ||
*/ | ||
export function isPasscodeAuthAvailable(): Promise<boolean> { | ||
if (!RNKeychainManager.isPasscodeAuthAvailable) { | ||
return Promise.resolve(false); | ||
} | ||
return RNKeychainManager.isPasscodeAuthAvailable(); | ||
} | ||
export * from './enums'; | ||
@@ -394,3 +400,2 @@ export * from './types'; | ||
STORAGE_TYPE, | ||
SECURITY_RULES, | ||
getSecurityLevel, | ||
@@ -400,2 +405,3 @@ canImplyAuthentication, | ||
setInternetCredentials, | ||
isPasscodeAuthAvailable, | ||
getInternetCredentials, | ||
@@ -402,0 +408,0 @@ resetInternetCredentials, |
@@ -1,8 +0,2 @@ | ||
import { STORAGE_TYPE } from './enums'; | ||
import type { | ||
AuthenticationPrompt, | ||
BaseOptions, | ||
GetOptions, | ||
SetOptions, | ||
} from './types'; | ||
import type { AuthenticationPrompt, GetOptions, SetOptions } from './types'; | ||
@@ -15,77 +9,14 @@ // Default authentication prompt options | ||
export function normalizeStorageOptions( | ||
options: SetOptions | GetOptions | ||
): SetOptions { | ||
if ('storage' in options && options.storage === STORAGE_TYPE.AES) { | ||
console.warn( | ||
`You passed 'AES' as a storage option to one of the react-native-keychain functions. | ||
This way of passing storage is deprecated and will be removed in a future major.` | ||
); | ||
return { ...options, storage: STORAGE_TYPE.AES_CBC }; | ||
} | ||
return options; | ||
} | ||
export function normalizeServiceOption( | ||
serviceOrOptions?: string | BaseOptions | ||
): BaseOptions { | ||
if (typeof serviceOrOptions === 'string') { | ||
console.warn( | ||
`You passed a service string as an argument to one of the react-native-keychain functions. | ||
This way of passing service is deprecated and will be removed in a future major. | ||
Please update your code to use { service: ${JSON.stringify( | ||
serviceOrOptions | ||
)} }` | ||
); | ||
return { service: serviceOrOptions }; | ||
} | ||
return serviceOrOptions || {}; | ||
} | ||
export function normalizeServerOption( | ||
serverOrOptions?: string | BaseOptions | ||
): BaseOptions { | ||
if (typeof serverOrOptions === 'string') { | ||
console.warn( | ||
`You passed a server string as an argument to one of the react-native-keychain functions. | ||
This way of passing service is deprecated and will be removed in a future major. | ||
Please update your code to use { service: ${JSON.stringify( | ||
serverOrOptions | ||
)} }` | ||
); | ||
return { server: serverOrOptions }; | ||
} | ||
return serverOrOptions || {}; | ||
} | ||
export function normalizeOptions( | ||
serviceOrOptions?: string | SetOptions | GetOptions | ||
): SetOptions | GetOptions { | ||
const options = normalizeStorageOptions({ | ||
authenticationPrompt: AUTH_PROMPT_DEFAULTS, | ||
...normalizeServiceOption(serviceOrOptions), | ||
}); | ||
export function normalizeAuthPrompt<T extends SetOptions | GetOptions>( | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
options: T = {} as any | ||
) { | ||
const { authenticationPrompt } = options; | ||
if (typeof authenticationPrompt === 'string') { | ||
console.warn( | ||
`You passed a authenticationPrompt string as an argument to one of the react-native-keychain functions. | ||
This way of passing authenticationPrompt is deprecated and will be removed in a future major. | ||
Please update your code to use { authenticationPrompt: { title: ${JSON.stringify( | ||
authenticationPrompt | ||
)} }` | ||
); | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
title: authenticationPrompt, | ||
}; | ||
} else { | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
...authenticationPrompt, | ||
}; | ||
} | ||
options.authenticationPrompt = { | ||
...AUTH_PROMPT_DEFAULTS, | ||
...authenticationPrompt, | ||
}; | ||
return options; | ||
} |
@@ -6,3 +6,2 @@ import type { | ||
SECURITY_LEVEL, | ||
SECURITY_RULES, | ||
STORAGE_TYPE, | ||
@@ -42,6 +41,2 @@ } from './enums'; | ||
cloudSync?: boolean; | ||
}; | ||
/** Base options for keychain functions. */ | ||
export type SetOptions = { | ||
/** The access group to share keychain items between apps. | ||
@@ -51,2 +46,5 @@ * @platform iOS, visionOS | ||
accessGroup?: string; | ||
}; | ||
export type SetOptions = { | ||
/** Specifies when a keychain item is accessible. | ||
@@ -76,15 +74,9 @@ * @platform iOS, visionOS | ||
*/ | ||
authenticationPrompt?: string | AuthenticationPrompt; | ||
authenticationPrompt?: AuthenticationPrompt; | ||
} & BaseOptions & | ||
AccessControlOption; | ||
/** Base options for keychain functions. */ | ||
export type GetOptions = { | ||
/** The access control policy to use for the keychain item. */ | ||
accessControl?: ACCESS_CONTROL; | ||
/** The security rules to apply when storing the keychain item. | ||
* @platform Android | ||
* @default SECURITY_RULES.AUTOMATIC_UPGRADE | ||
*/ | ||
rules?: SECURITY_RULES; | ||
/** Authentication prompt details or a title string. | ||
@@ -100,6 +92,13 @@ * @default | ||
*/ | ||
authenticationPrompt?: string | AuthenticationPrompt; | ||
authenticationPrompt?: AuthenticationPrompt; | ||
} & BaseOptions & | ||
AccessControlOption; | ||
export type GetAllOptions = { | ||
/** Whether items requiring user authentication should be skipped | ||
* @platform iOS | ||
*/ | ||
skipUIAuth?: boolean; | ||
}; | ||
export type AccessControlOption = { | ||
@@ -106,0 +105,0 @@ /** The access control policy to use for the keychain item. */ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
230397
-9.79%10
11.11%59
-4.84%2051
-8.36%