npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@arc-js/native-core

v0.0.1

Published

NATIVE CORE est un ensemble de hooks et utilitaires de routage avancés pour les applications React Native avec TypeScript/JavaScript. Il fournit des fonctionnalités de navigation avancées, une gestion automatique des langues et des utilitaires pour simpli

Readme

@arc-js/native-core

License TypeScript React React Native React Navigation

@arc-js/native-core est un ensemble de hooks et utilitaires de routage avancés pour les applications React Native avec TypeScript/JavaScript. Il fournit des fonctionnalités de navigation avancées, une gestion automatique des langues et des utilitaires pour simplifier le développement d'applications React Navigation.

✨ Fonctionnalités Principales

🧭 Navigation Avancée

  • Navigation type-safe avec validation des paramètres
  • Gestion automatique des query strings avec support multi-langue
  • Résolution de routes avec paramètres dynamiques
  • Navigation avec rechargement pour les mises à jour critiques
  • Analyse d'URL complète avec extraction des données
  • Support React Navigation Native Stack

🌍 Support Multi-Langue

  • Gestion automatique du paramètre de langue lang
  • Support intégré pour français et anglais
  • Fallback sécurisé vers le français par défaut
  • Codes de langue standardisés (fr_FR, en_US)

⚡ Utilitaires de Routage

  • Validation de route actuelle avec correspondance de chemin
  • Extraction des paramètres de query string
  • Génération d'URL avec paramètres et queries
  • Navigation externe vers des URL spécifiques

🛡️ Gestion d'Erreurs

  • Fallback sécurisé pour les routes invalides
  • Validation stricte des paramètres d'entrée
  • Logs détaillés en mode développement
  • Types TypeScript complets pour une meilleure autocomplétion

📦 Installation

Via npm/yarn/pnpm

npm install @arc-js/native-core @arc-js/qust @react-navigation/native @react-navigation/native-stack react-native react
# ou
yarn add @arc-js/native-core @arc-js/qust @react-navigation/native @react-navigation/native-stack react-native react
# ou
pnpm add @arc-js/native-core @arc-js/qust @react-navigation/native @react-navigation/native-stack react-native react

Dépendances requises

  • React 19+
  • React Native 0.81+
  • React Navigation Native 7+
  • React Navigation Native Stack 7+
  • TypeScript 5.0+ (recommandé)
  • @arc-js/qust 1.0.0+ (pour la manipulation de query strings)

🚀 Démarrage Rapide

Configuration de base

// App.tsx
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { useRootingActions } from '@arc-js/native-core';

const Stack = createNativeStackNavigator();

const HomeScreen = () => {
  const { goToRoute } = useRootingActions();
  
  return (
    <View>
      <Text>Accueil</Text>
      <Button 
        title="Voir le profil utilisateur" 
        onPress={() => goToRoute({
          path: 'Profile',
          params: { userId: '123' },
          queries: { lang: 'fr', view: 'profile' }
        })}
      />
    </View>
  );
};

const ProfileScreen = () => {
  const { params, queries } = useRootingActions();
  
  return (
    <View>
      <Text>Profil de l'utilisateur {params.userId}</Text>
      <Text>Langue: {queries.lang || 'fr'}</Text>
    </View>
  );
};

const App = () => {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Profile" component={ProfileScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
};

export default App;

📚 Documentation API

Hook useRootingActions

import { useRootingActions } from '@arc-js/native-core';

const MyComponent = () => {
  const {
    // Paramètres de l'écran actuel
    params,           // { userId: "123", slug: "article" }
    queries,          // { lang: "fr", page: "1" }
    pathName,         // "Profile" (nom de l'écran)
    urlSearch,        // "?lang=fr&page=1"
    
    // Fonctions de navigation
    navigate,         // navigate() de react-navigation
    goBack,           // goBack() de react-navigation
    resolveRoute,     // Générer un chemin complet
    goToRoute,        // Naviguer vers un écran
    goAndReloadRoute, // Naviguer avec rechargement
    goToUrl,          // Naviguer vers une URL
    
    // Utilitaires
    getParams,        // Obtenir les paramètres
    getUrlData,       // Analyser une URL
    checkIfIsCurrentRoute // Vérifier l'écran actuel
  } = useRootingActions();
  
  return (
    <View>
      <Text>ID Utilisateur: {params.userId}</Text>
      <Text>Langue: {queries.lang || 'fr'}</Text>
    </View>
  );
};

Interfaces principales

// Configuration de navigation
interface ConfigGoToRoute {
  path?: string;           // Nom de l'écran (ex: "Profile")
  params?: any;           // Paramètres de navigation (ex: { userId: "123" })
  queries?: any;          // Query parameters (ex: { lang: "fr" })
  refreshPage?: boolean;  // Forcer le rechargement
  replace?: boolean;      // Remplacer l'historique
  enableLoader?: boolean; // Afficher un loader
}

// Configuration de résolution
interface ConfigResolveRoute {
  path?: string;
  params?: any;
  queries?: any;
}

