@arc-js/config-manager 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -295
- package/config.d.ts +16 -12
- package/config.js +5 -911
- package/config.min.js +1 -1
- package/core/ConfigService.d.ts +19 -0
- package/core/ConfigService.js +151 -0
- package/core/ConfigService.min.js +2 -0
- package/hooks/useConfig.jsx +33 -0
- package/hooks/useConfig.tsx +39 -0
- package/index.d.ts +34 -27
- package/index.js +181 -1117
- package/index.min.js +1 -1
- package/package.json +2 -6
- package/providers/ConfigProvider.jsx +57 -42
- package/providers/ConfigProvider.tsx +73 -50
- package/types.d.ts +16 -0
- package/utils/loaders.d.ts +23 -4
- package/utils/loaders.js +55 -952
- package/utils/loaders.min.js +1 -1
- package/utils/mergeConfigs.js +2 -7
- package/utils/mergeConfigs.min.js +1 -1
- package/core/ConfigurationService.d.ts +0 -33
- package/core/ConfigurationService.js +0 -1154
- package/core/ConfigurationService.min.js +0 -2
- package/core/types.d.ts +0 -27
- package/hooks/useConfig.d.ts +0 -29
- package/hooks/useConfig.js +0 -3178
- package/hooks/useConfig.min.js +0 -2
- package/utils.d.ts +0 -3
- package/utils.js +0 -901
- package/utils.min.js +0 -2
- package/vite.config.ts +0 -12
- /package/{core/types.js → types.js} +0 -0
- /package/{core/types.min.js → types.min.js} +0 -0
package/README.md
CHANGED
|
@@ -114,7 +114,7 @@ src/
|
|
|
114
114
|
// main.tsx
|
|
115
115
|
import React from 'react';
|
|
116
116
|
import ReactDOM from 'react-dom/client';
|
|
117
|
-
import {
|
|
117
|
+
import { ConfigManagerProvider } from '@arc-js/config-manager';
|
|
118
118
|
|
|
119
119
|
const App = () => {
|
|
120
120
|
return (
|
|
@@ -126,9 +126,9 @@ const App = () => {
|
|
|
126
126
|
|
|
127
127
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
128
128
|
<React.StrictMode>
|
|
129
|
-
<
|
|
129
|
+
<ConfigManagerProvider configs={{ base: {}, modules: {} }}>
|
|
130
130
|
<App />
|
|
131
|
-
</
|
|
131
|
+
</ConfigManagerProvider>
|
|
132
132
|
</React.StrictMode>
|
|
133
133
|
);
|
|
134
134
|
```
|
|
@@ -144,181 +144,105 @@ const MyComponent = () => {
|
|
|
144
144
|
const config = useConfig('admin'); // Optionnel: nom du module
|
|
145
145
|
|
|
146
146
|
// Récupérer une valeur avec chemin pointé
|
|
147
|
-
const appName = config.
|
|
148
|
-
const apiTimeout = config.
|
|
147
|
+
const appName = config.cf('app.name');
|
|
148
|
+
const apiTimeout = config.cf('api.timeout');
|
|
149
149
|
|
|
150
150
|
// Récupérer avec valeur par défaut
|
|
151
|
-
const debugMode = config.
|
|
151
|
+
const debugMode = config.cf('app.debug', { defaultValue: false });
|
|
152
152
|
|
|
153
|
-
// Récupérer
|
|
154
|
-
const
|
|
153
|
+
// Récupérer toute la configuration du module
|
|
154
|
+
const adminConfig = config.getConfig('admin');
|
|
155
155
|
|
|
156
|
-
// Vérifier
|
|
157
|
-
const
|
|
156
|
+
// Vérifier si le module est chargé
|
|
157
|
+
const isModuleLoaded = config.isModuleLoaded;
|
|
158
158
|
|
|
159
|
-
//
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
// Accès aux variables d'environnement
|
|
163
|
-
const nodeEnv = config.getEnv('NODE_ENV');
|
|
164
|
-
const apiUrl = config.getEnv('apiUrl'); // VITE_API_URL
|
|
159
|
+
// Recharger les configurations
|
|
160
|
+
const handleReload = () => config.reloadConfig();
|
|
165
161
|
|
|
166
162
|
return (
|
|
167
163
|
<div>
|
|
168
164
|
<h1>{appName}</h1>
|
|
169
165
|
<p>API Timeout: {apiTimeout}ms</p>
|
|
170
|
-
<p>
|
|
166
|
+
<p>Module chargé: {isModuleLoaded ? 'Oui' : 'Non'}</p>
|
|
167
|
+
<button onClick={handleReload}>Recharger la configuration</button>
|
|
171
168
|
</div>
|
|
172
169
|
);
|
|
173
170
|
};
|
|
174
171
|
```
|
|
175
172
|
|
|
176
|
-
|
|
173
|
+
## 🛠️ Configuration du Provider
|
|
177
174
|
|
|
178
175
|
```typescript
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
);
|
|
176
|
+
// App.tsx
|
|
177
|
+
import { ConfigManagerProvider } from '@arc-js/config-manager';
|
|
178
|
+
|
|
179
|
+
// Configuration avec chargeurs dynamiques
|
|
180
|
+
const configs = {
|
|
181
|
+
base: {
|
|
182
|
+
main: async () => (await import('./config.json')).default,
|
|
183
|
+
env: async () => ({
|
|
184
|
+
apiUrl: import.meta.env.VITE_API_URL,
|
|
185
|
+
nodeEnv: import.meta.env.NODE_ENV
|
|
186
|
+
})
|
|
187
|
+
},
|
|
188
|
+
modules: {
|
|
189
|
+
admin: async () => (await import('./modules/admin/config.json')).default,
|
|
190
|
+
dashboard: async () => (await import('./modules/dashboard/config.json')).default
|
|
191
|
+
}
|
|
196
192
|
};
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
### Modifier une configuration
|
|
200
193
|
|
|
201
|
-
|
|
202
|
-
const SettingsPanel = () => {
|
|
203
|
-
const config = useConfig();
|
|
204
|
-
|
|
205
|
-
const toggleDebug = () => {
|
|
206
|
-
const currentDebug = config.get('app.debug', { defaultValue: false });
|
|
207
|
-
config.set('app.debug', !currentDebug);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
const updateApiConfig = () => {
|
|
211
|
-
config.merge({
|
|
212
|
-
api: {
|
|
213
|
-
timeout: 60000,
|
|
214
|
-
retryAttempts: 5
|
|
215
|
-
}
|
|
216
|
-
}, 'admin'); // Appliquer uniquement au module admin
|
|
217
|
-
};
|
|
218
|
-
|
|
194
|
+
const App = () => {
|
|
219
195
|
return (
|
|
220
|
-
<
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
</button>
|
|
224
|
-
<button onClick={updateApiConfig}>
|
|
225
|
-
Update API Settings
|
|
226
|
-
</button>
|
|
227
|
-
</div>
|
|
196
|
+
<ConfigManagerProvider configs={configs}>
|
|
197
|
+
{/* Votre application */}
|
|
198
|
+
</ConfigManagerProvider>
|
|
228
199
|
);
|
|
229
200
|
};
|
|
230
201
|
```
|
|
231
202
|
|
|
232
203
|
## 🔧 Utilisation Avancée
|
|
233
204
|
|
|
234
|
-
###
|
|
235
|
-
|
|
236
|
-
```bash
|
|
237
|
-
# .env
|
|
238
|
-
VITE_API_URL=https://api.example.com
|
|
239
|
-
VITE_APP_NAME="My App"
|
|
240
|
-
VITE_DEBUG=true
|
|
241
|
-
NODE_ENV=development
|
|
242
|
-
```
|
|
205
|
+
### Accès aux variables d'environnement
|
|
243
206
|
|
|
244
207
|
```typescript
|
|
245
208
|
const EnvironmentInfo = () => {
|
|
246
209
|
const config = useConfig();
|
|
247
210
|
|
|
248
|
-
// Accès aux variables
|
|
249
|
-
const apiUrl = config.
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
// Ou via le module ENV
|
|
253
|
-
const viteApiUrl = config.get('apiUrl', { moduleName: 'ENV' });
|
|
254
|
-
|
|
255
|
-
// Vérifier l'environnement
|
|
256
|
-
const isProd = config.isProduction();
|
|
257
|
-
const isDev = config.isDevelopment();
|
|
258
|
-
const isTest = config.isTest();
|
|
211
|
+
// Accès aux variables via le module 'env'
|
|
212
|
+
const apiUrl = config.cf('apiUrl', { moduleName: 'env' });
|
|
213
|
+
const nodeEnv = config.cf('nodeEnv', { moduleName: 'env' });
|
|
259
214
|
|
|
260
215
|
return (
|
|
261
216
|
<div>
|
|
262
217
|
<h2>Environment Configuration</h2>
|
|
263
218
|
<p>API URL: {apiUrl}</p>
|
|
264
|
-
<p>
|
|
265
|
-
<p>Mode: {isProd ? 'Production' : isDev ? 'Development' : 'Test'}</p>
|
|
219
|
+
<p>Node Environment: {nodeEnv}</p>
|
|
266
220
|
</div>
|
|
267
221
|
);
|
|
268
222
|
};
|
|
269
223
|
```
|
|
270
224
|
|
|
271
|
-
###
|
|
272
|
-
|
|
273
|
-
```json
|
|
274
|
-
// src/modules/complex/config.json
|
|
275
|
-
{
|
|
276
|
-
"database": {
|
|
277
|
-
"connections": {
|
|
278
|
-
"primary": {
|
|
279
|
-
"host": "localhost",
|
|
280
|
-
"port": 5432,
|
|
281
|
-
"credentials": {
|
|
282
|
-
"username": "admin",
|
|
283
|
-
"password": "secret"
|
|
284
|
-
},
|
|
285
|
-
"options": {
|
|
286
|
-
"ssl": true,
|
|
287
|
-
"pool": {
|
|
288
|
-
"max": 20,
|
|
289
|
-
"min": 5,
|
|
290
|
-
"idleTimeout": 30000
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
},
|
|
294
|
-
"replica": {
|
|
295
|
-
"host": "replica.local",
|
|
296
|
-
"port": 5432
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
```
|
|
225
|
+
### Chargement asynchrone de module
|
|
302
226
|
|
|
303
227
|
```typescript
|
|
304
|
-
const
|
|
305
|
-
const config = useConfig(
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
228
|
+
const LazyModule = () => {
|
|
229
|
+
const config = useConfig();
|
|
230
|
+
const [moduleConfig, setModuleConfig] = useState(null);
|
|
231
|
+
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
// Charger un module spécifique à la demande
|
|
234
|
+
config.loadModuleConfig('analytics').then(() => {
|
|
235
|
+
const analyticsConfig = config.getConfig('analytics');
|
|
236
|
+
setModuleConfig(analyticsConfig);
|
|
237
|
+
});
|
|
238
|
+
}, []);
|
|
239
|
+
|
|
240
|
+
if (!moduleConfig) return <div>Chargement du module...</div>;
|
|
314
241
|
|
|
315
242
|
return (
|
|
316
243
|
<div>
|
|
317
|
-
<h3>
|
|
318
|
-
<
|
|
319
|
-
<p>Max Pool Connections: {poolMax}</p>
|
|
320
|
-
<p>SSL: {sslEnabled ? 'Enabled' : 'Disabled'}</p>
|
|
321
|
-
<pre>{JSON.stringify(credentials, null, 2)}</pre>
|
|
244
|
+
<h3>Configuration Analytics</h3>
|
|
245
|
+
<pre>{JSON.stringify(moduleConfig, null, 2)}</pre>
|
|
322
246
|
</div>
|
|
323
247
|
);
|
|
324
248
|
};
|
|
@@ -326,7 +250,7 @@ const DatabaseConfig = () => {
|
|
|
326
250
|
|
|
327
251
|
## 🎯 Exemples Complets
|
|
328
252
|
|
|
329
|
-
### Exemple 1 : Configuration d'API
|
|
253
|
+
### Exemple 1 : Configuration d'API
|
|
330
254
|
|
|
331
255
|
```typescript
|
|
332
256
|
import { useConfig } from '@arc-js/config-manager';
|
|
@@ -335,14 +259,12 @@ const ApiClient = () => {
|
|
|
335
259
|
const config = useConfig();
|
|
336
260
|
|
|
337
261
|
const getApiConfig = () => {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
defaultValue: 'http://localhost:3000'
|
|
342
|
-
});
|
|
262
|
+
const baseUrl = config.cf('api.baseUrl', {
|
|
263
|
+
defaultValue: 'http://localhost:3000'
|
|
264
|
+
});
|
|
343
265
|
|
|
344
|
-
const timeout = config.
|
|
345
|
-
const retryAttempts = config.
|
|
266
|
+
const timeout = config.cf('api.timeout', { defaultValue: 30000 });
|
|
267
|
+
const retryAttempts = config.cf('api.retryAttempts', { defaultValue: 3 });
|
|
346
268
|
|
|
347
269
|
return { baseUrl, timeout, retryAttempts };
|
|
348
270
|
};
|
|
@@ -351,13 +273,17 @@ const ApiClient = () => {
|
|
|
351
273
|
const { baseUrl, timeout } = getApiConfig();
|
|
352
274
|
|
|
353
275
|
try {
|
|
276
|
+
const controller = new AbortController();
|
|
277
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
278
|
+
|
|
354
279
|
const response = await fetch(`\${baseUrl}/data`, {
|
|
355
|
-
|
|
280
|
+
signal: controller.signal,
|
|
356
281
|
headers: {
|
|
357
282
|
'Content-Type': 'application/json'
|
|
358
283
|
}
|
|
359
284
|
});
|
|
360
285
|
|
|
286
|
+
clearTimeout(timeoutId);
|
|
361
287
|
return await response.json();
|
|
362
288
|
} catch (error) {
|
|
363
289
|
console.error('API Error:', error);
|
|
@@ -378,21 +304,23 @@ const ApiClient = () => {
|
|
|
378
304
|
### Exemple 2 : Feature flags modulaires
|
|
379
305
|
|
|
380
306
|
```typescript
|
|
381
|
-
import { useConfigValue } from '@arc-js/config-manager';
|
|
382
|
-
|
|
383
307
|
const FeatureComponent = ({ featureName, moduleName }: {
|
|
384
308
|
featureName: string,
|
|
385
309
|
moduleName?: string
|
|
386
310
|
}) => {
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
311
|
+
const config = useConfig(moduleName);
|
|
312
|
+
const [isEnabled, setIsEnabled] = useState(false);
|
|
313
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
314
|
+
|
|
315
|
+
useEffect(() => {
|
|
316
|
+
if (config.isModuleLoaded) {
|
|
317
|
+
const enabled = config.cf(`features.\${featureName}`, { defaultValue: false });
|
|
318
|
+
setIsEnabled(enabled);
|
|
319
|
+
setIsLoading(false);
|
|
392
320
|
}
|
|
393
|
-
);
|
|
394
|
-
|
|
395
|
-
if (isLoading) return <div>
|
|
321
|
+
}, [config.isModuleLoaded, featureName]);
|
|
322
|
+
|
|
323
|
+
if (isLoading) return <div>Chargement de la feature...</div>;
|
|
396
324
|
if (!isEnabled) return null;
|
|
397
325
|
|
|
398
326
|
return (
|
|
@@ -415,69 +343,58 @@ const AppFeatures = () => {
|
|
|
415
343
|
};
|
|
416
344
|
```
|
|
417
345
|
|
|
418
|
-
|
|
346
|
+
## 📋 API Reference
|
|
347
|
+
|
|
348
|
+
### ConfigManagerProvider
|
|
349
|
+
| Prop | Type | Description |
|
|
350
|
+
|------|------|-------------|
|
|
351
|
+
| `configs` | `ConfigManagerConfig` | Configuration des chargeurs de configuration |
|
|
352
|
+
| `children` | `React.ReactNode` | Composants enfants |
|
|
419
353
|
|
|
354
|
+
### Hook useConfig
|
|
355
|
+
Retourne un objet avec:
|
|
356
|
+
- `cf(key: string, options?: ConfigOptions)`: Récupère une valeur de configuration
|
|
357
|
+
- `getConfig(moduleName?: string)`: Récupère toute la configuration d'un module
|
|
358
|
+
- `reloadConfig()`: Recharge toutes les configurations
|
|
359
|
+
- `isLoading`: État de chargement global
|
|
360
|
+
- `isModuleLoaded`: Indique si le module demandé est chargé
|
|
361
|
+
- `loadModuleConfig(moduleName: string)`: Charge un module spécifique
|
|
362
|
+
|
|
363
|
+
### Options de Configuration
|
|
420
364
|
```typescript
|
|
421
|
-
|
|
422
|
-
|
|
365
|
+
interface ConfigOptions {
|
|
366
|
+
moduleName?: string; // Nom du module (défaut: 'base')
|
|
367
|
+
defaultValue?: any; // Valeur par défaut si non trouvé
|
|
368
|
+
pathSeparator?: string; // Séparateur de chemin (défaut: '.')
|
|
369
|
+
}
|
|
370
|
+
```
|
|
423
371
|
|
|
424
|
-
|
|
425
|
-
|
|
372
|
+
## 🛡️ Gestion des Erreurs
|
|
373
|
+
|
|
374
|
+
### Fallback sécurisé
|
|
375
|
+
```typescript
|
|
376
|
+
const SafeComponent = () => {
|
|
377
|
+
const config = useConfig();
|
|
426
378
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
const pageSize = config.get('pagination.pageSize', { defaultValue: 20 });
|
|
432
|
-
|
|
433
|
-
const response = await fetch(
|
|
434
|
-
`\${baseUrl}/users?limit=\${pageSize}`
|
|
435
|
-
);
|
|
436
|
-
|
|
437
|
-
if (!response.ok) throw new Error('Failed to fetch');
|
|
438
|
-
return response.json();
|
|
439
|
-
},
|
|
440
|
-
// Utiliser la config pour les options de requête
|
|
441
|
-
retry: config.get('api.retryAttempts', { defaultValue: 3 }),
|
|
442
|
-
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
443
|
-
enabled: config.get('features.dataFetching', { defaultValue: true })
|
|
379
|
+
// Utilisation sécurisée avec valeur par défaut
|
|
380
|
+
const importantValue = config.cf('important.path', {
|
|
381
|
+
defaultValue: 'valeur-par-defaut',
|
|
382
|
+
moduleName: 'admin'
|
|
444
383
|
});
|
|
445
384
|
|
|
446
|
-
|
|
447
|
-
|
|
385
|
+
// Vérifier avant utilisation
|
|
386
|
+
const adminConfig = config.getConfig('admin');
|
|
387
|
+
const hasRequiredConfig = 'requiredKey' in adminConfig;
|
|
448
388
|
|
|
449
|
-
|
|
450
|
-
<div>
|
|
451
|
-
<h2>Users</h2>
|
|
452
|
-
<ul>
|
|
453
|
-
{data?.users?.map(user => (
|
|
454
|
-
<li key={user.id}>{user.name}</li>
|
|
455
|
-
))}
|
|
456
|
-
</ul>
|
|
457
|
-
</div>
|
|
458
|
-
);
|
|
459
|
-
};
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
## 🔧 Configuration Avancée
|
|
463
|
-
|
|
464
|
-
### Configuration Vite
|
|
465
|
-
|
|
466
|
-
```typescript
|
|
467
|
-
// vite.config.ts
|
|
468
|
-
import { defineConfig } from 'vite';
|
|
469
|
-
import react from '@vitejs/plugin-react';
|
|
470
|
-
|
|
471
|
-
export default defineConfig({
|
|
472
|
-
plugins: [react()],
|
|
473
|
-
define: {
|
|
474
|
-
// Exposer les variables d'environnement
|
|
475
|
-
'import.meta.env': process.env
|
|
389
|
+
if (!hasRequiredConfig) {
|
|
390
|
+
return <div>Configuration manquante</div>;
|
|
476
391
|
}
|
|
477
|
-
|
|
392
|
+
|
|
393
|
+
return <div>Valeur: {importantValue}</div>;
|
|
394
|
+
};
|
|
478
395
|
```
|
|
479
396
|
|
|
480
|
-
|
|
397
|
+
## 🔧 Configuration TypeScript
|
|
481
398
|
|
|
482
399
|
```json
|
|
483
400
|
{
|
|
@@ -498,97 +415,6 @@ export default defineConfig({
|
|
|
498
415
|
}
|
|
499
416
|
```
|
|
500
417
|
|
|
501
|
-
### Scripts de validation
|
|
502
|
-
|
|
503
|
-
```json
|
|
504
|
-
{
|
|
505
|
-
"scripts": {
|
|
506
|
-
"validate-config": "node scripts/validate-config.js",
|
|
507
|
-
"generate-config-schema": "node scripts/generate-schema.js",
|
|
508
|
-
"check-env": "node scripts/check-environment.js"
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
## 📋 Table des Conventions
|
|
514
|
-
|
|
515
|
-
### Chemins de configuration
|
|
516
|
-
|
|
517
|
-
| Type | Format | Exemple |
|
|
518
|
-
|------|--------|---------|
|
|
519
|
-
| Pointé | `parent.child.grandchild` | `app.features.analytics` |
|
|
520
|
-
| Tableau | `['parent', 'child', 'grandchild']` | `['api', 'baseUrl']` |
|
|
521
|
-
| Mixte | Supporté | `app.features[0].name` |
|
|
522
|
-
|
|
523
|
-
### Fichiers de configuration
|
|
524
|
-
|
|
525
|
-
| Chemin | Portée | Priorité |
|
|
526
|
-
|--------|--------|----------|
|
|
527
|
-
| `src/config.json` | Globale | Base |
|
|
528
|
-
| `src/modules/*/config.json` | Module | Écrase la globale |
|
|
529
|
-
| `.env` / Variables | Environnement | Écrase tout |
|
|
530
|
-
|
|
531
|
-
### Variables d'environnement
|
|
532
|
-
|
|
533
|
-
| Variable | Conversion | Accès |
|
|
534
|
-
|----------|------------|-------|
|
|
535
|
-
| `VITE_API_URL` | `apiUrl` | `config.getEnv('apiUrl')` |
|
|
536
|
-
| `VITE_APP_NAME` | `appName` | `config.get('appName', {moduleName: 'ENV'})` |
|
|
537
|
-
| `NODE_ENV` | `nodeEnv` | `config.getEnv('NODE_ENV')` |
|
|
538
|
-
|
|
539
|
-
## 🛡️ Gestion des Erreurs
|
|
540
|
-
|
|
541
|
-
### Fallback et validation
|
|
542
|
-
|
|
543
|
-
```typescript
|
|
544
|
-
const SafeConfigAccess = () => {
|
|
545
|
-
const config = useConfig();
|
|
546
|
-
|
|
547
|
-
try {
|
|
548
|
-
// Cette méthode lève une exception si le chemin n'existe pas
|
|
549
|
-
const requiredValue = config.getOrThrow('required.path', 'admin');
|
|
550
|
-
|
|
551
|
-
return (
|
|
552
|
-
<div>
|
|
553
|
-
<p>Value: {requiredValue}</p>
|
|
554
|
-
</div>
|
|
555
|
-
);
|
|
556
|
-
} catch (error) {
|
|
557
|
-
return (
|
|
558
|
-
<div className="error">
|
|
559
|
-
<p>Configuration error: {(error as Error).message}</p>
|
|
560
|
-
<p>Using fallback configuration...</p>
|
|
561
|
-
</div>
|
|
562
|
-
);
|
|
563
|
-
}
|
|
564
|
-
};
|
|
565
|
-
```
|
|
566
|
-
|
|
567
|
-
### Logs en développement
|
|
568
|
-
|
|
569
|
-
```typescript
|
|
570
|
-
// Le service loggue automatiquement en mode développement
|
|
571
|
-
const DebugConfig = () => {
|
|
572
|
-
const config = useConfig();
|
|
573
|
-
const isDev = config.isDevelopment();
|
|
574
|
-
|
|
575
|
-
if (isDev) {
|
|
576
|
-
// Afficher toute la configuration en dev
|
|
577
|
-
console.log('Current Configuration:', config.getAll());
|
|
578
|
-
|
|
579
|
-
// Vérifier les chemins manquants
|
|
580
|
-
const missingPaths = ['app.name', 'api.baseUrl', 'unknown.path'];
|
|
581
|
-
missingPaths.forEach(path => {
|
|
582
|
-
if (!config.has(path)) {
|
|
583
|
-
console.warn(`Missing config path: \${path}`);
|
|
584
|
-
}
|
|
585
|
-
});
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
return null;
|
|
589
|
-
};
|
|
590
|
-
```
|
|
591
|
-
|
|
592
418
|
## 📄 Licence
|
|
593
419
|
|
|
594
420
|
MIT License - Voir le fichier [LICENSE](LICENSE) pour plus de détails.
|
package/config.d.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
declare const DEFAULT_CONFIG = "base";
|
|
2
|
+
interface ConfigMap {
|
|
3
|
+
[key: string]: () => Promise<Record<string, any>>;
|
|
4
|
+
}
|
|
5
|
+
interface ModuleConfigs {
|
|
6
|
+
[moduleName: string]: () => Promise<Record<string, any>>;
|
|
7
|
+
}
|
|
8
|
+
interface ConfigData {
|
|
9
|
+
base: ConfigMap;
|
|
10
|
+
modules?: ModuleConfigs;
|
|
11
|
+
}
|
|
12
|
+
type ConfigManagerConfig = ConfigData;
|
|
13
|
+
declare let configManagerConfig: ConfigManagerConfig | null;
|
|
14
|
+
declare const setConfigManagerConfig: (config: ConfigManagerConfig) => void;
|
|
11
15
|
|
|
12
|
-
export {
|
|
13
|
-
export type {
|
|
16
|
+
export { DEFAULT_CONFIG, configManagerConfig, setConfigManagerConfig };
|
|
17
|
+
export type { ConfigData, ConfigManagerConfig, ConfigMap, ModuleConfigs };
|