From 443a43e329f19349c80bc54cf3f0133ed28b2dbf Mon Sep 17 00:00:00 2001 From: Mateus Andrade Date: Tue, 28 Apr 2026 13:44:54 -0300 Subject: [PATCH 1/6] Add husky/lint-staged; refactor options & hooks Add a husky pre-commit hook and lint-staged config; update package scripts to run prepare/husky and run lint+codegen before publish. Switch babel config to react-native-builder-bob preset and add babel-plugin-react-compiler. Remove scripts/remove-source-maps.cjs and stop invoking it from the build pipeline. Refactor runtime and API internals: lazy-initialize the Nitro hybrid object with docs, improve JSDoc across specs/types, simplify useInAppBrowser by centralizing loading/error tracking (remove useCallback/useMemo churn), and significantly rewrite normalizeOptions to use per-field sanitizers with fast-paths to avoid unnecessary allocations. Minor tsconfig cleanup and dependency/devDependency updates. --- .husky/pre-commit | 1 + babel.config.js | 17 +- example/package.json | 1 - package.json | 24 +- scripts/remove-source-maps.cjs | 40 - src/core/native.ts | 52 +- src/hooks/useInAppBrowser.ts | 114 +- src/specs/inappbrowser-nitro.nitro.ts | 28 +- src/types.ts | 104 +- src/utils/options.ts | 154 ++- tsconfig.json | 2 - yarn.lock | 1810 +++---------------------- 12 files changed, 548 insertions(+), 1799 deletions(-) create mode 100644 .husky/pre-commit delete mode 100644 scripts/remove-source-maps.cjs mode change 100755 => 100644 src/specs/inappbrowser-nitro.nitro.ts diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..3723623 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +yarn lint-staged diff --git a/babel.config.js b/babel.config.js index 3e0218e..bd14a99 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,18 @@ +/** + * Babel config used both by the example app (which loads + * `module:@react-native/babel-preset` via Metro) and by `react-native-builder-bob` + * when compiling the library output to `lib/`. + * + * Bob calls babel directly and sets `caller.supportsStaticESM = true` for the + * `module` target so we use bob's bundled preset (which honors that caller flag + * to preserve ESM in `lib/module/`). The example app's Metro pipeline uses the + * RN preset via its own `babel.config.js`, so this config does NOT need to + * include the RN preset. + * + * `babel-plugin-react-compiler` runs first so subsequent transforms (preset-env, + * etc.) operate on the compiler-emitted output. + */ module.exports = { - presets: ['module:@react-native/babel-preset'], + presets: ['react-native-builder-bob/babel-preset'], + plugins: [['babel-plugin-react-compiler', { target: '19' }]], } diff --git a/example/package.json b/example/package.json index 027786d..9ef769b 100644 --- a/example/package.json +++ b/example/package.json @@ -25,7 +25,6 @@ "@react-native-community/cli-platform-android": "20.1.3", "@react-native-community/cli-platform-ios": "20.1.3", "@react-native/babel-preset": "0.85.2", - "@react-native/eslint-config": "0.85.2", "@react-native/metro-config": "0.85.2", "@react-native/typescript-config": "0.85.2", "@types/jest": "^30.0.0", diff --git a/package.json b/package.json index 753b564..2dbab9c 100644 --- a/package.json +++ b/package.json @@ -54,9 +54,10 @@ "format": "biome format --write", "clean": "git clean -dfX", "release": "semantic-release", - "build": "npm run typecheck && bob build && node ./scripts/remove-source-maps.cjs", + "build": "npm run typecheck && bob build", "codegen": "nitrogen --logLevel=\"debug\" && npm run build && node post-script.js", - "prepublish": "yarn codegen" + "prepare": "husky", + "prepublishOnly": "yarn lint && yarn codegen" }, "keywords": [ "react-native", @@ -110,12 +111,14 @@ }, "devDependencies": { "@biomejs/biome": "^2.4.12", - "@jamesacarr/eslint-formatter-github-actions": "^0.2.0", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "@types/jest": "^30.0.0", "@types/react": "19.2.14", + "babel-plugin-react-compiler": "^19.1.0-rc.3", "conventional-changelog-conventionalcommits": "^9.3.1", + "husky": "^9.1.7", + "lint-staged": "^16.1.2", "nitrogen": "0.35.4", "react": "19.2.3", "react-native": "0.85", @@ -136,13 +139,17 @@ [ "commonjs", { - "esm": true + "esm": true, + "sourceMaps": false, + "configFile": true } ], [ "module", { - "esm": true + "esm": true, + "sourceMaps": false, + "configFile": true } ], [ @@ -153,5 +160,10 @@ ] ] }, - "packageManager": "yarn@4.11.0" + "packageManager": "yarn@4.11.0", + "lint-staged": { + "*.{js,jsx,ts,tsx,cjs,mjs,json}": [ + "biome check --write --no-errors-on-unmatched" + ] + } } diff --git a/scripts/remove-source-maps.cjs b/scripts/remove-source-maps.cjs deleted file mode 100644 index 0e7dd50..0000000 --- a/scripts/remove-source-maps.cjs +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node - -const path = require('node:path') -const { promises: fs } = require('node:fs') - -async function removeMaps(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }) - - await Promise.all( - entries.map(async (entry) => { - const entryPath = path.join(directory, entry.name) - - if (entry.isDirectory()) { - await removeMaps(entryPath) - return - } - - if (entry.isFile() && entry.name.endsWith('.map')) { - await fs.unlink(entryPath) - } - }) - ) -} - -async function main() { - const libPath = path.join(__dirname, '..', 'lib') - - try { - await fs.access(libPath) - } catch { - return - } - - await removeMaps(libPath) -} - -main().catch((error) => { - console.error('Failed to remove source maps from lib directory:', error) - process.exitCode = 1 -}) diff --git a/src/core/native.ts b/src/core/native.ts index d876b92..53b0043 100644 --- a/src/core/native.ts +++ b/src/core/native.ts @@ -9,10 +9,14 @@ import type { import { normalizeOptions } from '../utils/options' import { validateUrl } from '../utils/url' -// Lazy-initialized JSI hybrid object. Keeping it behind a getter avoids any -// native allocation at module import time, so consumers that only import -// types (or tree-shake the runtime API) pay no startup cost. +/** @internal Lazy-initialized JSI hybrid object cache. */ let _native: InappbrowserNitro | null = null + +/** + * Lazily resolve the Nitro hybrid object. Keeping construction behind a + * getter avoids any native allocation at module import time, so consumers + * that only import types pay no startup cost. + */ const getNative = (): InappbrowserNitro => { if (_native !== null) return _native const Ctor = @@ -27,17 +31,34 @@ const getNative = (): InappbrowserNitro => { * - On iOS this is always `true`. * - On Android it depends on whether a Custom Tabs compatible browser is * installed (Chrome, Samsung Internet, etc.). + * + * @example + * ```ts + * if (await isAvailable()) { + * await open('https://example.com') + * } + * ``` + * @see {@link InappbrowserNitro.isAvailable} */ export const isAvailable = (): Promise => getNative().isAvailable() /** * Present an in-app browser for `url` with optional platform configuration. * - * Resolves with the final `InAppBrowserResult` once the user dismisses the - * browser or the system closes it. + * Resolves with the final {@link InAppBrowserResult} once the user dismisses + * the browser or the system closes it. * - * @throws if `url` is empty, missing a scheme, or uses a denied scheme - * (`javascript:`, `data:`, `vbscript:`). + * @throws {Error} if `url` is empty, missing a scheme, or uses a denied + * scheme (`javascript:`, `data:`, `vbscript:`). + * + * @example + * ```ts + * const result = await open('https://example.com', { + * preferredBarTintColor: { light: '#FFFFFF', dark: '#000000' }, + * }) + * if (result.type === 'success') { … } + * ``` + * @see {@link InappbrowserNitro.open} */ export const open = ( url: string, @@ -49,8 +70,17 @@ export const open = ( * Launch an authentication session for `url` and resolve when the native * runtime intercepts a navigation matching `redirectUrl`. * - * @throws if either `url` or `redirectUrl` is empty, missing a scheme, - * or uses a denied scheme. + * @throws {Error} if either `url` or `redirectUrl` is empty, missing a + * scheme, or uses a denied scheme. + * + * @example + * ```ts + * const result = await openAuth( + * 'https://example.com/oauth/authorize?…', + * 'myapp://callback' + * ) + * ``` + * @see {@link InappbrowserNitro.openAuth} */ export const openAuth = ( url: string, @@ -66,11 +96,15 @@ export const openAuth = ( /** * Dismiss any currently visible in-app browser opened via {@link open}. * No-op when no browser is presented. + * + * @see {@link InappbrowserNitro.close} */ export const close = (): Promise => getNative().close() /** * Dismiss any currently running authentication session opened via * {@link openAuth}. No-op when no session is active. + * + * @see {@link InappbrowserNitro.closeAuth} */ export const closeAuth = (): Promise => getNative().closeAuth() diff --git a/src/hooks/useInAppBrowser.ts b/src/hooks/useInAppBrowser.ts index 28a7e7c..4a7baff 100644 --- a/src/hooks/useInAppBrowser.ts +++ b/src/hooks/useInAppBrowser.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { close as nativeClose, @@ -13,17 +13,27 @@ import type { InAppBrowserResult, } from '../types' +/** + * Stateful surface returned by {@link useInAppBrowser}. + * + * @example + * ```tsx + * const { open, isLoading, error } = useInAppBrowser() + * + * const onPress = () => { + * open('https://example.com').catch(() => { + * // `error` is also populated automatically. + * }) + * } + * ``` + */ export interface UseInAppBrowserReturn { - /** - * Present the in-app browser, tracking `isLoading` / `error` on this hook. - */ + /** Present the in-app browser, tracking `isLoading` / `error` on this hook. */ open: ( url: string, options?: InAppBrowserOptions ) => Promise - /** - * Launch an auth session, tracking `isLoading` / `error` on this hook. - */ + /** Launch an auth session, tracking `isLoading` / `error` on this hook. */ openAuth: ( url: string, redirectUrl: string, @@ -45,9 +55,13 @@ const toError = (err: unknown): Error => err instanceof Error ? err : new Error(String(err)) /** - * React hook that wraps {@link nativeOpen} / {@link nativeOpenAuth} with - * loading and error state tracking. `close`, `closeAuth`, and `isAvailable` - * are direct delegates to the stateless module API. + * React hook that wraps the imperative {@link nativeOpen} / {@link nativeOpenAuth} + * APIs with loading and error state tracking. `close`, `closeAuth`, and + * `isAvailable` are direct delegates to the stateless module API. + * + * Memoization is handled by the React Compiler at build time, so the returned + * object identity is stable across re-renders without manual `useCallback` / + * `useMemo` wrappers. */ export const useInAppBrowser = (): UseInAppBrowserReturn => { const [isLoading, setIsLoading] = useState(false) @@ -63,54 +77,38 @@ export const useInAppBrowser = (): UseInAppBrowserReturn => { } }, []) - const open = useCallback( - async (url: string, options?: InAppBrowserOptions) => { - if (isMountedRef.current) { - setIsLoading(true) - setError(null) - } - try { - return await nativeOpen(url, options) - } catch (err) { - const next = toError(err) - if (isMountedRef.current) setError(next) - throw next - } finally { - if (isMountedRef.current) setIsLoading(false) - } - }, - [] - ) + const runTracked = async (fn: () => Promise): Promise => { + if (isMountedRef.current) { + setIsLoading(true) + setError(null) + } + try { + return await fn() + } catch (err) { + const next = toError(err) + if (isMountedRef.current) setError(next) + throw next + } finally { + if (isMountedRef.current) setIsLoading(false) + } + } + + const open = (url: string, options?: InAppBrowserOptions) => + runTracked(() => nativeOpen(url, options)) - const openAuth = useCallback( - async (url: string, redirectUrl: string, options?: InAppBrowserOptions) => { - if (isMountedRef.current) { - setIsLoading(true) - setError(null) - } - try { - return await nativeOpenAuth(url, redirectUrl, options) - } catch (err) { - const next = toError(err) - if (isMountedRef.current) setError(next) - throw next - } finally { - if (isMountedRef.current) setIsLoading(false) - } - }, - [] - ) + const openAuth = ( + url: string, + redirectUrl: string, + options?: InAppBrowserOptions + ) => runTracked(() => nativeOpenAuth(url, redirectUrl, options)) - return useMemo( - () => ({ - open, - openAuth, - close: nativeClose, - closeAuth: nativeCloseAuth, - isAvailable: nativeIsAvailable, - isLoading, - error, - }), - [open, openAuth, isLoading, error] - ) + return { + open, + openAuth, + close: nativeClose, + closeAuth: nativeCloseAuth, + isAvailable: nativeIsAvailable, + isLoading, + error, + } } diff --git a/src/specs/inappbrowser-nitro.nitro.ts b/src/specs/inappbrowser-nitro.nitro.ts old mode 100755 new mode 100644 index a8427a5..805d4ad --- a/src/specs/inappbrowser-nitro.nitro.ts +++ b/src/specs/inappbrowser-nitro.nitro.ts @@ -6,34 +6,32 @@ import type { InAppBrowserResult, } from '../types' +/** + * Native bridge spec consumed by Nitrogen to generate the iOS (Swift) and + * Android (Kotlin) hybrid object scaffolding. + * + * @internal Application code should use the imperative API exported from the + * package root (`open`, `openAuth`, `close`, `closeAuth`, `isAvailable`) or + * the {@link useInAppBrowser} hook — not this interface directly. + */ export interface InappbrowserNitro extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { - /** - * Report whether the Native runtime can present an in-app browser. - */ + /** Report whether the native runtime can present an in-app browser. */ isAvailable(): Promise - /** - * Present an in-app browser with the supplied configuration. - */ + /** Present an in-app browser with the supplied configuration. */ open(url: string, options?: InAppBrowserOptions): Promise - /** - * Launch an authentication flow and resolve with the redirect payload. - */ + /** Launch an authentication flow and resolve with the redirect payload. */ openAuth( url: string, redirectUrl: string, options?: InAppBrowserOptions ): Promise - /** - * Close any visible browser session. - */ + /** Close any visible browser session. */ close(): Promise - /** - * Dismiss an ongoing authentication session. - */ + /** Dismiss an ongoing authentication session. */ closeAuth(): Promise } diff --git a/src/types.ts b/src/types.ts index ca402fe..3bfb83f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,7 +1,23 @@ // src/types.ts +// +// All enum-like constants below are exported as both a frozen `as const` value +// AND a matching string-literal type. Consumers using only the type +// (`import type { BrowserResultType }`) tree-shake the runtime const out +// thanks to `"sideEffects": false` on the package, while value-style +// consumers (`BrowserResultType.Success`) keep working unchanged. /** * Discrete result types returned by the native browser implementations. + * + * @example Value form + * ```ts + * if (result.type === BrowserResultType.Success) { … } + * ``` + * @example Type-only form (smaller bundle) + * ```ts + * import type { BrowserResultType } from 'react-native-inappbrowser-nitro' + * const t: BrowserResultType = 'success' + * ``` */ export const BrowserResultType = { /** User actively dismissed the browser (tap on Done/Close/back). */ @@ -17,6 +33,7 @@ export type BrowserResultType = /** * iOS dismiss button appearance options. + * @platform ios */ export const DismissButtonStyle = { Done: 'done', @@ -29,6 +46,7 @@ export type DismissButtonStyle = /** * iOS presentation styles exposed by Safari Services. + * @platform ios */ export const ModalPresentationStyle = { Automatic: 'automatic', @@ -48,6 +66,7 @@ export type ModalPresentationStyle = /** * iOS transition styles available when presenting Safari. + * @platform ios */ export const ModalTransitionStyle = { CoverVertical: 'coverVertical', @@ -61,6 +80,7 @@ export type ModalTransitionStyle = /** * Android Custom Tabs color scheme modes. + * @platform android */ export const BrowserColorScheme = { System: 'system', @@ -73,6 +93,7 @@ export type BrowserColorScheme = /** * Android Custom Tabs share state visibility. + * @platform android */ export const BrowserShareState = { Default: 'default', @@ -83,6 +104,10 @@ export const BrowserShareState = { export type BrowserShareState = (typeof BrowserShareState)[keyof typeof BrowserShareState] +/** + * iOS status bar appearance applied while the browser is presented. + * @platform ios + */ export const StatusBarStyle = { Default: 'default', LightContent: 'lightContent', @@ -92,6 +117,10 @@ export const StatusBarStyle = { export type StatusBarStyle = (typeof StatusBarStyle)[keyof typeof StatusBarStyle] +/** + * iOS user interface style override (light / dark / unspecified). + * @platform ios + */ export const UserInterfaceStyle = { Unspecified: 'unspecified', Light: 'light', @@ -103,6 +132,7 @@ export type UserInterfaceStyle = /** * Compact description of a color palette for light/dark/high-contrast modes. + * Each property accepts a `#RRGGBB` / `#AARRGGBB` string. */ export interface DynamicColor { /** Primary color used regardless of theme (fallback). */ @@ -115,89 +145,143 @@ export interface DynamicColor { highContrast?: string } -/** - * Reader mode result sizing used when presenting as a form sheet. - */ +/** Preferred content size when presenting Safari as a form sheet. */ export interface FormSheetContentSize { + /** Width in points. */ width: number + /** Height in points. */ height: number } /** * iOS specific presentation and styling options. + * @platform ios */ export interface InAppBrowserIOSOptions { + /** Style used for the dismiss button in the Safari toolbar. */ dismissButtonStyle?: DismissButtonStyle + /** Tint color of the navigation/toolbar background. */ preferredBarTintColor?: DynamicColor + /** Tint color of the toolbar buttons (e.g. Done, Share). */ preferredControlTintColor?: DynamicColor + /** Status bar style while the browser is presented. */ preferredStatusBarStyle?: StatusBarStyle + /** Open the URL in Safari Reader Mode if the page supports it. @default false */ readerMode?: boolean + /** Animate the present/dismiss transitions. @default true */ animated?: boolean + /** Modal presentation style. @default 'automatic' */ modalPresentationStyle?: ModalPresentationStyle + /** Modal transition style. @default 'coverVertical' */ modalTransitionStyle?: ModalTransitionStyle + /** Present the browser modally rather than pushing onto the navigation stack. @default true */ modalEnabled?: boolean + /** Allow the toolbar to collapse on scroll. @default true */ enableBarCollapsing?: boolean + /** Use an ephemeral (non-persistent) web session for `openAuth`. @default false */ ephemeralWebSession?: boolean + /** Allow swipe-from-edge to dismiss the browser. @default true */ enableEdgeDismiss?: boolean + /** Force a specific user interface style for the browser controller. */ overrideUserInterfaceStyle?: UserInterfaceStyle + /** Preferred content size when `modalPresentationStyle: 'formSheet'`. */ formSheetPreferredContentSize?: FormSheetContentSize } /** * Declarative animation configuration for Android Custom Tabs. + * Each value is the resource name of an XML animation in the host app + * (e.g. `'slide_in_right'`). + * @platform android */ export interface BrowserAnimations { + /** Enter animation when the Custom Tab is launched. */ startEnter?: string + /** Exit animation applied to the previous activity when launching. */ startExit?: string + /** Enter animation applied to the previous activity on close. */ endEnter?: string + /** Exit animation when the Custom Tab is dismissed. */ endExit?: string } /** * Android specific presentation and styling options. + * @platform android */ export interface InAppBrowserAndroidOptions { + /** Show the page title beneath the URL bar. @default false */ showTitle?: boolean + /** Color of the toolbar background. */ toolbarColor?: DynamicColor + /** Color of the secondary (bottom) toolbar background. */ secondaryToolbarColor?: DynamicColor + /** Color of the system navigation bar. */ navigationBarColor?: DynamicColor + /** Color of the divider between content and navigation bar. */ navigationBarDividerColor?: DynamicColor + /** Hide the URL bar on scroll. @default false */ enableUrlBarHiding?: boolean + /** Show the system Share menu item. @default false */ enableDefaultShare?: boolean + /** Override the default share menu visibility. */ shareState?: BrowserShareState + /** Color scheme applied to the Custom Tab. */ colorScheme?: BrowserColorScheme + /** Custom HTTP headers forwarded to the initial request. */ headers?: Record + /** Force-close the tab when the redirect URL is matched (auth flows). @default false */ forceCloseOnRedirection?: boolean + /** Show a back arrow instead of an "X" close button. @default false */ hasBackButton?: boolean + /** Explicit browser package name (e.g. `'com.android.chrome'`). */ browserPackage?: string + /** Keep the Custom Tab in Recents after closing. @default true */ showInRecents?: boolean + /** Send the host app's package name as Referrer. @default false */ includeReferrer?: boolean + /** Allow Instant Apps to handle the URL when supported. @default true */ instantAppsEnabled?: boolean + /** Enable swipe-down pull-to-refresh inside the tab. @default false */ enablePullToRefresh?: boolean + /** Show the tab as a partial bottom sheet (Android 13+). @default false */ enablePartialCustomTab?: boolean + /** Custom enter/exit animations. */ animations?: BrowserAnimations } /** - * Aggregated cross-platform options. + * Aggregated cross-platform options. iOS-only fields are ignored on Android + * and vice versa. + * + * @example + * ```ts + * await open('https://example.com', { + * preferredBarTintColor: { light: '#FFFFFF', dark: '#000000' }, + * toolbarColor: { light: '#FFFFFF', dark: '#000000' }, + * readerMode: true, + * }) + * ``` */ export interface InAppBrowserOptions extends InAppBrowserIOSOptions, InAppBrowserAndroidOptions {} -/** - * Result payload returned by imperative API calls. - */ +/** Result payload returned by imperative API calls. */ export interface InAppBrowserResult { + /** Discriminator describing how the browser was closed. */ type: BrowserResultType + /** Final URL captured from the browser session, when applicable. */ url?: string + /** Optional human-readable reason (e.g. error message on `dismiss`). */ message?: string } /** * Authentication result payload. + * * Semantically identical to {@link InAppBrowserResult}; declared as a - * distinct interface so hover/go-to-definition reads as `InAppBrowserAuthResult` - * at call sites. + * `type` alias (rather than an empty extending interface) so the emitted + * `.d.ts` is a few bytes smaller without changing IDE hover output. */ -export interface InAppBrowserAuthResult extends InAppBrowserResult {} +export type InAppBrowserAuthResult = InAppBrowserResult diff --git a/src/utils/options.ts b/src/utils/options.ts index a42a63a..c085a92 100644 --- a/src/utils/options.ts +++ b/src/utils/options.ts @@ -11,27 +11,6 @@ import type { const compact = (obj: T): T | undefined => Object.keys(obj).length > 0 ? obj : undefined -/** - * Copy whitelisted string fields from `source` into a new object, trimming - * each value and dropping empty or non-string entries. - */ -const trimStringFields = ( - source: T, - keys: readonly (keyof T)[] -): Partial => { - const out: Partial = {} - for (const key of keys) { - const value = source[key] - if (typeof value === 'string') { - const trimmed = value.trim() - if (trimmed) { - out[key] = trimmed as T[keyof T] - } - } - } - return out -} - const DYNAMIC_COLOR_KEYS = [ 'base', 'light', @@ -46,41 +25,87 @@ const ANIMATION_KEYS = [ 'endExit', ] as const satisfies readonly (keyof BrowserAnimations)[] -const sanitizeColor = (value: DynamicColor): DynamicColor | undefined => - compact(trimStringFields(value, DYNAMIC_COLOR_KEYS)) +/** + * Whitelist-trim string fields. Returns `null` when no mutation was required + * (caller can keep its original reference); otherwise returns the new payload + * (or `undefined` when every entry was dropped). + */ +const trimStringFields = ( + source: T, + keys: readonly (keyof T)[] +): T | undefined | null => { + let out: Partial | null = null + let mutated = false + let kept = 0 + let originalKeyCount = 0 + + for (const key of Object.keys(source) as (keyof T)[]) { + const v = source[key] + if (v !== undefined) originalKeyCount++ + } + + for (const key of keys) { + const value = source[key] + if (typeof value !== 'string') { + if (value !== undefined) mutated = true + continue + } + const trimmed = value.trim() + if (!trimmed) { + mutated = true + continue + } + if (trimmed !== value) mutated = true + if (out === null) out = {} + out[key] = trimmed as T[keyof T] + kept++ + } + + if (!mutated && kept === originalKeyCount) return null + return out ? (compact(out) as T | undefined) : undefined +} + +const sanitizeColor = (value: DynamicColor) => + trimStringFields(value, DYNAMIC_COLOR_KEYS) -const sanitizeAnimations = ( - value: BrowserAnimations -): BrowserAnimations | undefined => - compact(trimStringFields(value, ANIMATION_KEYS)) +const sanitizeAnimations = (value: BrowserAnimations) => + trimStringFields(value, ANIMATION_KEYS) const sanitizeHeaders = ( headers: Record -): Record | undefined => { - const out: Record = {} +): Record | undefined | null => { + let out: Record | null = null + let mutated = false + for (const key of Object.keys(headers)) { const value = headers[key] - if (typeof value !== 'string') continue + if (typeof value !== 'string') { + mutated = true + continue + } const normalizedKey = key.trim() - if (!normalizedKey) continue + if (!normalizedKey) { + mutated = true + continue + } + if (normalizedKey !== key) mutated = true + if (out === null) out = {} out[normalizedKey] = value } - return compact(out) + + if (!mutated) return null + return out ? compact(out) : undefined } -/** - * Per-key normalizers. Each handler receives the raw value and returns the - * sanitized value, or `undefined` to omit the field entirely. - */ -type Normalizer = ( - value: NonNullable -) => InAppBrowserOptions[K] +type Sanitizer = (value: V) => V | undefined | null -type NormalizerMap = { - [K in keyof InAppBrowserOptions]?: Normalizer +type SanitizerMap = { + [K in keyof InAppBrowserOptions]?: Sanitizer< + NonNullable + > } -const NORMALIZERS: NormalizerMap = { +const SANITIZERS: SanitizerMap = { preferredBarTintColor: sanitizeColor, preferredControlTintColor: sanitizeColor, toolbarColor: sanitizeColor, @@ -95,27 +120,52 @@ const NORMALIZERS: NormalizerMap = { * Remove `undefined`/`null` entries and sanitize nested values before the * options object is bridged to the native hybrid module. * - * Fast path: when no options are supplied, returns `undefined` without any - * allocations. + * Fast paths (zero allocations): + * - When no options are supplied, returns `undefined`. + * - When every field is already clean, returns the original `options` reference + * so consumers passing a stable object incur no GC churn per call. */ export const normalizeOptions = ( options?: InAppBrowserOptions ): InAppBrowserOptions | undefined => { if (!options) return undefined + // Fast first pass: detect whether anything needs to change. + let dirty = false + const keys = Object.keys(options) + + for (const key of keys) { + const typedKey = key as keyof InAppBrowserOptions & string + const value = options[typedKey] + if (value === undefined || value === null) { + dirty = true + break + } + const sanitizer = SANITIZERS[typedKey] as Sanitizer | undefined + if (sanitizer && sanitizer(value) !== null) { + dirty = true + break + } + } + + if (!dirty) return options + + // Slow path: build a new object with sanitized values. const out: InAppBrowserOptions = {} - for (const key of Object.keys(options)) { - const typedKey = key as keyof InAppBrowserOptions + for (const key of keys) { + const typedKey = key as keyof InAppBrowserOptions & string const value = options[typedKey] if (value === undefined || value === null) continue - const normalizer = NORMALIZERS[typedKey] as - | ((v: unknown) => unknown) - | undefined - const next = normalizer ? normalizer(value) : value - if (next === undefined) continue + const sanitizer = SANITIZERS[typedKey] as Sanitizer | undefined + if (!sanitizer) { + ;(out as Record)[typedKey] = value + continue + } - // Per-key correctness is guaranteed by the typed `NORMALIZERS` map above. + const sanitized = sanitizer(value) + const next = sanitized === null ? value : sanitized + if (next === undefined) continue ;(out as Record)[typedKey] = next } diff --git a/tsconfig.json b/tsconfig.json index c3cc131..79e3cf8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,8 +25,6 @@ "exclude": [ "**/node_modules", "**/lib", - "**/.eslintrc.js", - "**/.prettierrc.js", "**/jest.config.js", "**/babel.config.js", "**/metro.config.js", diff --git a/yarn.lock b/yarn.lock index 9cf9f26..0262b34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,16 +5,6 @@ __metadata: version: 8 cacheKey: 10c0 -"@actions/core@npm:^1.10.0": - version: 1.11.1 - resolution: "@actions/core@npm:1.11.1" - dependencies: - "@actions/exec": "npm:^1.1.1" - "@actions/http-client": "npm:^2.0.1" - checksum: 10c0/9aa30b397d8d0dbc74e69fe46b23fb105cab989beb420c57eacbfc51c6804abe8da0f46973ca9f639d532ea4c096d0f4d37da0223fbe94f304fa3c5f53537c30 - languageName: node - linkType: hard - "@actions/core@npm:^3.0.0": version: 3.0.1 resolution: "@actions/core@npm:3.0.1" @@ -25,15 +15,6 @@ __metadata: languageName: node linkType: hard -"@actions/exec@npm:^1.1.1": - version: 1.1.1 - resolution: "@actions/exec@npm:1.1.1" - dependencies: - "@actions/io": "npm:^1.0.1" - checksum: 10c0/4a09f6bdbe50ce68b5cf8a7254d176230d6a74bccf6ecc3857feee209a8c950ba9adec87cc5ecceb04110182d1c17117234e45557d72fde6229b7fd3a395322a - languageName: node - linkType: hard - "@actions/exec@npm:^3.0.0": version: 3.0.0 resolution: "@actions/exec@npm:3.0.0" @@ -43,16 +24,6 @@ __metadata: languageName: node linkType: hard -"@actions/http-client@npm:^2.0.1": - version: 2.2.3 - resolution: "@actions/http-client@npm:2.2.3" - dependencies: - tunnel: "npm:^0.0.6" - undici: "npm:^5.25.4" - checksum: 10c0/13141b66a42aa4afd8c50f7479e13a5cdb5084ccb3c73ec48894b8029743389a3d2bf8cdc18e23fb70cd33995740526dd308815613907571e897c3aa1e5eada6 - languageName: node - linkType: hard - "@actions/http-client@npm:^4.0.0": version: 4.0.1 resolution: "@actions/http-client@npm:4.0.1" @@ -63,13 +34,6 @@ __metadata: languageName: node linkType: hard -"@actions/io@npm:^1.0.1": - version: 1.1.3 - resolution: "@actions/io@npm:1.1.3" - checksum: 10c0/5b8751918e5bf0bebd923ba917fb1c0e294401e7ff0037f32c92a4efa4215550df1f6633c63fd4efb2bdaae8711e69b9e36925857db1f38935ff62a5c92ec29e - languageName: node - linkType: hard - "@actions/io@npm:^3.0.2": version: 3.0.2 resolution: "@actions/io@npm:3.0.2" @@ -111,7 +75,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.29.0": +"@babel/core@npm:^7.25.2, @babel/core@npm:^7.29.0": version: 7.29.0 resolution: "@babel/core@npm:7.29.0" dependencies: @@ -134,20 +98,6 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.25.1": - version: 7.28.6 - resolution: "@babel/eslint-parser@npm:7.28.6" - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" - eslint-visitor-keys: "npm:^2.1.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/58a85f67a056ba8389978c4654b690b890a6dcd19aa9655c5d7d9349a0c25f124cabad8a190b6bf7045a063aeee1b8e2ab23cfe4d8fa0e0517716a8b70e758bc - languageName: node - linkType: hard - "@babel/generator@npm:^7.29.0, @babel/generator@npm:^7.29.1": version: 7.29.1 resolution: "@babel/generator@npm:7.29.1" @@ -362,7 +312,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.24.4, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": +"@babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.2 resolution: "@babel/parser@npm:7.29.2" dependencies: @@ -1446,7 +1396,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.26.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" dependencies: @@ -1554,31 +1504,6 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.9.1": - version: 4.9.1 - resolution: "@eslint-community/eslint-utils@npm:4.9.1" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/dc4ab5e3e364ef27e33666b11f4b86e1a6c1d7cbf16f0c6ff87b1619b3562335e9201a3d6ce806221887ff780ec9d828962a290bb910759fd40a674686503f02 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.12.2": - version: 4.12.2 - resolution: "@eslint-community/regexpp@npm:4.12.2" - checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d - languageName: node - linkType: hard - -"@fastify/busboy@npm:^2.0.0": - version: 2.1.1 - resolution: "@fastify/busboy@npm:2.1.1" - checksum: 10c0/6f8027a8cba7f8f7b736718b013f5a38c0476eea67034c94a0d3c375e2b114366ad4419e6a6fa7ffc2ef9c6d3e0435d76dd584a7a1cbac23962fda7650b579e3 - languageName: node - linkType: hard - "@gar/promise-retry@npm:^1.0.0, @gar/promise-retry@npm:^1.0.2": version: 1.0.3 resolution: "@gar/promise-retry@npm:1.0.3" @@ -1625,15 +1550,6 @@ __metadata: languageName: node linkType: hard -"@jamesacarr/eslint-formatter-github-actions@npm:^0.2.0": - version: 0.2.0 - resolution: "@jamesacarr/eslint-formatter-github-actions@npm:0.2.0" - dependencies: - "@actions/core": "npm:^1.10.0" - checksum: 10c0/601a5b8bf86a680378de9363444e7a472b182b7a813845945d7c263ecbe086a1544abf431134307bd422da56df007cfa5c40cf5dfa2b86be07655fa8c9ec6649 - languageName: node - linkType: hard - "@jest/diff-sequences@npm:30.3.0": version: 30.3.0 resolution: "@jest/diff-sequences@npm:30.3.0" @@ -1768,15 +1684,6 @@ __metadata: languageName: node linkType: hard -"@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": - version: 5.1.1-v1 - resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" - dependencies: - eslint-scope: "npm:5.1.1" - checksum: 10c0/75dda3e623b8ad7369ca22552d6beee337a814b2d0e8a32d23edd13fcb65c8082b32c5d86e436f3860dd7ade30d91d5db55d4ef9a08fb5a976c718ecc0d88a74 - languageName: node - linkType: hard - "@nodable/entities@npm:^2.1.0": version: 2.1.0 resolution: "@nodable/entities@npm:2.1.0" @@ -2475,36 +2382,6 @@ __metadata: languageName: node linkType: hard -"@react-native/eslint-config@npm:0.85.2": - version: 0.85.2 - resolution: "@react-native/eslint-config@npm:0.85.2" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/eslint-parser": "npm:^7.25.1" - "@react-native/eslint-plugin": "npm:0.85.2" - "@typescript-eslint/eslint-plugin": "npm:^8.36.0" - "@typescript-eslint/parser": "npm:^8.36.0" - eslint-config-prettier: "npm:^8.5.0" - eslint-plugin-eslint-comments: "npm:^3.2.0" - eslint-plugin-ft-flow: "npm:^2.0.1" - eslint-plugin-jest: "npm:^29.0.1" - eslint-plugin-react: "npm:^7.37.5" - eslint-plugin-react-hooks: "npm:^7.0.1" - eslint-plugin-react-native: "npm:^5.0.0" - peerDependencies: - eslint: ^8.0.0 || ^9.0.0 - prettier: ">=2" - checksum: 10c0/ad8f4e699650e81a4e8fe234aa74c5d9447747e68e83d0a635db44154e7b6ad6a7db4ffb07d2c7e0356d30cfd164f707fd5a94557f7582846de1e89e1877ae4e - languageName: node - linkType: hard - -"@react-native/eslint-plugin@npm:0.85.2": - version: 0.85.2 - resolution: "@react-native/eslint-plugin@npm:0.85.2" - checksum: 10c0/86b7e5e5cd948f31312a0949979e8f6a0188ef42ca038c4e6949d0896e728c4fcf4469cce84d74384345ac5f911a5d6cf59849e2a1ab0c1d63849ab78633d3ef - languageName: node - linkType: hard - "@react-native/gradle-plugin@npm:0.85.2": version: 0.85.2 resolution: "@react-native/gradle-plugin@npm:0.85.2" @@ -2967,141 +2844,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^8.36.0": - version: 8.59.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.59.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.12.2" - "@typescript-eslint/scope-manager": "npm:8.59.0" - "@typescript-eslint/type-utils": "npm:8.59.0" - "@typescript-eslint/utils": "npm:8.59.0" - "@typescript-eslint/visitor-keys": "npm:8.59.0" - ignore: "npm:^7.0.5" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.5.0" - peerDependencies: - "@typescript-eslint/parser": ^8.59.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/f98171ecad6a5106fe978df155f4b65a72dfdadfcd663651b633b61480b543e74796baa224a1393e323f9514901604fe6302323c4b80b79f7a98512a01bc6461 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^8.36.0": - version: 8.59.0 - resolution: "@typescript-eslint/parser@npm:8.59.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.59.0" - "@typescript-eslint/types": "npm:8.59.0" - "@typescript-eslint/typescript-estree": "npm:8.59.0" - "@typescript-eslint/visitor-keys": "npm:8.59.0" - debug: "npm:^4.4.3" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/996a7b43f8a515ebbd06455c9f53065c561c8519bc4f634d6783b92832aa69e47945478d1601a87582f9f7b303becc172d5d7f776e201b2a2d375bc762ad4015 - languageName: node - linkType: hard - -"@typescript-eslint/project-service@npm:8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/project-service@npm:8.59.0" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.59.0" - "@typescript-eslint/types": "npm:^8.59.0" - debug: "npm:^4.4.3" - peerDependencies: - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/ffba9595a427235bbeb0e5c7db3486f8d01dd8f8686964b4f82084e82008c49b897d01c4d331f33a9ce29edae70a9286f6fdedec4bf9037d732d9c9e86ebc7ea - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/scope-manager@npm:8.59.0" - dependencies: - "@typescript-eslint/types": "npm:8.59.0" - "@typescript-eslint/visitor-keys": "npm:8.59.0" - checksum: 10c0/d372f08be190d01e6d237932dc0d77808a9dc0a34fe8f690a3eac496d6e2f93c030c6ccb5000b35e825a6cfc4d9ca69a00f2ccda334115a9865a9d02cd603e52 - languageName: node - linkType: hard - -"@typescript-eslint/tsconfig-utils@npm:8.59.0, @typescript-eslint/tsconfig-utils@npm:^8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.59.0" - peerDependencies: - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/ab482c22f23774d24b3048c9fcdc5e0b94137064b3af901f4b0327da2270c2b2961c19165ccf8bdeaedfa83138be98c5cd8edcdc89deb6187baf6438cd8584b0 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/type-utils@npm:8.59.0" - dependencies: - "@typescript-eslint/types": "npm:8.59.0" - "@typescript-eslint/typescript-estree": "npm:8.59.0" - "@typescript-eslint/utils": "npm:8.59.0" - debug: "npm:^4.4.3" - ts-api-utils: "npm:^2.5.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/e2f2176a9bce81c19b53accf4e9189c60b1b84717cf129a6d003a2271019e30d410d2ccdc0fc6a37cbb8274a1b297d7d30a116189110f9d24a86391ee24a9fef - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.59.0, @typescript-eslint/types@npm:^8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/types@npm:8.59.0" - checksum: 10c0/2750b1e21290dffe90a424fe05c2bab701f60a7b51b5e0921ed14bb1a5fc29ff3fe8f286817d2287e93ff78e33e6626f6ce26d0bc79a729bd608deda77a9bdde - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.59.0" - dependencies: - "@typescript-eslint/project-service": "npm:8.59.0" - "@typescript-eslint/tsconfig-utils": "npm:8.59.0" - "@typescript-eslint/types": "npm:8.59.0" - "@typescript-eslint/visitor-keys": "npm:8.59.0" - debug: "npm:^4.4.3" - minimatch: "npm:^10.2.2" - semver: "npm:^7.7.3" - tinyglobby: "npm:^0.2.15" - ts-api-utils: "npm:^2.5.0" - peerDependencies: - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/82d3dfb4de591d9a39d2c4dafc13f14b4940f5b116fb3db311935137aa7e34c9dce3209aaeace118070847b2355df7c185ff1e0f2a36232c3aea9b5fa2652f98 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.59.0, @typescript-eslint/utils@npm:^8.0.0": - version: 8.59.0 - resolution: "@typescript-eslint/utils@npm:8.59.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.9.1" - "@typescript-eslint/scope-manager": "npm:8.59.0" - "@typescript-eslint/types": "npm:8.59.0" - "@typescript-eslint/typescript-estree": "npm:8.59.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/eca4e5a18ae8e8c4360b05758fa142465daef3a9dffe4d78b15607b4680698eece96f899bce1e8d83427da74ddfbca80a95456727b8b9239816528978180b047 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.59.0": - version: 8.59.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.59.0" - dependencies: - "@typescript-eslint/types": "npm:8.59.0" - eslint-visitor-keys: "npm:^5.0.0" - checksum: 10c0/09ec24c9c9d0a3ccb57bb2ab3dfd8deca124339aba6621503285c22765a4dfc89bf3d31e337dd647b1cdf89bac384e3a62e0f5b8c1d5a93d16d1f417144e3226 - languageName: node - linkType: hard - "@vscode/sudo-prompt@npm:^9.0.0": version: 9.3.2 resolution: "@vscode/sudo-prompt@npm:9.3.2" @@ -3254,7 +2996,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.2.1": +"ansi-styles@npm:^6.2.1, ansi-styles@npm:^6.2.3": version: 6.2.3 resolution: "ansi-styles@npm:6.2.3" checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 @@ -3323,16 +3065,6 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "array-buffer-byte-length@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - is-array-buffer: "npm:^3.0.5" - checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d - languageName: node - linkType: hard - "array-ify@npm:^1.0.0": version: 1.0.0 resolution: "array-ify@npm:1.0.0" @@ -3340,88 +3072,6 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": - version: 3.1.9 - resolution: "array-includes@npm:3.1.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.24.0" - es-object-atoms: "npm:^1.1.1" - get-intrinsic: "npm:^1.3.0" - is-string: "npm:^1.1.1" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856 - languageName: node - linkType: hard - -"array.prototype.findlast@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.findlast@npm:1.2.5" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.1": - version: 1.3.3 - resolution: "array.prototype.flat@npm:1.3.3" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:^1.3.3": - version: 1.3.3 - resolution: "array.prototype.flatmap@npm:1.3.3" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 - languageName: node - linkType: hard - -"array.prototype.tosorted@npm:^1.1.4": - version: 1.1.4 - resolution: "array.prototype.tosorted@npm:1.1.4" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.3" - es-errors: "npm:^1.3.0" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.4": - version: 1.0.4 - resolution: "arraybuffer.prototype.slice@npm:1.0.4" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 - languageName: node - linkType: hard - "asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" @@ -3457,15 +3107,6 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 - languageName: node - linkType: hard - "babel-plugin-module-resolver@npm:^5.0.3": version: 5.0.3 resolution: "babel-plugin-module-resolver@npm:5.0.3" @@ -3527,6 +3168,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-react-compiler@npm:^19.1.0-rc.3": + version: 19.1.0-rc.3 + resolution: "babel-plugin-react-compiler@npm:19.1.0-rc.3" + dependencies: + "@babel/types": "npm:^7.26.0" + checksum: 10c0/6811500cf81a309f104ec1de3fa9336932a1105e3c0e747b81a1d12e80c2cd4f531f7c42ec4441f96527ee20e19342af58d958241061d47a02b0d8bee66fbe35 + languageName: node + linkType: hard + "babel-plugin-syntax-hermes-parser@npm:0.33.3": version: 0.33.3 resolution: "babel-plugin-syntax-hermes-parser@npm:0.33.3" @@ -3646,16 +3296,6 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^1.1.7": - version: 1.1.14 - resolution: "brace-expansion@npm:1.1.14" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/b6fdac832bc4e36a753658c9ed052c2e1a2be221763b002df25d1efbf7d21724334e726a6cd5eadc72a4b19ec3efb632d629cc003bc9c62f7af7a7915ffa4385 - languageName: node - linkType: hard - "brace-expansion@npm:^2.0.1": version: 2.1.0 resolution: "brace-expansion@npm:2.1.0" @@ -3759,19 +3399,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:^1.0.9": - version: 1.0.9 - resolution: "call-bind@npm:1.0.9" - dependencies: - call-bind-apply-helpers: "npm:^1.0.2" - es-define-property: "npm:^1.0.1" - get-intrinsic: "npm:^1.3.0" - set-function-length: "npm:^1.2.2" - checksum: 10c0/a6621f6da1444481919ce3b4983dff725691e0754d3507ae483ce56e54985f2da7d6f1df512c56dbf28660745cf1ca52553f1fc9aef5557f3ce353ef14fab714 - languageName: node - linkType: hard - -"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": +"call-bound@npm:^1.0.2": version: 1.0.4 resolution: "call-bound@npm:1.0.4" dependencies: @@ -3931,6 +3559,15 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^5.0.0": + version: 5.0.0 + resolution: "cli-cursor@npm:5.0.0" + dependencies: + restore-cursor: "npm:^5.0.0" + checksum: 10c0/7ec62f69b79f6734ab209a3e4dbdc8af7422d44d360a7cb1efa8a0887bbe466a6e625650c466fe4359aee44dbe2dc0b6994b583d40a05d0808a5cb193641d220 + languageName: node + linkType: hard + "cli-highlight@npm:^2.1.11": version: 2.1.11 resolution: "cli-highlight@npm:2.1.11" @@ -3967,6 +3604,16 @@ __metadata: languageName: node linkType: hard +"cli-truncate@npm:^5.0.0": + version: 5.2.0 + resolution: "cli-truncate@npm:5.2.0" + dependencies: + slice-ansi: "npm:^8.0.0" + string-width: "npm:^8.2.0" + checksum: 10c0/0d4ec94702ca85b64522ac93633837fb5ea7db17b79b1322a60f6045e6ae2b8cd7bd4c1d19ac7d1f9e10e3bbda1112e172e439b68c02b785ee00da8d6a5c5471 + languageName: node + linkType: hard + "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -4071,6 +3718,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.20": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + "command-exists@npm:^1.2.8": version: 1.2.9 resolution: "command-exists@npm:1.2.9" @@ -4085,6 +3739,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^14.0.3": + version: 14.0.3 + resolution: "commander@npm:14.0.3" + checksum: 10c0/755652564bbf56ff2ff083313912b326450d3f8d8c85f4b71416539c9a05c3c67dbd206821ca72635bf6b160e2afdefcb458e86b317827d5cb333b69ce7f1a24 + languageName: node + linkType: hard + "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -4140,13 +3801,6 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -4311,39 +3965,6 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "data-view-buffer@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.2" - checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c - languageName: node - linkType: hard - -"data-view-byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "data-view-byte-length@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.2" - checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 - languageName: node - linkType: hard - -"data-view-byte-offset@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-offset@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 - languageName: node - linkType: hard - "dayjs@npm:^1.8.15": version: 1.11.20 resolution: "dayjs@npm:1.11.20" @@ -4414,28 +4035,6 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - "del@npm:^8.0.1": version: 8.0.1 resolution: "del@npm:8.0.1" @@ -4481,15 +4080,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac - languageName: node - linkType: hard - "dot-prop@npm:^5.1.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" @@ -4499,7 +4089,7 @@ __metadata: languageName: node linkType: hard -"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": +"dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" dependencies: @@ -4638,69 +4228,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.2": - version: 1.24.2 - resolution: "es-abstract@npm:1.24.2" - dependencies: - array-buffer-byte-length: "npm:^1.0.2" - arraybuffer.prototype.slice: "npm:^1.0.4" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - data-view-buffer: "npm:^1.0.2" - data-view-byte-length: "npm:^1.0.2" - data-view-byte-offset: "npm:^1.0.1" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - es-set-tostringtag: "npm:^2.1.0" - es-to-primitive: "npm:^1.3.0" - function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.3.0" - get-proto: "npm:^1.0.1" - get-symbol-description: "npm:^1.1.0" - globalthis: "npm:^1.0.4" - gopd: "npm:^1.2.0" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.1.0" - is-array-buffer: "npm:^3.0.5" - is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.2" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.2.1" - is-set: "npm:^2.0.3" - is-shared-array-buffer: "npm:^1.0.4" - is-string: "npm:^1.1.1" - is-typed-array: "npm:^1.1.15" - is-weakref: "npm:^1.1.1" - math-intrinsics: "npm:^1.1.0" - object-inspect: "npm:^1.13.4" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.7" - own-keys: "npm:^1.0.1" - regexp.prototype.flags: "npm:^1.5.4" - safe-array-concat: "npm:^1.1.3" - safe-push-apply: "npm:^1.0.0" - safe-regex-test: "npm:^1.1.0" - set-proto: "npm:^1.0.0" - stop-iteration-iterator: "npm:^1.1.0" - string.prototype.trim: "npm:^1.2.10" - string.prototype.trimend: "npm:^1.0.9" - string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.3" - typed-array-byte-length: "npm:^1.0.3" - typed-array-byte-offset: "npm:^1.0.4" - typed-array-length: "npm:^1.0.7" - unbox-primitive: "npm:^1.1.0" - which-typed-array: "npm:^1.1.19" - checksum: 10c0/67a5bf21ef5c7d775e6f6131a836323900b4d87194cf544394ac68fe31c57fa53828b978af4a4f551ef307f83a2f910a16b6b982760ad3ddc3dc471f98d5fd1b - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": +"es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c @@ -4714,30 +4242,6 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.2.1": - version: 1.3.2 - resolution: "es-iterator-helpers@npm:1.3.2" - dependencies: - call-bind: "npm:^1.0.9" - call-bound: "npm:^1.0.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.24.2" - es-errors: "npm:^1.3.0" - es-set-tostringtag: "npm:^2.1.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.3.0" - globalthis: "npm:^1.0.4" - gopd: "npm:^1.2.0" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - internal-slot: "npm:^1.1.0" - iterator.prototype: "npm:^1.1.5" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/5ddf9e7a7c5052d02cd8eb18f75e160c628eea66862ccd22f0fee7a7b1d2d17565c7ccf183f8b52aa88470d55394d1022012bc4eb8f8ae65a22b36e0b3bef83a - languageName: node - linkType: hard - "es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": version: 1.1.1 resolution: "es-object-atoms@npm:1.1.1" @@ -4747,42 +4251,10 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.0.2": - version: 1.1.0 - resolution: "es-shim-unscopables@npm:1.1.0" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.3.0": - version: 1.3.0 - resolution: "es-to-primitive@npm:1.3.0" - dependencies: - is-callable: "npm:^1.2.7" - is-date-object: "npm:^1.0.5" - is-symbol: "npm:^1.0.4" - checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 languageName: node linkType: hard @@ -4821,178 +4293,6 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^8.5.0": - version: 8.10.2 - resolution: "eslint-config-prettier@npm:8.10.2" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 10c0/b5953cf7a86f685e1218b16707bf36643b525513d08495226a6820caccd8b7bfc6b9aa64ac7cb2415dbe2c1f7dc4995832148bdc53ad45777f75a8ded1073b29 - languageName: node - linkType: hard - -"eslint-plugin-eslint-comments@npm:^3.2.0": - version: 3.2.0 - resolution: "eslint-plugin-eslint-comments@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - ignore: "npm:^5.0.5" - peerDependencies: - eslint: ">=4.19.1" - checksum: 10c0/c71db824592dc8ea498021572a0bd33d763ef26126bdb3b84a027ca75a1adbe0894ec95024f7de39ef12308560e62cbf8af0d06ffe472be5ba8bd9169c928e96 - languageName: node - linkType: hard - -"eslint-plugin-ft-flow@npm:^2.0.1": - version: 2.0.3 - resolution: "eslint-plugin-ft-flow@npm:2.0.3" - dependencies: - lodash: "npm:^4.17.21" - string-natural-compare: "npm:^3.0.1" - peerDependencies: - "@babel/eslint-parser": ^7.12.0 - eslint: ^8.1.0 - checksum: 10c0/171f6862f7be3c66a415c2ebf14a6e29ade78b661a16f344b78fbefeaeed97fc7f2c710c0d3a2c2df2bbb614b282eaef830993c2aac83b13324cd8c2f9497ea6 - languageName: node - linkType: hard - -"eslint-plugin-jest@npm:^29.0.1": - version: 29.15.2 - resolution: "eslint-plugin-jest@npm:29.15.2" - dependencies: - "@typescript-eslint/utils": "npm:^8.0.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - jest: "*" - typescript: ">=4.8.4 <7.0.0" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - typescript: - optional: true - checksum: 10c0/be8d59b0d4c1ff1afd5294b227cdd190a3a7741fb28f8092d359eda1010cb87ef61c3db6c0a794e9612f745ae008c4d53ee78754d8faf87a22a823b71c9b14e4 - languageName: node - linkType: hard - -"eslint-plugin-react-hooks@npm:^7.0.1": - version: 7.1.1 - resolution: "eslint-plugin-react-hooks@npm:7.1.1" - dependencies: - "@babel/core": "npm:^7.24.4" - "@babel/parser": "npm:^7.24.4" - hermes-parser: "npm:^0.25.1" - zod: "npm:^3.25.0 || ^4.0.0" - zod-validation-error: "npm:^3.5.0 || ^4.0.0" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 - checksum: 10c0/cee8454915d71ac5d70a0d8f4f260e76eaf45fcd4162747dd4282b792ee5616d187351dabe6cdcff9040c79d0cec625635c4fd0777276be119efa88ebe058525 - languageName: node - linkType: hard - -"eslint-plugin-react-native-globals@npm:^0.1.1": - version: 0.1.2 - resolution: "eslint-plugin-react-native-globals@npm:0.1.2" - checksum: 10c0/ddb4ec5e31f6e72a66d51218c8f0b558b5366d614598fbec1833ac529db2c2dc1724c7ed71c1fcf922251b8438634f704d265c9bedf51aecfe807ec4a0403c09 - languageName: node - linkType: hard - -"eslint-plugin-react-native@npm:^5.0.0": - version: 5.0.0 - resolution: "eslint-plugin-react-native@npm:5.0.0" - dependencies: - eslint-plugin-react-native-globals: "npm:^0.1.1" - peerDependencies: - eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - checksum: 10c0/c7c927bc743abf0cb367cc64fea5b28b28ea0c58be2990cab858a050b4855e89d90513afa44d73012c9fd670810ad0da2ac72e3e4bdfedf0ce0cbb65e901af7f - languageName: node - linkType: hard - -"eslint-plugin-react@npm:^7.37.5": - version: 7.37.5 - resolution: "eslint-plugin-react@npm:7.37.5" - dependencies: - array-includes: "npm:^3.1.8" - array.prototype.findlast: "npm:^1.2.5" - array.prototype.flatmap: "npm:^1.3.3" - array.prototype.tosorted: "npm:^1.1.4" - doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.2.1" - estraverse: "npm:^5.3.0" - hasown: "npm:^2.0.2" - jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" - minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.9" - object.fromentries: "npm:^2.0.8" - object.values: "npm:^1.2.1" - prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.5" - semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.12" - string.prototype.repeat: "npm:^1.0.0" - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 10c0/c850bfd556291d4d9234f5ca38db1436924a1013627c8ab1853f77cac73ec19b020e861e6c7b783436a48b6ffcdfba4547598235a37ad4611b6739f65fd8ad57 - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.1.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: 10c0/9f0e3a2db751d84067d15977ac4b4472efd6b303e369e6ff241a99feac04da758f46d5add022c33d06b53596038dbae4b4aceb27c7e68b8dfc1055b35e495787 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^5.0.0": - version: 5.0.1 - resolution: "eslint-visitor-keys@npm:5.0.1" - checksum: 10c0/16190bdf2cbae40a1109384c94450c526a79b0b9c3cb21e544256ed85ac48a4b84db66b74a6561d20fe6ab77447f150d711c2ad5ad74df4fcc133736bce99678 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -5014,6 +4314,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^5.0.1": + version: 5.0.4 + resolution: "eventemitter3@npm:5.0.4" + checksum: 10c0/575b8cac8d709e1473da46f8f15ef311b57ff7609445a7c71af5cd42598583eee6f098fa7a593e30f27e94b8865642baa0689e8fa97c016f742abdb3b1bf6d9a + languageName: node + linkType: hard + "execa@npm:^4.0.3": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -5308,15 +4615,6 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3, for-each@npm:^0.3.5": - version: 0.3.5 - resolution: "for-each@npm:0.3.5" - dependencies: - is-callable: "npm:^1.2.7" - checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee - languageName: node - linkType: hard - "fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -5386,27 +4684,6 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": - version: 1.1.8 - resolution: "function.prototype.name@npm:1.1.8" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - functions-have-names: "npm:^1.2.3" - hasown: "npm:^2.0.2" - is-callable: "npm:^1.2.7" - checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca - languageName: node - linkType: hard - "generator-function@npm:^2.0.0": version: 2.0.1 resolution: "generator-function@npm:2.0.1" @@ -5428,14 +4705,14 @@ __metadata: languageName: node linkType: hard -"get-east-asian-width@npm:^1.0.0": +"get-east-asian-width@npm:^1.0.0, get-east-asian-width@npm:^1.3.1, get-east-asian-width@npm:^1.5.0": version: 1.5.0 resolution: "get-east-asian-width@npm:1.5.0" checksum: 10c0/bff8bbc8d81790b9477f7aa55b1806b9f082a8dc1359fff7bd8b96939622c86b729685afc2bfeb22def1fc6ef1e5228e4d87dd4e6da60bc43a5edfb03c4ee167 languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" dependencies: @@ -5456,7 +4733,7 @@ __metadata: languageName: node linkType: hard -"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": +"get-proto@npm:^1.0.1": version: 1.0.1 resolution: "get-proto@npm:1.0.1" dependencies: @@ -5506,17 +4783,6 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.1.0": - version: 1.1.0 - resolution: "get-symbol-description@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b - languageName: node - linkType: hard - "git-log-parser@npm:^1.2.0": version: 1.2.1 resolution: "git-log-parser@npm:1.2.1" @@ -5563,16 +4829,6 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.4": - version: 1.0.4 - resolution: "globalthis@npm:1.0.4" - dependencies: - define-properties: "npm:^1.2.1" - gopd: "npm:^1.0.1" - checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 - languageName: node - linkType: hard - "globby@npm:^14.0.2": version: 14.1.0 resolution: "globby@npm:14.1.0" @@ -5587,7 +4843,7 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1, gopd@npm:^1.2.0": +"gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead @@ -5626,13 +4882,6 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.2": - version: 1.1.0 - resolution: "has-bigints@npm:1.1.0" - checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -5647,40 +4896,13 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.2.0": - version: 1.2.0 - resolution: "has-proto@npm:1.2.0" - dependencies: - dunder-proto: "npm:^1.0.0" - checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": +"has-symbols@npm:^1.1.0": version: 1.1.0 resolution: "has-symbols@npm:1.1.0" checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e languageName: node linkType: hard -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - "hasown@npm:^2.0.2": version: 2.0.3 resolution: "hasown@npm:2.0.3" @@ -5697,13 +4919,6 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.25.1": - version: 0.25.1 - resolution: "hermes-estree@npm:0.25.1" - checksum: 10c0/48be3b2fa37a0cbc77a112a89096fa212f25d06de92781b163d67853d210a8a5c3784fac23d7d48335058f7ed283115c87b4332c2a2abaaccc76d0ead1a282ac - languageName: node - linkType: hard - "hermes-estree@npm:0.33.3": version: 0.33.3 resolution: "hermes-estree@npm:0.33.3" @@ -5752,15 +4967,6 @@ __metadata: languageName: node linkType: hard -"hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "hermes-parser@npm:0.25.1" - dependencies: - hermes-estree: "npm:0.25.1" - checksum: 10c0/3abaa4c6f1bcc25273f267297a89a4904963ea29af19b8e4f6eabe04f1c2c7e9abd7bfc4730ddb1d58f2ea04b6fee74053d8bddb5656ec6ebf6c79cc8d14202c - languageName: node - linkType: hard - "highlight.js@npm:^10.7.1": version: 10.7.3 resolution: "highlight.js@npm:10.7.3" @@ -5861,6 +5067,15 @@ __metadata: languageName: node linkType: hard +"husky@npm:^9.1.7": + version: 9.1.7 + resolution: "husky@npm:9.1.7" + bin: + husky: bin.js + checksum: 10c0/35bb110a71086c48906aa7cd3ed4913fb913823715359d65e32e0b964cb1e255593b0ae8014a5005c66a68e6fa66c38dcfa8056dbbdfb8b0187c0ffe7ee3a58f + languageName: node + linkType: hard + "iconv-lite@npm:^0.7.0, iconv-lite@npm:^0.7.2, iconv-lite@npm:~0.7.0": version: 0.7.2 resolution: "iconv-lite@npm:0.7.2" @@ -5886,14 +5101,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.0.5": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 - languageName: node - linkType: hard - -"ignore@npm:^7.0.3, ignore@npm:^7.0.5": +"ignore@npm:^7.0.3": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d @@ -5994,17 +5202,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.1.0": - version: 1.1.0 - resolution: "internal-slot@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.2" - side-channel: "npm:^1.1.0" - checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 - languageName: node - linkType: hard - "into-stream@npm:^7.0.0": version: 7.0.0 resolution: "into-stream@npm:7.0.0" @@ -6041,17 +5238,6 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": - version: 3.0.5 - resolution: "is-array-buffer@npm:3.0.5" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -6059,45 +5245,6 @@ __metadata: languageName: node linkType: hard -"is-async-function@npm:^2.0.0": - version: 2.1.1 - resolution: "is-async-function@npm:2.1.1" - dependencies: - async-function: "npm:^1.0.0" - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 - languageName: node - linkType: hard - -"is-bigint@npm:^1.1.0": - version: 1.1.0 - resolution: "is-bigint@npm:1.1.0" - dependencies: - has-bigints: "npm:^1.0.2" - checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.2.1": - version: 1.2.2 - resolution: "is-boolean-object@npm:1.2.2" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e - languageName: node - linkType: hard - -"is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f - languageName: node - linkType: hard - "is-cidr@npm:^6.0.3": version: 6.0.4 resolution: "is-cidr@npm:6.0.4" @@ -6116,27 +5263,6 @@ __metadata: languageName: node linkType: hard -"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": - version: 1.0.2 - resolution: "is-data-view@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.6" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": - version: 1.1.0 - resolution: "is-date-object@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f - languageName: node - linkType: hard - "is-docker@npm:^2.0.0": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -6153,15 +5279,6 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.1.0": - version: 1.1.1 - resolution: "is-finalizationregistry@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^2.0.0": version: 2.0.0 resolution: "is-fullwidth-code-point@npm:2.0.0" @@ -6176,16 +5293,12 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10": - version: 1.1.2 - resolution: "is-generator-function@npm:1.1.2" +"is-fullwidth-code-point@npm:^5.0.0, is-fullwidth-code-point@npm:^5.1.0": + version: 5.1.0 + resolution: "is-fullwidth-code-point@npm:5.1.0" dependencies: - call-bound: "npm:^1.0.4" - generator-function: "npm:^2.0.0" - get-proto: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372 + get-east-asian-width: "npm:^1.3.1" + checksum: 10c0/c1172c2e417fb73470c56c431851681591f6a17233603a9e6f94b7ba870b2e8a5266506490573b607fb1081318589372034aa436aec07b465c2029c0bc7f07a4 languageName: node linkType: hard @@ -6225,30 +5338,6 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.3": - version: 2.0.3 - resolution: "is-map@npm:2.0.3" - checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc - languageName: node - linkType: hard - -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e - languageName: node - linkType: hard - -"is-number-object@npm:^1.1.1": - version: 1.1.1 - resolution: "is-number-object@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 - languageName: node - linkType: hard - "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -6284,18 +5373,6 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.2.1": - version: 1.2.1 - resolution: "is-regex@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 - languageName: node - linkType: hard - "is-relative@npm:^1.0.0": version: 1.0.0 resolution: "is-relative@npm:1.0.0" @@ -6305,22 +5382,6 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.3": - version: 2.0.3 - resolution: "is-set@npm:2.0.3" - checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.4": - version: 1.0.4 - resolution: "is-shared-array-buffer@npm:1.0.4" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -6342,36 +5403,6 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.1.1": - version: 1.1.1 - resolution: "is-string@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": - version: 1.1.1 - resolution: "is-symbol@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "is-typed-array@npm:1.1.15" - dependencies: - which-typed-array: "npm:^1.1.16" - checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 - languageName: node - linkType: hard - "is-unc-path@npm:^1.0.0": version: 1.0.0 resolution: "is-unc-path@npm:1.0.0" @@ -6395,32 +5426,6 @@ __metadata: languageName: node linkType: hard -"is-weakmap@npm:^2.0.2": - version: 2.0.2 - resolution: "is-weakmap@npm:2.0.2" - checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": - version: 1.1.1 - resolution: "is-weakref@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.3": - version: 2.0.4 - resolution: "is-weakset@npm:2.0.4" - dependencies: - call-bound: "npm:^1.0.3" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 - languageName: node - linkType: hard - "is-windows@npm:^1.0.1": version: 1.0.2 resolution: "is-windows@npm:1.0.2" @@ -6444,13 +5449,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd - languageName: node - linkType: hard - "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -6485,20 +5483,6 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.5": - version: 1.1.5 - resolution: "iterator.prototype@npm:1.1.5" - dependencies: - define-data-property: "npm:^1.1.4" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.6" - get-proto: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 - languageName: node - linkType: hard - "java-properties@npm:^1.0.2": version: 1.0.2 resolution: "java-properties@npm:1.0.2" @@ -6749,18 +5733,6 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": - version: 3.3.5 - resolution: "jsx-ast-utils@npm:3.3.5" - dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flat: "npm:^1.3.1" - object.assign: "npm:^4.1.4" - object.values: "npm:^1.1.6" - checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 - languageName: node - linkType: hard - "just-diff-apply@npm:^5.2.0": version: 5.5.0 resolution: "just-diff-apply@npm:5.5.0" @@ -6948,6 +5920,36 @@ __metadata: languageName: node linkType: hard +"lint-staged@npm:^16.1.2": + version: 16.4.0 + resolution: "lint-staged@npm:16.4.0" + dependencies: + commander: "npm:^14.0.3" + listr2: "npm:^9.0.5" + picomatch: "npm:^4.0.3" + string-argv: "npm:^0.3.2" + tinyexec: "npm:^1.0.4" + yaml: "npm:^2.8.2" + bin: + lint-staged: bin/lint-staged.js + checksum: 10c0/67625a49a2a01368c7df2da7e553567a79c4b261d9faf3436e00fc3a2f9c4bbe7295909012c47b3d9029e269fd7d7469901a5120573527a032f15797aa497c26 + languageName: node + linkType: hard + +"listr2@npm:^9.0.5": + version: 9.0.5 + resolution: "listr2@npm:9.0.5" + dependencies: + cli-truncate: "npm:^5.0.0" + colorette: "npm:^2.0.20" + eventemitter3: "npm:^5.0.1" + log-update: "npm:^6.1.0" + rfdc: "npm:^1.4.1" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/46448d1ba0addc9d71aeafd05bb8e86ded9641ccad930ac302c2bd2ad71580375604743e18586fcb8f11906edf98e8e17fca75ba0759947bf275d381f68e311d + languageName: node + linkType: hard + "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -7054,7 +6056,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21, lodash@npm:^4.17.4": +"lodash@npm:^4.17.4": version: 4.18.1 resolution: "lodash@npm:4.18.1" checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 @@ -7071,6 +6073,19 @@ __metadata: languageName: node linkType: hard +"log-update@npm:^6.1.0": + version: 6.1.0 + resolution: "log-update@npm:6.1.0" + dependencies: + ansi-escapes: "npm:^7.0.0" + cli-cursor: "npm:^5.0.0" + slice-ansi: "npm:^7.1.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/4b350c0a83d7753fea34dcac6cd797d1dc9603291565de009baa4aa91c0447eab0d3815a05c8ec9ac04fdfffb43c82adcdb03ec1fceafd8518e1a8c1cff4ff89 + languageName: node + linkType: hard + "logkitty@npm:^0.7.1": version: 0.7.1 resolution: "logkitty@npm:0.7.1" @@ -7084,7 +6099,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.0.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -7541,21 +6556,19 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.0.1, minimatch@npm:^10.0.3, minimatch@npm:^10.1.1, minimatch@npm:^10.2.2, minimatch@npm:^10.2.4": - version: 10.2.5 - resolution: "minimatch@npm:10.2.5" - dependencies: - brace-expansion: "npm:^5.0.5" - checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d languageName: node linkType: hard -"minimatch@npm:^3.1.2": - version: 3.1.5 - resolution: "minimatch@npm:3.1.5" +"minimatch@npm:^10.0.1, minimatch@npm:^10.0.3, minimatch@npm:^10.1.1, minimatch@npm:^10.2.2, minimatch@npm:^10.2.4": + version: 10.2.5 + resolution: "minimatch@npm:10.2.5" dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/2ecbdc0d33f07bddb0315a8b5afbcb761307a8778b48f0b312418ccbced99f104a2d17d8aca7573433c70e8ccd1c56823a441897a45e384ea76ef401a26ace70 + brace-expansion: "npm:^5.0.5" + checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd languageName: node linkType: hard @@ -7699,13 +6712,6 @@ __metadata: languageName: node linkType: hard -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 - languageName: node - linkType: hard - "negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -7775,18 +6781,6 @@ __metadata: languageName: node linkType: hard -"node-exports-info@npm:^1.6.0": - version: 1.6.0 - resolution: "node-exports-info@npm:1.6.0" - dependencies: - array.prototype.flatmap: "npm:^1.3.3" - es-errors: "npm:^1.3.0" - object.entries: "npm:^1.1.9" - semver: "npm:^6.3.1" - checksum: 10c0/3613f21c60b047e66f168d3499a6be0060d89fb01ddceaa7032c2fb318aff12e4b9b111449c1a9aeb3b848bfdc1d4b6bc8fab327af692319597d21a1e7063692 - languageName: node - linkType: hard - "node-gyp@npm:^12.1.0, node-gyp@npm:^12.2.0": version: 12.3.0 resolution: "node-gyp@npm:12.3.0" @@ -8087,7 +7081,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -8101,63 +7095,6 @@ __metadata: languageName: node linkType: hard -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": - version: 4.1.7 - resolution: "object.assign@npm:4.1.7" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc - languageName: node - linkType: hard - -"object.entries@npm:^1.1.9": - version: 1.1.9 - resolution: "object.entries@npm:1.1.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.1.1" - checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.8": - version: 2.0.8 - resolution: "object.fromentries@npm:2.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b - languageName: node - linkType: hard - -"object.values@npm:^1.1.6, object.values@npm:^1.2.1": - version: 1.2.1 - resolution: "object.values@npm:1.2.1" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 - languageName: node - linkType: hard - "on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -8210,6 +7147,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^7.0.0": + version: 7.0.0 + resolution: "onetime@npm:7.0.0" + dependencies: + mimic-function: "npm:^5.0.0" + checksum: 10c0/5cb9179d74b63f52a196a2e7037ba2b9a893245a5532d3f44360012005c9cadb60851d56716ebff18a6f47129dab7168022445df47c2aff3b276d92585ed1221 + languageName: node + linkType: hard + "open@npm:^6.2.0": version: 6.4.0 resolution: "open@npm:6.4.0" @@ -8246,17 +7192,6 @@ __metadata: languageName: node linkType: hard -"own-keys@npm:^1.0.1": - version: 1.0.1 - resolution: "own-keys@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.2.6" - object-keys: "npm:^1.1.1" - safe-push-apply: "npm:^1.0.0" - checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a - languageName: node - linkType: hard - "p-each-series@npm:^3.0.0": version: 3.0.0 resolution: "p-each-series@npm:3.0.0" @@ -8641,13 +7576,6 @@ __metadata: languageName: node linkType: hard -"possible-typed-array-names@npm:^1.0.0": - version: 1.1.0 - resolution: "possible-typed-array-names@npm:1.1.0" - checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 - languageName: node - linkType: hard - "postcss-selector-parser@npm:^7.0.0": version: 7.1.1 resolution: "postcss-selector-parser@npm:7.1.1" @@ -8759,17 +7687,6 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.8.1": - version: 15.8.1 - resolution: "prop-types@npm:15.8.1" - dependencies: - loose-envify: "npm:^1.4.0" - object-assign: "npm:^4.1.1" - react-is: "npm:^16.13.1" - checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 - languageName: node - linkType: hard - "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -8864,13 +7781,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.1": - version: 16.13.1 - resolution: "react-is@npm:16.13.1" - checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 - languageName: node - linkType: hard - "react-is@npm:^18.0.0, react-is@npm:^18.3.1": version: 18.3.1 resolution: "react-is@npm:18.3.1" @@ -8921,7 +7831,6 @@ __metadata: "@react-native-community/cli-platform-android": "npm:20.1.3" "@react-native-community/cli-platform-ios": "npm:20.1.3" "@react-native/babel-preset": "npm:0.85.2" - "@react-native/eslint-config": "npm:0.85.2" "@react-native/metro-config": "npm:0.85.2" "@react-native/new-app-screen": "npm:0.85.2" "@react-native/typescript-config": "npm:0.85.2" @@ -8939,12 +7848,14 @@ __metadata: resolution: "react-native-inappbrowser-nitro@workspace:." dependencies: "@biomejs/biome": "npm:^2.4.12" - "@jamesacarr/eslint-formatter-github-actions": "npm:^0.2.0" "@semantic-release/changelog": "npm:^6.0.3" "@semantic-release/git": "npm:^10.0.1" "@types/jest": "npm:^30.0.0" "@types/react": "npm:19.2.14" + babel-plugin-react-compiler: "npm:^19.1.0-rc.3" conventional-changelog-conventionalcommits: "npm:^9.3.1" + husky: "npm:^9.1.7" + lint-staged: "npm:^16.1.2" nitrogen: "npm:0.35.4" react: "npm:19.2.3" react-native: "npm:0.85" @@ -9144,22 +8055,6 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": - version: 1.0.10 - resolution: "reflect.getprototypeof@npm:1.0.10" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.9" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.1" - which-builtin-type: "npm:^1.2.1" - checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac - languageName: node - linkType: hard - "regenerate-unicode-properties@npm:^10.2.2": version: 10.2.2 resolution: "regenerate-unicode-properties@npm:10.2.2" @@ -9183,20 +8078,6 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": - version: 1.5.4 - resolution: "regexp.prototype.flags@npm:1.5.4" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 - languageName: node - linkType: hard - "regexpu-core@npm:^6.3.1": version: 6.4.0 resolution: "regexpu-core@npm:6.4.0" @@ -9287,22 +8168,6 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.5": - version: 2.0.0-next.6 - resolution: "resolve@npm:2.0.0-next.6" - dependencies: - es-errors: "npm:^1.3.0" - is-core-module: "npm:^2.16.1" - node-exports-info: "npm:^1.6.0" - object-keys: "npm:^1.1.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/4e44cb84aa9a3c7c82d4a98e8111879671150496160a53ca6cdbed6101bf239f19105f8b8b84e40c0b76d46b0d9626813510b19a80e01f4ae18692e9d0b47749 - languageName: node - linkType: hard - "resolve@patch:resolve@npm%3A^1.22.11#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.12 resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" @@ -9317,22 +8182,6 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": - version: 2.0.0-next.6 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.6#optional!builtin::version=2.0.0-next.6&hash=c3c19d" - dependencies: - es-errors: "npm:^1.3.0" - is-core-module: "npm:^2.16.1" - node-exports-info: "npm:^1.6.0" - object-keys: "npm:^1.1.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/dca533e38820b0d8d636f269824cef3b7435802ab7401211c6f10af03be0e2f7e216047234e1623046c0a6791577079767e0c04f0d36e42c7f567b1bff7b0742 - languageName: node - linkType: hard - "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -9343,6 +8192,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^5.0.0": + version: 5.1.0 + resolution: "restore-cursor@npm:5.1.0" + dependencies: + onetime: "npm:^7.0.0" + signal-exit: "npm:^4.1.0" + checksum: 10c0/c2ba89131eea791d1b25205bdfdc86699767e2b88dee2a590b1a6caa51737deac8bad0260a5ded2f7c074b7db2f3a626bcf1fcf3cdf35974cbeea5e2e6764f60 + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.1.0 resolution: "reusify@npm:1.1.0" @@ -9350,6 +8209,13 @@ __metadata: languageName: node linkType: hard +"rfdc@npm:^1.4.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -9359,19 +8225,6 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.1.3": - version: 1.1.4 - resolution: "safe-array-concat@npm:1.1.4" - dependencies: - call-bind: "npm:^1.0.9" - call-bound: "npm:^1.0.4" - get-intrinsic: "npm:^1.3.0" - has-symbols: "npm:^1.1.0" - isarray: "npm:^2.0.5" - checksum: 10c0/95fb4904ab1d9360a666fe5ba6d88f1c4a3a39682739e4512cff809fc6b5722a94bd95189211015bfb45859a7ffbc3340ea303ae22721c91c59e8946d310975a - languageName: node - linkType: hard - "safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -9386,27 +8239,6 @@ __metadata: languageName: node linkType: hard -"safe-push-apply@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-push-apply@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - isarray: "npm:^2.0.5" - checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-regex-test@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.2.1" - checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 - languageName: node - linkType: hard - "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -9475,7 +8307,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.7.2, semver@npm:^7.7.3, semver@npm:^7.7.4": +"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.7.2, semver@npm:^7.7.4": version: 7.7.4 resolution: "semver@npm:7.7.4" bin: @@ -9531,43 +8363,6 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.2": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"set-function-name@npm:^2.0.2": - version: 2.0.2 - resolution: "set-function-name@npm:2.0.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - functions-have-names: "npm:^1.2.3" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 - languageName: node - linkType: hard - -"set-proto@npm:^1.0.0": - version: 1.0.0 - resolution: "set-proto@npm:1.0.0" - dependencies: - dunder-proto: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a - languageName: node - linkType: hard - "setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -9726,6 +8521,26 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^7.1.0": + version: 7.1.2 + resolution: "slice-ansi@npm:7.1.2" + dependencies: + ansi-styles: "npm:^6.2.1" + is-fullwidth-code-point: "npm:^5.0.0" + checksum: 10c0/36742f2eb0c03e2e81a38ed14d13a64f7b732fe38c3faf96cce0599788a345011e840db35f1430ca606ea3f8db2abeb92a8d25c2753a819e3babaa10c2e289a2 + languageName: node + linkType: hard + +"slice-ansi@npm:^8.0.0": + version: 8.0.0 + resolution: "slice-ansi@npm:8.0.0" + dependencies: + ansi-styles: "npm:^6.2.3" + is-fullwidth-code-point: "npm:^5.1.0" + checksum: 10c0/0ce4aa91febb7cea4a00c2c27bb820fa53b6d2862ce0f80f7120134719f7914fc416b0ed966cf35250a3169e152916392f35917a2d7cad0fcc5d8b841010fa9a + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -9886,16 +8701,6 @@ __metadata: languageName: node linkType: hard -"stop-iteration-iterator@npm:^1.1.0": - version: 1.1.0 - resolution: "stop-iteration-iterator@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - internal-slot: "npm:^1.1.0" - checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 - languageName: node - linkType: hard - "stream-combiner2@npm:~1.1.1": version: 1.1.1 resolution: "stream-combiner2@npm:1.1.1" @@ -9913,10 +8718,10 @@ __metadata: languageName: node linkType: hard -"string-natural-compare@npm:^3.0.1": - version: 3.0.1 - resolution: "string-natural-compare@npm:3.0.1" - checksum: 10c0/85a6a9195736be500af5d817c7ea36b7e1ac278af079a807f70f79a56602359ee6743ca409af6291b94557de550ff60d1ec31b3c4fc8e7a08d0e12cdab57c149 +"string-argv@npm:^0.3.2": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 languageName: node linkType: hard @@ -9942,72 +8747,13 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.12": - version: 4.0.12 - resolution: "string.prototype.matchall@npm:4.0.12" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.6" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.6" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - internal-slot: "npm:^1.1.0" - regexp.prototype.flags: "npm:^1.5.3" - set-function-name: "npm:^2.0.2" - side-channel: "npm:^1.1.0" - checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c - languageName: node - linkType: hard - -"string.prototype.repeat@npm:^1.0.0": - version: 1.0.0 - resolution: "string.prototype.repeat@npm:1.0.0" - dependencies: - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.17.5" - checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.10": - version: 1.2.10 - resolution: "string.prototype.trim@npm:1.2.10" +"string-width@npm:^8.2.0": + version: 8.2.1 + resolution: "string-width@npm:8.2.1" dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - define-data-property: "npm:^1.1.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-object-atoms: "npm:^1.0.0" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.9": - version: 1.0.9 - resolution: "string.prototype.trimend@npm:1.0.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimstart@npm:1.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + get-east-asian-width: "npm:^1.5.0" + strip-ansi: "npm:^7.1.2" + checksum: 10c0/d467b4eaf4c40a01bb438a2620e77badd2456ffd5131c9973abe4f3acf7c802d5b21f3b6a00a5e33a7fc28ca8f9c103226e01bac61e9f259659c6f46d78e353a languageName: node linkType: hard @@ -10047,7 +8793,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.1.0": +"strip-ansi@npm:^7.1.0, strip-ansi@npm:^7.1.2": version: 7.2.0 resolution: "strip-ansi@npm:7.2.0" dependencies: @@ -10271,6 +9017,13 @@ __metadata: languageName: node linkType: hard +"tinyexec@npm:^1.0.4": + version: 1.1.1 + resolution: "tinyexec@npm:1.1.1" + checksum: 10c0/48433cb32573a767e2b63bb92343cbbae4240d05a19a63f7869f9447491305e7bd82d11daccb79b2628b596ad703a25798226c50bfd1d8e63477fb42af6a5b35 + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": version: 0.2.16 resolution: "tinyglobby@npm:0.2.16" @@ -10318,15 +9071,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.5.0": - version: 2.5.0 - resolution: "ts-api-utils@npm:2.5.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10c0/767849383c114e7f1971fa976b20e73ac28fd0c70d8d65c0004790bf4d8f89888c7e4cf6d5949f9c1beae9bc3c64835bef77bbe27fddf45a3c7b60cebcf85c8c - languageName: node - linkType: hard - "ts-morph@npm:^27.0.0": version: 27.0.2 resolution: "ts-morph@npm:27.0.2" @@ -10403,59 +9147,6 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-buffer@npm:1.0.3" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.14" - checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 - languageName: node - linkType: hard - -"typed-array-byte-length@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-byte-length@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.8" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-proto: "npm:^1.2.0" - is-typed-array: "npm:^1.1.14" - checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e - languageName: node - linkType: hard - -"typed-array-byte-offset@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-byte-offset@npm:1.0.4" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-proto: "npm:^1.2.0" - is-typed-array: "npm:^1.1.15" - reflect.getprototypeof: "npm:^1.0.9" - checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.7": - version: 1.0.7 - resolution: "typed-array-length@npm:1.0.7" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - reflect.getprototypeof: "npm:^1.0.6" - checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 - languageName: node - linkType: hard - "typescript@npm:^6.0.3": version: 6.0.3 resolution: "typescript@npm:6.0.3" @@ -10485,18 +9176,6 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.1.0": - version: 1.1.0 - resolution: "unbox-primitive@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - which-boxed-primitive: "npm:^1.1.1" - checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 - languageName: node - linkType: hard - "unc-path-regex@npm:^0.1.2": version: 0.1.2 resolution: "unc-path-regex@npm:0.1.2" @@ -10511,15 +9190,6 @@ __metadata: languageName: node linkType: hard -"undici@npm:^5.25.4": - version: 5.29.0 - resolution: "undici@npm:5.29.0" - dependencies: - "@fastify/busboy": "npm:^2.0.0" - checksum: 10c0/e4e4d631ca54ee0ad82d2e90e7798fa00a106e27e6c880687e445cc2f13b4bc87c5eba2a88c266c3eecffb18f26e227b778412da74a23acc374fca7caccec49b - languageName: node - linkType: hard - "undici@npm:^6.23.0, undici@npm:^6.25.0": version: 6.25.0 resolution: "undici@npm:6.25.0" @@ -10735,52 +9405,6 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": - version: 1.1.1 - resolution: "which-boxed-primitive@npm:1.1.1" - dependencies: - is-bigint: "npm:^1.1.0" - is-boolean-object: "npm:^1.2.1" - is-number-object: "npm:^1.1.1" - is-string: "npm:^1.1.1" - is-symbol: "npm:^1.1.1" - checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe - languageName: node - linkType: hard - -"which-builtin-type@npm:^1.2.1": - version: 1.2.1 - resolution: "which-builtin-type@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - function.prototype.name: "npm:^1.1.6" - has-tostringtag: "npm:^1.0.2" - is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.1.0" - is-finalizationregistry: "npm:^1.1.0" - is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.2.1" - is-weakref: "npm:^1.0.2" - isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.1.0" - which-collection: "npm:^1.0.2" - which-typed-array: "npm:^1.1.16" - checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 - languageName: node - linkType: hard - -"which-collection@npm:^1.0.2": - version: 1.0.2 - resolution: "which-collection@npm:1.0.2" - dependencies: - is-map: "npm:^2.0.3" - is-set: "npm:^2.0.3" - is-weakmap: "npm:^2.0.2" - is-weakset: "npm:^2.0.3" - checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 - languageName: node - linkType: hard - "which-module@npm:^2.0.0": version: 2.0.1 resolution: "which-module@npm:2.0.1" @@ -10788,21 +9412,6 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": - version: 1.1.20 - resolution: "which-typed-array@npm:1.1.20" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - for-each: "npm:^0.3.5" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/16fcdada95c8afb821cd1117f0ab50b4d8551677ac08187f21d4e444530913c9ffd2dac634f0c1183345f96344b69280f40f9a8bc52164ef409e555567c2604b - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -10947,7 +9556,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.2.1, yaml@npm:^2.6.1": +"yaml@npm:^2.2.1, yaml@npm:^2.6.1, yaml@npm:^2.8.2": version: 2.8.3 resolution: "yaml@npm:2.8.3" bin: @@ -11064,16 +9673,7 @@ __metadata: languageName: node linkType: hard -"zod-validation-error@npm:^3.5.0 || ^4.0.0": - version: 4.0.2 - resolution: "zod-validation-error@npm:4.0.2" - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - checksum: 10c0/0ccfec48c46de1be440b719cd02044d4abb89ed0e14c13e637cd55bf29102f67ccdba373f25def0fc7130e5f15025be4d557a7edcc95d5a3811599aade689e1b - languageName: node - linkType: hard - -"zod@npm:^3.25.0 || ^4.0.0, zod@npm:^4.0.5": +"zod@npm:^4.0.5": version: 4.3.6 resolution: "zod@npm:4.3.6" checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 From bc6f05643fe2e43e7c7ee7e9693b382b31e1d313 Mon Sep 17 00:00:00 2001 From: Mateus Andrade Date: Tue, 28 Apr 2026 13:48:11 -0300 Subject: [PATCH 2/6] refactor: update build workflows to use yarn.lock and Node.js 24; enable Corepack --- .github/workflows/android-build.yml | 19 +++++++++++------- .github/workflows/ios-build.yml | 21 ++++++++++++-------- .github/workflows/release.yml | 30 ++++++++++++++--------------- 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index b0448b0..454c890 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -14,7 +14,7 @@ on: - 'nitrogen/generated/android/**' - 'cpp/**' - 'android/**' - - '**/bun.lock' + - '**/yarn.lock' - '**/react-native.config.js' - '**/nitro.json' pull_request: @@ -25,7 +25,7 @@ on: - '**/nitrogen/generated/android/**' - 'cpp/**' - 'android/**' - - '**/bun.lock' + - '**/yarn.lock' - '**/react-native.config.js' - '**/nitro.json' workflow_dispatch: @@ -39,10 +39,15 @@ jobs: name: Build Android Example App runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + + - name: Enable Corepack + run: corepack enable + + - uses: actions/setup-node@v5 with: - node-version: '20' + node-version: '24' + cache: 'yarn' - name: Install dependencies (yarn) run: yarn install --immutable @@ -50,11 +55,11 @@ jobs: - name: Generate Nitro bindings run: yarn codegen - - name: Setup JDK 17 + - name: Setup JDK 21 uses: actions/setup-java@v5 with: distribution: 'zulu' - java-version: '17' + java-version: '21' cache: 'gradle' - name: Cache Gradle diff --git a/.github/workflows/ios-build.yml b/.github/workflows/ios-build.yml index 33ce6ee..72d5a43 100644 --- a/.github/workflows/ios-build.yml +++ b/.github/workflows/ios-build.yml @@ -17,7 +17,7 @@ on: - 'cpp/**' - 'ios/**' - '**/Podfile.lock' - - '**/bun.lock' + - '**/yarn.lock' - '**/*.podspec' - '**/react-native.config.js' - '**/nitro.json' @@ -32,7 +32,7 @@ on: - 'cpp/**' - 'ios/**' - '**/Podfile.lock' - - '**/bun.lock' + - '**/yarn.lock' - '**/*.podspec' - '**/react-native.config.js' - '**/nitro.json' @@ -48,16 +48,21 @@ concurrency: jobs: build: name: Build iOS Example App - runs-on: macOS-15 + runs-on: macos-26 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + + - name: Enable Corepack + run: corepack enable + + - uses: actions/setup-node@v5 with: - node-version: '20' + node-version: '24' + cache: 'yarn' - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: 16.4 + xcode-version: '26.2' - name: Install dependencies (yarn) run: yarn install --immutable @@ -68,7 +73,7 @@ jobs: - name: Setup Ruby (bundle) uses: ruby/setup-ruby@v1 with: - ruby-version: '3.2' + ruby-version: '3.4' bundler-cache: true working-directory: example/ios diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d081834..a619ec8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,27 +21,25 @@ jobs: id-token: write steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - - name: Setup Bun.js - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - name: Cache bun dependencies - id: bun-cache - uses: actions/cache@v4 + + - name: Enable Corepack + run: corepack enable + + - name: Setup Node.js + uses: actions/setup-node@v5 with: - path: ~/.bun/install/cache - key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }} - restore-keys: | - ${{ runner.os }}-bun- + node-version: '24' + cache: 'yarn' + registry-url: 'https://registry.npmjs.org' - - name: Install npm dependencies (bun) - run: bun install + - name: Install dependencies (yarn) + run: yarn install --immutable - name: Build lib - run: bun run build + run: yarn build - name: Release env: @@ -52,4 +50,4 @@ jobs: GIT_AUTHOR_EMAIL: '${{ github.actor }}@users.noreply.github.com' GIT_COMMITTER_NAME: ${{ github.actor }} GIT_COMMITTER_EMAIL: '${{ github.actor }}@users.noreply.github.com' - run: bun release + run: yarn release From 2d30bd6fc0b825ec1c11b7a02bf1b9b4b5043ec7 Mon Sep 17 00:00:00 2001 From: Mateus Andrade Date: Tue, 28 Apr 2026 18:23:34 -0300 Subject: [PATCH 3/6] Bump NitroModules to 0.35.6; adjust types Upgrade react-native-nitro-modules / Nitrogen to 0.35.6 across package manifests and native Podfile, and update related dev deps (@biomejs/biome -> 2.4.13, lint-staged -> 16.4.0). Change InAppBrowserAuthResult from a type alias to an interface extending InAppBrowserResult so Nitrogen emits a dedicated Swift/Kotlin type and IDE tooltips show the distinct name. Updated lockfiles (yarn.lock and Podfile.lock) to reflect these dependency changes. --- example/ios/Podfile.lock | 8 +-- example/package.json | 2 +- package.json | 8 +-- src/types.ts | 8 +-- yarn.lock | 104 +++++++++++++++++++-------------------- 5 files changed, 65 insertions(+), 65 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index d95a461..e1d10b5 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -3,7 +3,7 @@ PODS: - hermes-engine (250829098.0.10): - hermes-engine/Pre-built (= 250829098.0.10) - hermes-engine/Pre-built (250829098.0.10) - - InappbrowserNitro (2.1.2): + - InappbrowserNitro (3.0.0): - hermes-engine - NitroModules - RCTRequired @@ -27,7 +27,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - NitroModules (0.35.4): + - NitroModules (0.35.6): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2102,8 +2102,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBLazyVector: 26fd21c75314e101f280d401e97f27d54f3f7064 hermes-engine: 633515686db390f4a4cb002ae52a1e1f3ade1923 - InappbrowserNitro: 1dbbf69d4feab79baaff583cfd30150f98026ae5 - NitroModules: bb964bd9a9e7e845569915d5cd2daafcc71bf8c4 + InappbrowserNitro: bb0595d41139b4d9ab7d422a85b78397a14318d6 + NitroModules: c41b7b778d6557f1e517a80ec681a670321fa001 RCTDeprecation: c7a2768f905d76ca6d2cfefb26e4349eacbdfca3 RCTRequired: 5e502c3553cfbed090a991c444448da452fb752e RCTSwiftUI: 5ce3ccbdc58b78cc4ebbaace01709ec22d58e131 diff --git a/example/package.json b/example/package.json index 9ef769b..532675f 100644 --- a/example/package.json +++ b/example/package.json @@ -14,7 +14,7 @@ "@react-native/new-app-screen": "0.85.2", "react": "19.2.3", "react-native": "0.85.2", - "react-native-nitro-modules": "0.35.4", + "react-native-nitro-modules": "0.35.6", "react-native-safe-area-context": "^5.7.0" }, "devDependencies": { diff --git a/package.json b/package.json index 2dbab9c..88192d3 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "registry": "https://registry.npmjs.org/" }, "devDependencies": { - "@biomejs/biome": "^2.4.12", + "@biomejs/biome": "^2.4.13", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "@types/jest": "^30.0.0", @@ -118,12 +118,12 @@ "babel-plugin-react-compiler": "^19.1.0-rc.3", "conventional-changelog-conventionalcommits": "^9.3.1", "husky": "^9.1.7", - "lint-staged": "^16.1.2", - "nitrogen": "0.35.4", + "lint-staged": "^16.4.0", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.85", "react-native-builder-bob": "^0.41.0", - "react-native-nitro-modules": "0.35.4", + "react-native-nitro-modules": "0.35.6", "semantic-release": "^25.0.3", "typescript": "^6.0.3" }, diff --git a/src/types.ts b/src/types.ts index 3bfb83f..f2eef5a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -280,8 +280,8 @@ export interface InAppBrowserResult { /** * Authentication result payload. * - * Semantically identical to {@link InAppBrowserResult}; declared as a - * `type` alias (rather than an empty extending interface) so the emitted - * `.d.ts` is a few bytes smaller without changing IDE hover output. + * Semantically identical to {@link InAppBrowserResult}, but declared as a + * distinct interface so Nitrogen emits a dedicated Swift/Kotlin type and + * call sites read as `InAppBrowserAuthResult` in IDE tooltips. */ -export type InAppBrowserAuthResult = InAppBrowserResult +export interface InAppBrowserAuthResult extends InAppBrowserResult {} diff --git a/yarn.lock b/yarn.lock index 0262b34..cde4861 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1406,18 +1406,18 @@ __metadata: languageName: node linkType: hard -"@biomejs/biome@npm:^2.4.12": - version: 2.4.12 - resolution: "@biomejs/biome@npm:2.4.12" - dependencies: - "@biomejs/cli-darwin-arm64": "npm:2.4.12" - "@biomejs/cli-darwin-x64": "npm:2.4.12" - "@biomejs/cli-linux-arm64": "npm:2.4.12" - "@biomejs/cli-linux-arm64-musl": "npm:2.4.12" - "@biomejs/cli-linux-x64": "npm:2.4.12" - "@biomejs/cli-linux-x64-musl": "npm:2.4.12" - "@biomejs/cli-win32-arm64": "npm:2.4.12" - "@biomejs/cli-win32-x64": "npm:2.4.12" +"@biomejs/biome@npm:^2.4.13": + version: 2.4.13 + resolution: "@biomejs/biome@npm:2.4.13" + dependencies: + "@biomejs/cli-darwin-arm64": "npm:2.4.13" + "@biomejs/cli-darwin-x64": "npm:2.4.13" + "@biomejs/cli-linux-arm64": "npm:2.4.13" + "@biomejs/cli-linux-arm64-musl": "npm:2.4.13" + "@biomejs/cli-linux-x64": "npm:2.4.13" + "@biomejs/cli-linux-x64-musl": "npm:2.4.13" + "@biomejs/cli-win32-arm64": "npm:2.4.13" + "@biomejs/cli-win32-x64": "npm:2.4.13" dependenciesMeta: "@biomejs/cli-darwin-arm64": optional: true @@ -1437,62 +1437,62 @@ __metadata: optional: true bin: biome: bin/biome - checksum: 10c0/8f03b07f33d7e1efee615945cdc907b7fdc9160d70b204a74ce1b65bdf0ca47c7bfe5e2fafd5b832927f0d4bee4ae3182d93e603e3e5ecf5d91734cff888133b + checksum: 10c0/a8c09d7c05d834243a76704e31bda05346d2a06a75e90e6de2ef0d4edc33bd7d382b380bad9275ddd379e9e44ceaea9907a9c0de2156859b36b057c155f20a0e languageName: node linkType: hard -"@biomejs/cli-darwin-arm64@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-darwin-arm64@npm:2.4.12" +"@biomejs/cli-darwin-arm64@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-darwin-arm64@npm:2.4.13" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@biomejs/cli-darwin-x64@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-darwin-x64@npm:2.4.12" +"@biomejs/cli-darwin-x64@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-darwin-x64@npm:2.4.13" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@biomejs/cli-linux-arm64-musl@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-linux-arm64-musl@npm:2.4.12" +"@biomejs/cli-linux-arm64-musl@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-linux-arm64-musl@npm:2.4.13" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@biomejs/cli-linux-arm64@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-linux-arm64@npm:2.4.12" +"@biomejs/cli-linux-arm64@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-linux-arm64@npm:2.4.13" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@biomejs/cli-linux-x64-musl@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-linux-x64-musl@npm:2.4.12" +"@biomejs/cli-linux-x64-musl@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-linux-x64-musl@npm:2.4.13" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@biomejs/cli-linux-x64@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-linux-x64@npm:2.4.12" +"@biomejs/cli-linux-x64@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-linux-x64@npm:2.4.13" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@biomejs/cli-win32-arm64@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-win32-arm64@npm:2.4.12" +"@biomejs/cli-win32-arm64@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-win32-arm64@npm:2.4.13" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@biomejs/cli-win32-x64@npm:2.4.12": - version: 2.4.12 - resolution: "@biomejs/cli-win32-x64@npm:2.4.12" +"@biomejs/cli-win32-x64@npm:2.4.13": + version: 2.4.13 + resolution: "@biomejs/cli-win32-x64@npm:2.4.13" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5920,7 +5920,7 @@ __metadata: languageName: node linkType: hard -"lint-staged@npm:^16.1.2": +"lint-staged@npm:^16.4.0": version: 16.4.0 resolution: "lint-staged@npm:16.4.0" dependencies: @@ -6747,18 +6747,18 @@ __metadata: languageName: node linkType: hard -"nitrogen@npm:0.35.4": - version: 0.35.4 - resolution: "nitrogen@npm:0.35.4" +"nitrogen@npm:0.35.6": + version: 0.35.6 + resolution: "nitrogen@npm:0.35.6" dependencies: chalk: "npm:^5.3.0" - react-native-nitro-modules: "npm:^0.35.4" + react-native-nitro-modules: "npm:^0.35.6" ts-morph: "npm:^27.0.0" yargs: "npm:^18.0.0" zod: "npm:^4.0.5" bin: nitrogen: lib/index.js - checksum: 10c0/d8c7eed4e08c107475e8a3154f7d5ddf9876448032f0986b0e8d9e58abeb3dbc8ecd7cdb45190f12ab0fbafc815bb1b31209e93910e7f5d671e892d794449631 + checksum: 10c0/3126cee262dc908717cfba21b38250bcf658afa6586ec2b66f3f9276050bf433af66cf072b70a4fc6814b812271f32566ac639f1c3147d26c20ba71c74a9a40a languageName: node linkType: hard @@ -7838,7 +7838,7 @@ __metadata: babel-plugin-module-resolver: "npm:^5.0.3" react: "npm:19.2.3" react-native: "npm:0.85.2" - react-native-nitro-modules: "npm:0.35.4" + react-native-nitro-modules: "npm:0.35.6" react-native-safe-area-context: "npm:^5.7.0" languageName: unknown linkType: soft @@ -7847,7 +7847,7 @@ __metadata: version: 0.0.0-use.local resolution: "react-native-inappbrowser-nitro@workspace:." dependencies: - "@biomejs/biome": "npm:^2.4.12" + "@biomejs/biome": "npm:^2.4.13" "@semantic-release/changelog": "npm:^6.0.3" "@semantic-release/git": "npm:^10.0.1" "@types/jest": "npm:^30.0.0" @@ -7855,12 +7855,12 @@ __metadata: babel-plugin-react-compiler: "npm:^19.1.0-rc.3" conventional-changelog-conventionalcommits: "npm:^9.3.1" husky: "npm:^9.1.7" - lint-staged: "npm:^16.1.2" - nitrogen: "npm:0.35.4" + lint-staged: "npm:^16.4.0" + nitrogen: "npm:0.35.6" react: "npm:19.2.3" react-native: "npm:0.85" react-native-builder-bob: "npm:^0.41.0" - react-native-nitro-modules: "npm:0.35.4" + react-native-nitro-modules: "npm:0.35.6" semantic-release: "npm:^25.0.3" typescript: "npm:^6.0.3" peerDependencies: @@ -7880,13 +7880,13 @@ __metadata: languageName: node linkType: hard -"react-native-nitro-modules@npm:0.35.4, react-native-nitro-modules@npm:^0.35.4": - version: 0.35.4 - resolution: "react-native-nitro-modules@npm:0.35.4" +"react-native-nitro-modules@npm:0.35.6, react-native-nitro-modules@npm:^0.35.6": + version: 0.35.6 + resolution: "react-native-nitro-modules@npm:0.35.6" peerDependencies: react: "*" react-native: "*" - checksum: 10c0/dffb64c1b349d21feb8a33546cde48e3c5d92e04e120f733c178d4afa26ef6de652c6236a4eed0da7ca842ac9815afaa0708f57ae1454d881397e5d0575031c2 + checksum: 10c0/57ec2a2d2e57da923c5c8c81d28f323691be0373d528b81a1a6e1da0e6675f29faa443cc16babd0abd4cd5e08e51ff273ed04a139f368236662212f15cc3a678 languageName: node linkType: hard From 6bf4eeb05514b0fbefed27c8b7912cb6bd107cca Mon Sep 17 00:00:00 2001 From: Mateus Andrade Date: Tue, 28 Apr 2026 18:24:57 -0300 Subject: [PATCH 4/6] Memoize hooks and sanitize options trim useInAppBrowser: add useCallback/useMemo to memoize runTracked, open, openAuth and the returned object, ensuring stable identities for consumers (e.g. useEffect deps or React.memo). Also update import list and docs to clarify memoization behavior.\n\nutils/options: enhance trimStringFields to treat explicit undefined, non-string own properties, and extra enumerable keys as mutations (uses ownKeyCount and `key in source`), returning null only when the input is already bridge-safe; improves sanitization before crossing the bridge. --- src/hooks/useInAppBrowser.ts | 80 ++++++++++++++++++++---------------- src/utils/options.ts | 24 ++++++----- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/hooks/useInAppBrowser.ts b/src/hooks/useInAppBrowser.ts index 4a7baff..ee60073 100644 --- a/src/hooks/useInAppBrowser.ts +++ b/src/hooks/useInAppBrowser.ts @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { close as nativeClose, @@ -59,9 +59,10 @@ const toError = (err: unknown): Error => * APIs with loading and error state tracking. `close`, `closeAuth`, and * `isAvailable` are direct delegates to the stateless module API. * - * Memoization is handled by the React Compiler at build time, so the returned - * object identity is stable across re-renders without manual `useCallback` / - * `useMemo` wrappers. + * `open`/`openAuth` and the returned object are memoized with `useCallback` / + * `useMemo` so consumers passing them to `useEffect` deps or `React.memo` + * children get stable identities — independent of whether the host app has + * `babel-plugin-react-compiler` enabled. */ export const useInAppBrowser = (): UseInAppBrowserReturn => { const [isLoading, setIsLoading] = useState(false) @@ -77,38 +78,47 @@ export const useInAppBrowser = (): UseInAppBrowserReturn => { } }, []) - const runTracked = async (fn: () => Promise): Promise => { - if (isMountedRef.current) { - setIsLoading(true) - setError(null) - } - try { - return await fn() - } catch (err) { - const next = toError(err) - if (isMountedRef.current) setError(next) - throw next - } finally { - if (isMountedRef.current) setIsLoading(false) - } - } + const runTracked = useCallback( + async (fn: () => Promise): Promise => { + if (isMountedRef.current) { + setIsLoading(true) + setError(null) + } + try { + return await fn() + } catch (err) { + const next = toError(err) + if (isMountedRef.current) setError(next) + throw next + } finally { + if (isMountedRef.current) setIsLoading(false) + } + }, + [] + ) - const open = (url: string, options?: InAppBrowserOptions) => - runTracked(() => nativeOpen(url, options)) + const open = useCallback( + (url: string, options?: InAppBrowserOptions) => + runTracked(() => nativeOpen(url, options)), + [runTracked] + ) - const openAuth = ( - url: string, - redirectUrl: string, - options?: InAppBrowserOptions - ) => runTracked(() => nativeOpenAuth(url, redirectUrl, options)) + const openAuth = useCallback( + (url: string, redirectUrl: string, options?: InAppBrowserOptions) => + runTracked(() => nativeOpenAuth(url, redirectUrl, options)), + [runTracked] + ) - return { - open, - openAuth, - close: nativeClose, - closeAuth: nativeCloseAuth, - isAvailable: nativeIsAvailable, - isLoading, - error, - } + return useMemo( + () => ({ + open, + openAuth, + close: nativeClose, + closeAuth: nativeCloseAuth, + isAvailable: nativeIsAvailable, + isLoading, + error, + }), + [open, openAuth, isLoading, error] + ) } diff --git a/src/utils/options.ts b/src/utils/options.ts index c085a92..729b3f4 100644 --- a/src/utils/options.ts +++ b/src/utils/options.ts @@ -26,28 +26,29 @@ const ANIMATION_KEYS = [ ] as const satisfies readonly (keyof BrowserAnimations)[] /** - * Whitelist-trim string fields. Returns `null` when no mutation was required - * (caller can keep its original reference); otherwise returns the new payload - * (or `undefined` when every entry was dropped). + * Whitelist-trim string fields. Returns `null` when the input was already + * bridge-safe (caller can keep its original reference); otherwise returns the + * new payload (or `undefined` when every entry was dropped). + * + * "Bridge-safe" means: every own property is a non-empty trimmed string AND + * is in the whitelist. Any explicit `undefined`, non-string value, or extra + * enumerable key forces a fresh object so the value crossing JSI is clean. */ const trimStringFields = ( source: T, keys: readonly (keyof T)[] ): T | undefined | null => { + const ownKeyCount = Object.keys(source).length let out: Partial | null = null let mutated = false let kept = 0 - let originalKeyCount = 0 - - for (const key of Object.keys(source) as (keyof T)[]) { - const v = source[key] - if (v !== undefined) originalKeyCount++ - } for (const key of keys) { const value = source[key] if (typeof value !== 'string') { - if (value !== undefined) mutated = true + // Any own non-string property (including explicit `undefined`) needs + // to be stripped before bridging. + if (key in source) mutated = true continue } const trimmed = value.trim() @@ -61,7 +62,8 @@ const trimStringFields = ( kept++ } - if (!mutated && kept === originalKeyCount) return null + // Extra (non-whitelisted) own keys also require sanitization. + if (!mutated && kept === ownKeyCount) return null return out ? (compact(out) as T | undefined) : undefined } From 29dbda970bc491fd67c7a51d7ae1f3877f98e285 Mon Sep 17 00:00:00 2001 From: Mateus Andrade Date: Wed, 29 Apr 2026 08:02:16 -0300 Subject: [PATCH 5/6] Revamp README and clarify iOS color docs Rewrite README with a full docs overhaul: updated badges, quick-start, installation (yarn/npm/pnpm/bun), requirements (New Architecture / no Expo Go), API and options tables, migration notes from react-native-inappbrowser-reborn, FAQ, platform notes, examples, contributing instructions, and CI/dev workflow. Also adjust examples to use the hook import path and demonstrate open/openAuth usage. Add clarifying JSDoc to InAppBrowser iOS options in src/types.ts describing iOS 26 "Liquid Glass" behavior for preferredBarTintColor and preferredControlTintColor and noting backward compatibility. --- README.md | 455 ++++++++++++++++++++++++++++----------------------- src/types.ts | 21 ++- 2 files changed, 270 insertions(+), 206 deletions(-) diff --git a/README.md b/README.md index 947f22b..a5e7aa1 100644 --- a/README.md +++ b/README.md @@ -1,324 +1,371 @@ -# react-native-inappbrowser-nitro - -[![npm version](https://img.shields.io/npm/v/react-native-inappbrowser-nitro.svg?style=flat-square)](https://www.npmjs.com/package/react-native-inappbrowser-nitro) -[![npm downloads](https://img.shields.io/npm/dm/react-native-inappbrowser-nitro.svg?style=flat-square)](https://www.npmjs.com/package/react-native-inappbrowser-nitro) -[![license](https://img.shields.io/npm/l/react-native-inappbrowser-nitro.svg?style=flat-square)](LICENSE) +
-Lightning-fast, modern in-app browser for React Native powered by Nitro Modules. Enjoy direct JSI bindings, zero bridge overhead, and polished native browser UX on both iOS and Android. +# react-native-inappbrowser-nitro -
- InAppBrowser Nitro Demo -
+**A modern, native in-app browser for React Native — built on [Nitro Modules](https://nitro.margelo.com/).** -## Contents +[![npm version](https://img.shields.io/npm/v/react-native-inappbrowser-nitro?style=flat-square&color=0a7ea4)](https://www.npmjs.com/package/react-native-inappbrowser-nitro) +[![npm downloads](https://img.shields.io/npm/dm/react-native-inappbrowser-nitro?style=flat-square&color=0a7ea4)](https://www.npmjs.com/package/react-native-inappbrowser-nitro) +[![bundle size](https://img.shields.io/bundlephobia/minzip/react-native-inappbrowser-nitro?style=flat-square&label=min%2Bgzip)](https://bundlephobia.com/package/react-native-inappbrowser-nitro) +[![license](https://img.shields.io/npm/l/react-native-inappbrowser-nitro?style=flat-square&color=0a7ea4)](./LICENSE) +[![CI](https://img.shields.io/github/actions/workflow/status/mCodex/react-native-inappbrowser-nitro/ios-build.yml?style=flat-square&label=iOS)](https://github.com/mCodex/react-native-inappbrowser-nitro/actions/workflows/ios-build.yml) +[![CI](https://img.shields.io/github/actions/workflow/status/mCodex/react-native-inappbrowser-nitro/android-build.yml?style=flat-square&label=Android)](https://github.com/mCodex/react-native-inappbrowser-nitro/actions/workflows/android-build.yml) -- [Highlights](#highlights) -- [Platform Support](#platform-support) -- [Installation](#installation) -- [Usage](#usage) -- [Migration Guide (pre-Nitro → latest)](#migration-guide-pre-nitro--latest) -- [API Surface](#api-surface) -- [Options Reference](#options-reference) -- [Dynamic Color Palettes](#dynamic-color-palettes) -- [Security & Emulator Notes](#security--emulator-notes) -- [Troubleshooting](#troubleshooting) -- [Contributing](#contributing) -- [License](#license) +[**Installation**](#installation) · +[**Quick start**](#quick-start) · +[**API**](#api) · +[**Options**](#options) · +[**Migration**](#migrating-from-react-native-inappbrowser-reborn) · +[**FAQ**](#faq) -## Highlights +Demo -- TurboModule-first implementation with native-speed execution and zero bridge overhead. -- Fully typed TypeScript API plus ergonomic React hook helpers. -- ✅ **iOS 26 ready**: high-contrast dynamic colors, edge-dismiss control, and UI style overrides. -- ✅ **Android 16 ready**: partial custom tabs, referrer controls, and per-theme palettes. -- Authentication-first design with ephemeral sessions and graceful fallbacks. -- Works great with Hermes, Fabric, and the React Native New Architecture. +
-## Platform Support +--- -| Platform | Minimum | Targeted | Highlights | -|----------|---------|----------|------------| -| iOS | 11.0 | 17 / 26* | SafariViewController + ASWebAuthentication support. | -| Android | API 23 | API 34 / 16* | Chrome Custom Tabs with dynamic theming. | -| React Native | 0.70.0 | Latest | Nitro Modules + TypeScript bindings. | +## Why this library? -\* iOS 26 and Android 16 features are automatically gated behind runtime checks. +| | | +|---|---| +| ⚡ **Native speed** | Direct JSI bindings via Nitro Modules — no JSON bridge, no scheduler hops. | +| 🎯 **Right primitive on each platform** | `SFSafariViewController` on iOS, Chrome **Custom Tabs** on Android — not a `WKWebView` reimplementation. | +| 🔐 **OAuth-ready** | First-class `openAuth` flow with ephemeral sessions and redirect interception. | +| 🪝 **Hook + imperative APIs** | `useInAppBrowser()` for component state, named exports for everything else. | +| 🧩 **Strict TypeScript** | Discriminated result types, dual `as const` + literal-type enums, full JSDoc with examples. | +| 📦 **Small footprint** | `"sideEffects": false`, ESM-first build, lazy-initialized native module. | -> **Expo** is not supported because Nitro modules require native compilation. +--- -## Android Browser Fallback +## Requirements -
-Browser selection logic on Android +| | Minimum | Tested up to | +|---|---|---| +| React Native | `0.75` (New Architecture) | `0.85` | +| iOS | `15.1` | `26.2` | +| Android | API `23` (Android 6) | API `36` (Android 16) | +| `react-native-nitro-modules` | `0.35` | `0.35.4` | -On Android, the library prioritizes Chrome Custom Tabs for the best user experience when Chrome is installed. If Chrome is not available (e.g., on Samsung devices), it falls back to opening the URL in the device's default web browser using the standard `Intent.ACTION_VIEW` mechanism. +> [!IMPORTANT] +> This library requires the **React Native New Architecture** and is **not compatible with Expo Go**. It works in [Expo prebuild / dev clients](https://docs.expo.dev/develop/development-builds/introduction/). -This ensures compatibility across devices while maintaining optimal performance with Chrome when possible. -
+--- ## Installation ```sh -npm install react-native-inappbrowser-nitro react-native-nitro-modules +yarn add react-native-inappbrowser-nitro react-native-nitro-modules ``` -or +
+npm / pnpm / bun ```sh -yarn add react-native-inappbrowser-nitro react-native-nitro-modules +npm install react-native-inappbrowser-nitro react-native-nitro-modules +pnpm add react-native-inappbrowser-nitro react-native-nitro-modules +bun add react-native-inappbrowser-nitro react-native-nitro-modules ``` +
+ ### iOS ```sh -cd ios -pod install +cd ios && pod install ``` ### Android -No additional steps—Gradle autolinking handles everything. +Autolinking handles everything. No manual `MainApplication` edits required. + +--- -## Usage +## Quick start ### Imperative API ```tsx import { isAvailable, open } from 'react-native-inappbrowser-nitro' -async function openDocs() { - if (!(await isAvailable())) { - console.warn('No compatible browser found') - return - } - - const result = await open('https://nitro.margelo.com', { - preferredBarTintColor: { base: '#111827', light: '#1F2933', highContrast: '#000000' }, - preferredControlTintColor: { base: '#F9FAFB', highContrast: '#FFD700' }, // iOS 26+ - toolbarColor: { base: '#2563EB', dark: '#1E3A8A' }, - enablePartialCustomTab: true, // Android 16+ +if (await isAvailable()) { + const result = await open('https://github.com', { + preferredBarTintColor: { light: '#FFFFFF', dark: '#000000' }, // iOS + toolbarColor: { light: '#FFFFFF', dark: '#000000' }, // Android + readerMode: true, }) - console.log(result) + if (result.type === 'success') { + console.log('Opened', result.url) + } } ``` -### React Hook +### React hook ```tsx -import { useInAppBrowser } from 'react-native-inappbrowser-nitro' +import { useInAppBrowser } from 'react-native-inappbrowser-nitro/hooks' -export function LaunchButton() { +function DocsButton() { const { open, isLoading, error } = useInAppBrowser() return ( -