// Configuration de navigation externe
interface ConfigGoToSpecificUrl {
  path?: string;
  queries?: any;
  refreshPage?: boolean;
  replace?: boolean;
  enableLoader?: boolean;
}

// Valeur de retour du hook
interface RootingActionReturns {
  params: any;
  queries: any;
  getParams: () => Record<string, any>;
  navigate: (name: string, params?: any) => void;
  goBack: () => void;
  resolveRoute: (config: ConfigResolveRoute) => string;
  goToRoute: (config: ConfigGoToRoute) => void;
  goAndReloadRoute: (config: ConfigGoAndReloadRoute) => void;
  pathName: string;
  urlSearch: string;
  getUrlData: (url: string) => {
    pathname: string;
    queries: any;
  } | undefined;
  goToUrl: (config: ConfigGoToSpecificUrl) => string;
  checkIfIsCurrentRoute: (path?: string, exact?: boolean, strict?: boolean) => boolean;
}

Fonctions utilitaires

import { nativeResolveRoute, getLang, getLangCode } from '@arc-js/native-core';

// Générer un chemin sans utiliser le hook
const profilePath = nativeResolveRoute({
  path: 'Profile/:id/details',
  params: { id: '456' },
  queries: { lang: 'en', tab: 'settings' }
});
// Résultat: "Profile/456/details?lang=en&tab=settings"

// Gestion des langues
const currentLang = getLang('fr');    // "fr" (valide)
const fallbackLang = getLang('es');   // "fr" (fallback)
const langCode = getLangCode('en');   // "en_US"

🔧 Utilisation Avancée

Navigation avec gestion de langue

const LanguageAwareNavigation = () => {
  const { goToRoute, queries } = useRootingActions();
  const currentLang = queries.lang || 'fr';
  
  const navigateWithLang = (screenName: string, params?: any, additionalQueries?: any) => {
    goToRoute({
      path: screenName,
      params,
      queries: {
        ...additionalQueries,
        lang: currentLang
      }
    });
  };
  
  return (
    <View>
      <Button 
        title="Voir l'équipe" 
        onPress={() => navigateWithLang('About', { section: 'team' })} 
      />
    </View>
  );
};

Navigation conditionnelle

const SmartNavigation = () => {
  const { goToRoute, checkIfIsCurrentRoute } = useRootingActions();
  
  const navigateSmartly = (screenName: string) => {
    // Si déjà sur l'écran, ne rien faire
    if (checkIfIsCurrentRoute(screenName)) {
      return;
    }
    
    // Sinon, naviguer
    goToRoute({ path: screenName });
  };
  
  return (
    <View>
      <Button title="Accueil" onPress={() => navigateSmartly('Home')} />
      <Button title="À propos" onPress={() => navigateSmartly('About')} />
    </View>
  );
};

🎯 Exemples Complets

Exemple 1 : Formulaire avec redirection

import { useState } from 'react';
import { View, TextInput, Button, Alert } from 'react-native';
import { useRootingActions } from '@arc-js/native-core';

const ContactForm = () => {
  const { goToRoute, goAndReloadRoute } = useRootingActions();
  const [formData, setFormData] = useState({ name: '', email: '', message: '' });
  
  const handleSubmit = async () => {
    try {
      // Envoyer les données
      const response = await fetch('https://api.example.com/contact', {
        method: 'POST',
        body: JSON.stringify(formData)
      });
      
      if (response.ok) {
        // Redirection simple vers la page de confirmation
        goToRoute({
          path: 'ContactSuccess',
          queries: { ref: 'contact-form' }
        });
      } else {
        // Redirection avec rechargement pour nettoyer les erreurs
        goAndReloadRoute({
          path: 'Contact',
          queries: { error: 'submission_failed' }
        });
      }
    } catch (error) {
      Alert.alert('Erreur', 'Une erreur réseau est survenue');
      goToRoute({
        path: 'Contact',
        queries: { error: 'network_error' }
      });
    }
  };
  
  return (
    <View>
      <TextInput
        value={formData.name}
        onChangeText={text => setFormData({...formData, name: text})}
        placeholder="Votre nom"
      />
      <TextInput
        value={formData.email}
        onChangeText={text => setFormData({...formData, email: text})}
        placeholder="Votre email"
        keyboardType="email-address"
      />
      <TextInput
        value={formData.message}
        onChangeText={text => setFormData({...formData, message: text})}
        placeholder="Votre message"
        multiline
        numberOfLines={4}
      />
      <Button title="Envoyer" onPress={handleSubmit} />
    </View>
  );
};

Exemple 2 : Système de pagination

import { View, Text, Button } from 'react-native';
import { useRootingActions } from '@arc-js/native-core';

const PaginatedList = ({ items, currentPage, totalPages }) => {
  const { goToRoute, queries } = useRootingActions();
  
  const goToPage = (page: number) => {
    goToRoute({
      path: 'Items',
      queries: {
        ...queries,
        page: page.toString()
      }
    });
  };
  
  return (
    <View>
      <Text>Liste des éléments</Text>
      
      {/* Liste des éléments */}
      {items.map(item => (
        <Text key={item.id}>{item.name}</Text>
      ))}
      
      {/* Pagination */}
      <View style={{ flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }}>
        <Button
          title="Précédent"
          disabled={currentPage <= 1}
          onPress={() => goToPage(currentPage - 1)}
        />
        
        <Text>Page {currentPage} sur {totalPages}</Text>
        
        <Button
          title="Suivant"
          disabled={currentPage >= totalPages}
          onPress={() => goToPage(currentPage + 1)}
        />
      </View>
    </View>
  );
};

Exemple 3 : Menu de navigation intelligent

import { View, Text, TouchableOpacity } from 'react-native';
import { useRootingActions } from '@arc-js/native-core';

const NavigationMenu = () => {
  const { goToRoute, checkIfIsCurrentRoute } = useRootingActions();
  
  const menuItems = [
    { path: 'Home', label: 'Accueil' },
    { path: 'Products', label: 'Produits' },
    { path: 'About', label: 'À propos' },
    { path: 'Contact', label: 'Contact' }
  ];
  
  return (
    <View style={{ flexDirection: 'row', justifyContent: 'space-around' }}>
      {menuItems.map(item => {
        const isActive = checkIfIsCurrentRoute(item.path);
        
        return (
          <TouchableOpacity
            key={item.path}
            style={{ padding: 10, backgroundColor: isActive ? '#007AFF' : '#EFEFEF' }}
            onPress={() => goToRoute({ path: item.path })}
          >
            <Text style={{ color: isActive ? 'white' : 'black' }}>{item.label}</Text>
          </TouchableOpacity>
        );
      })}
    </View>
  );
};

Exemple 4 : Sélecteur de langue

import { View, TouchableOpacity, Text } from 'react-native';
import { useRootingActions } from '@arc-js/native-core';

const LanguageSelector = () => {
  const { goToRoute, queries } = useRootingActions();
  const currentLang = queries.lang || 'fr';
  
  const languages = [
    { code: 'fr', name: 'Français', flag: '🇫🇷' },
    { code: 'en', name: 'English', flag: '🇬🇧' }
  ];
  
  const changeLanguage = (langCode: string) => {
    goToRoute({
      path: queries.pathName || 'Home',
      queries: {
        ...queries,
        lang: langCode
      }
    });
  };
  
  return (
    <View style={{ flexDirection: 'row' }}>
      {languages.map(lang => (
        <TouchableOpacity
          key={lang.code}
          style={{ 
            padding: 8, 
            marginHorizontal: 4,
            backgroundColor: currentLang === lang.code ? '#007AFF' : '#EFEFEF',
            borderRadius: 4
          }}
          onPress={() => changeLanguage(lang.code)}
        >
          <Text style={{ color: currentLang === lang.code ? 'white' : 'black' }}>
            {lang.flag} {lang.name}
          </Text>
        </TouchableOpacity>
      ))}
    </View>
  );
};

🔧 Configuration

Configuration des langues

// Configuration par défaut dans @arc-js/native-core
export const langs = ['en', 'fr']; // Langues supportées
export const langCodes = {
  'fr': 'fr_FR',
  'en': 'en_US',
};

Variables d'environnement

// config.ts
export const NODEENV: 'development' | 'production' | 'debug' = 'development';

🛡️ Gestion des Erreurs

Fallback sécurisé

const SafeNavigation = () => {
  const { resolveRoute, goToRoute } = useRootingActions();
  
  const safeGoToRoute = (config: ConfigGoToRoute) => {
    try {
      goToRoute(config);
    } catch (error) {
      console.error('Navigation error:', error);
      // Fallback vers l'écran d'accueil
      goToRoute({ path: 'Home' });
    }
  };
  
  return (
    <Button 
      title="Naviguer en sécurité" 
      onPress={() => safeGoToRoute({ path: 'InvalidScreen' })} 
    />
  );
};

📋 Table des Conventions

Paramètres de query string

| Paramètre | Type | Description | Valeur par défaut | |-----------|------|-------------|-------------------| | lang | fr \| en | Langue de l'application | fr | | page | number | Numéro de page | 1 | | sort | string | Tri des résultats | date | | filter | string | Filtre appliqué | all |

Codes de langue

| Code court | Code long | Description | |------------|-----------|-------------| | fr | fr_FR | Français (France) | | en | en_US | Anglais (États-Unis) |

🔧 Build et Développement

Scripts disponibles

{
  "scripts": {
    "init": "npm init --scope=@arc-js/native-core",
    "login": "npm login"
  }
}

Configuration TypeScript

{
  "compilerOptions": {
    "target": "ES2020",
    "lib": ["ES2020", "DOM", "DOM.Iterable", "ESNext"],
    "module": "ESNext",
    "skipLibCheck": true,
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  }
}

📄 Licence

MIT License - Voir le fichier LICENSE pour plus de détails.

🐛 Signaler un Bug

Envoyez nous un mail à l'adresse [email protected] pour :

  • Signaler un bug
  • Proposer une amélioration
  • Poser une question

@arc-js/native-core - Les hooks et utilitaires de routage avancés pour React Native et TypeScript.

Développé par l'équipe INICODE