@gzl10/ts-helpers 4.2.1
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/CHANGELOG.md +320 -0
- package/README.md +233 -0
- package/USAGE-GUIDE.md +800 -0
- package/dist/browser/async.js +15 -0
- package/dist/browser/async.js.map +1 -0
- package/dist/browser/chunk-4O7ZPIJN.js +383 -0
- package/dist/browser/chunk-4O7ZPIJN.js.map +1 -0
- package/dist/browser/chunk-75XNTC34.js +60 -0
- package/dist/browser/chunk-75XNTC34.js.map +1 -0
- package/dist/browser/chunk-C3D7YZVE.js +299 -0
- package/dist/browser/chunk-C3D7YZVE.js.map +1 -0
- package/dist/browser/chunk-CZL6C2EI.js +452 -0
- package/dist/browser/chunk-CZL6C2EI.js.map +1 -0
- package/dist/browser/chunk-D4FZFIVA.js +240 -0
- package/dist/browser/chunk-D4FZFIVA.js.map +1 -0
- package/dist/browser/chunk-IL7NG7IC.js +72 -0
- package/dist/browser/chunk-IL7NG7IC.js.map +1 -0
- package/dist/browser/chunk-NSBPE2FW.js +17 -0
- package/dist/browser/chunk-NSBPE2FW.js.map +1 -0
- package/dist/browser/chunk-SLQVNPTH.js +27 -0
- package/dist/browser/chunk-SLQVNPTH.js.map +1 -0
- package/dist/browser/chunk-WG7ILCUB.js +195 -0
- package/dist/browser/chunk-WG7ILCUB.js.map +1 -0
- package/dist/browser/chunk-WJA4JDMZ.js +278 -0
- package/dist/browser/chunk-WJA4JDMZ.js.map +1 -0
- package/dist/browser/chunk-ZFVYLUTT.js +65 -0
- package/dist/browser/chunk-ZFVYLUTT.js.map +1 -0
- package/dist/browser/chunk-ZYTSVMTI.js +263 -0
- package/dist/browser/chunk-ZYTSVMTI.js.map +1 -0
- package/dist/browser/dates.js +78 -0
- package/dist/browser/dates.js.map +1 -0
- package/dist/browser/environment-detection.js +21 -0
- package/dist/browser/environment-detection.js.map +1 -0
- package/dist/browser/environment.js +34 -0
- package/dist/browser/environment.js.map +1 -0
- package/dist/browser/errors.js +18 -0
- package/dist/browser/errors.js.map +1 -0
- package/dist/browser/index.js +412 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/math.js +51 -0
- package/dist/browser/math.js.map +1 -0
- package/dist/browser/number.js +10 -0
- package/dist/browser/number.js.map +1 -0
- package/dist/browser/objects.js +31 -0
- package/dist/browser/objects.js.map +1 -0
- package/dist/browser/strings.js +80 -0
- package/dist/browser/strings.js.map +1 -0
- package/dist/browser/validation-core.js +54 -0
- package/dist/browser/validation-core.js.map +1 -0
- package/dist/browser/validation-crypto.js +28 -0
- package/dist/browser/validation-crypto.js.map +1 -0
- package/dist/browser/validators.js +98 -0
- package/dist/browser/validators.js.map +1 -0
- package/dist/cjs/async.js +86 -0
- package/dist/cjs/async.js.map +1 -0
- package/dist/cjs/dates.js +285 -0
- package/dist/cjs/dates.js.map +1 -0
- package/dist/cjs/environment-detection.js +84 -0
- package/dist/cjs/environment-detection.js.map +1 -0
- package/dist/cjs/environment.js +261 -0
- package/dist/cjs/environment.js.map +1 -0
- package/dist/cjs/errors.js +80 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +2035 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/math.js +388 -0
- package/dist/cjs/math.js.map +1 -0
- package/dist/cjs/number.js +37 -0
- package/dist/cjs/number.js.map +1 -0
- package/dist/cjs/objects.js +249 -0
- package/dist/cjs/objects.js.map +1 -0
- package/dist/cjs/strings.js +253 -0
- package/dist/cjs/strings.js.map +1 -0
- package/dist/cjs/validation.js +450 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/async.js +15 -0
- package/dist/esm/async.js.map +1 -0
- package/dist/esm/chunk-4O7ZPIJN.js +383 -0
- package/dist/esm/chunk-4O7ZPIJN.js.map +1 -0
- package/dist/esm/chunk-75XNTC34.js +60 -0
- package/dist/esm/chunk-75XNTC34.js.map +1 -0
- package/dist/esm/chunk-BDOBKBKA.js +72 -0
- package/dist/esm/chunk-BDOBKBKA.js.map +1 -0
- package/dist/esm/chunk-C3D7YZVE.js +299 -0
- package/dist/esm/chunk-C3D7YZVE.js.map +1 -0
- package/dist/esm/chunk-CZL6C2EI.js +452 -0
- package/dist/esm/chunk-CZL6C2EI.js.map +1 -0
- package/dist/esm/chunk-EBLSTOEC.js +263 -0
- package/dist/esm/chunk-EBLSTOEC.js.map +1 -0
- package/dist/esm/chunk-NSBPE2FW.js +17 -0
- package/dist/esm/chunk-NSBPE2FW.js.map +1 -0
- package/dist/esm/chunk-SLQVNPTH.js +27 -0
- package/dist/esm/chunk-SLQVNPTH.js.map +1 -0
- package/dist/esm/chunk-WG7ILCUB.js +195 -0
- package/dist/esm/chunk-WG7ILCUB.js.map +1 -0
- package/dist/esm/chunk-WJA4JDMZ.js +278 -0
- package/dist/esm/chunk-WJA4JDMZ.js.map +1 -0
- package/dist/esm/chunk-ZFVYLUTT.js +65 -0
- package/dist/esm/chunk-ZFVYLUTT.js.map +1 -0
- package/dist/esm/dates.js +78 -0
- package/dist/esm/dates.js.map +1 -0
- package/dist/esm/environment-detection.js +21 -0
- package/dist/esm/environment-detection.js.map +1 -0
- package/dist/esm/environment.js +34 -0
- package/dist/esm/environment.js.map +1 -0
- package/dist/esm/errors.js +18 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +380 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/math.js +51 -0
- package/dist/esm/math.js.map +1 -0
- package/dist/esm/number.js +10 -0
- package/dist/esm/number.js.map +1 -0
- package/dist/esm/objects.js +31 -0
- package/dist/esm/objects.js.map +1 -0
- package/dist/esm/strings.js +80 -0
- package/dist/esm/strings.js.map +1 -0
- package/dist/esm/validation.js +54 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/node/async.js +93 -0
- package/dist/node/async.js.map +1 -0
- package/dist/node/csv.js +102 -0
- package/dist/node/csv.js.map +1 -0
- package/dist/node/data.js +880 -0
- package/dist/node/data.js.map +1 -0
- package/dist/node/dates.js +324 -0
- package/dist/node/dates.js.map +1 -0
- package/dist/node/environment.js +278 -0
- package/dist/node/environment.js.map +1 -0
- package/dist/node/errors.js +89 -0
- package/dist/node/errors.js.map +1 -0
- package/dist/node/index.js +3151 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/json.js +107 -0
- package/dist/node/json.js.map +1 -0
- package/dist/node/math.js +413 -0
- package/dist/node/math.js.map +1 -0
- package/dist/node/number.js +42 -0
- package/dist/node/number.js.map +1 -0
- package/dist/node/objects.js +264 -0
- package/dist/node/objects.js.map +1 -0
- package/dist/node/strings.js +293 -0
- package/dist/node/strings.js.map +1 -0
- package/dist/node/tree.js +89 -0
- package/dist/node/tree.js.map +1 -0
- package/dist/node/validation-core.js +477 -0
- package/dist/node/validation-core.js.map +1 -0
- package/dist/node/validation-crypto.js +179 -0
- package/dist/node/validation-crypto.js.map +1 -0
- package/dist/node/validation.js +677 -0
- package/dist/node/validation.js.map +1 -0
- package/dist/node/validators.js +123 -0
- package/dist/node/validators.js.map +1 -0
- package/dist/node-esm/async.js +15 -0
- package/dist/node-esm/async.js.map +1 -0
- package/dist/node-esm/chunk-3YOF7NPT.js +299 -0
- package/dist/node-esm/chunk-3YOF7NPT.js.map +1 -0
- package/dist/node-esm/chunk-64TBXJQS.js +263 -0
- package/dist/node-esm/chunk-64TBXJQS.js.map +1 -0
- package/dist/node-esm/chunk-75XNTC34.js +60 -0
- package/dist/node-esm/chunk-75XNTC34.js.map +1 -0
- package/dist/node-esm/chunk-C4PKXIPB.js +278 -0
- package/dist/node-esm/chunk-C4PKXIPB.js.map +1 -0
- package/dist/node-esm/chunk-CMDFZME3.js +452 -0
- package/dist/node-esm/chunk-CMDFZME3.js.map +1 -0
- package/dist/node-esm/chunk-DZZPUYMP.js +74 -0
- package/dist/node-esm/chunk-DZZPUYMP.js.map +1 -0
- package/dist/node-esm/chunk-HTSEHRHI.js +195 -0
- package/dist/node-esm/chunk-HTSEHRHI.js.map +1 -0
- package/dist/node-esm/chunk-JCAUVOPH.js +27 -0
- package/dist/node-esm/chunk-JCAUVOPH.js.map +1 -0
- package/dist/node-esm/chunk-KBHE3K2F.js +505 -0
- package/dist/node-esm/chunk-KBHE3K2F.js.map +1 -0
- package/dist/node-esm/chunk-LYTET5NX.js +65 -0
- package/dist/node-esm/chunk-LYTET5NX.js.map +1 -0
- package/dist/node-esm/chunk-PZ5AY32C.js +10 -0
- package/dist/node-esm/chunk-PZ5AY32C.js.map +1 -0
- package/dist/node-esm/chunk-UKGXL2QO.js +383 -0
- package/dist/node-esm/chunk-UKGXL2QO.js.map +1 -0
- package/dist/node-esm/chunk-XAEYT23H.js +164 -0
- package/dist/node-esm/chunk-XAEYT23H.js.map +1 -0
- package/dist/node-esm/csv.js +63 -0
- package/dist/node-esm/csv.js.map +1 -0
- package/dist/node-esm/data.js +32 -0
- package/dist/node-esm/data.js.map +1 -0
- package/dist/node-esm/dates.js +78 -0
- package/dist/node-esm/dates.js.map +1 -0
- package/dist/node-esm/environment.js +34 -0
- package/dist/node-esm/environment.js.map +1 -0
- package/dist/node-esm/errors.js +18 -0
- package/dist/node-esm/errors.js.map +1 -0
- package/dist/node-esm/index.js +426 -0
- package/dist/node-esm/index.js.map +1 -0
- package/dist/node-esm/json.js +68 -0
- package/dist/node-esm/json.js.map +1 -0
- package/dist/node-esm/math.js +51 -0
- package/dist/node-esm/math.js.map +1 -0
- package/dist/node-esm/number.js +10 -0
- package/dist/node-esm/number.js.map +1 -0
- package/dist/node-esm/objects.js +31 -0
- package/dist/node-esm/objects.js.map +1 -0
- package/dist/node-esm/strings.js +80 -0
- package/dist/node-esm/strings.js.map +1 -0
- package/dist/node-esm/tree.js +8 -0
- package/dist/node-esm/tree.js.map +1 -0
- package/dist/node-esm/validation-core.js +54 -0
- package/dist/node-esm/validation-core.js.map +1 -0
- package/dist/node-esm/validation-crypto.js +26 -0
- package/dist/node-esm/validation-crypto.js.map +1 -0
- package/dist/node-esm/validation.js +606 -0
- package/dist/node-esm/validation.js.map +1 -0
- package/dist/node-esm/validators.js +98 -0
- package/dist/node-esm/validators.js.map +1 -0
- package/dist/types/async-C8gvbSG-.d.ts +453 -0
- package/dist/types/async.d.ts +1 -0
- package/dist/types/csv.d.ts +226 -0
- package/dist/types/data.d.ts +1561 -0
- package/dist/types/dates-hTiE0Z11.d.ts +298 -0
- package/dist/types/dates.d.ts +1 -0
- package/dist/types/environment-B8eLS7KT.d.ts +420 -0
- package/dist/types/environment-detection.d.ts +102 -0
- package/dist/types/environment.d.ts +1 -0
- package/dist/types/errors.d.ts +147 -0
- package/dist/types/index.d.ts +211 -0
- package/dist/types/json.d.ts +284 -0
- package/dist/types/math-BQ9Lwdp7.d.ts +2060 -0
- package/dist/types/math.d.ts +1 -0
- package/dist/types/number-CYnQfLWj.d.ts +44 -0
- package/dist/types/number.d.ts +1 -0
- package/dist/types/objects-BohS8GCS.d.ts +1185 -0
- package/dist/types/objects.d.ts +1 -0
- package/dist/types/strings-CiqRPYLL.d.ts +1349 -0
- package/dist/types/strings.d.ts +1 -0
- package/dist/types/tree.d.ts +284 -0
- package/dist/types/validation-core-DfHF8rCG.d.ts +238 -0
- package/dist/types/validation-crypto-browser.d.ts +56 -0
- package/dist/types/validation-crypto-node.d.ts +31 -0
- package/dist/types/validation.d.ts +1 -0
- package/dist/types/validators.d.ts +216 -0
- package/package.json +253 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 4.2.0 (2025-10-06)
|
|
4
|
+
|
|
5
|
+
### 🚨 BREAKING CHANGES
|
|
6
|
+
|
|
7
|
+
**Environment Detection Mejorada** - Detección explícita de entornos test, development y non-production
|
|
8
|
+
|
|
9
|
+
#### ⚠️ Breaking Change: `isDevelopment()`
|
|
10
|
+
|
|
11
|
+
`isDevelopment()` ahora retorna `false` en entorno `test` (antes retornaba `true`)
|
|
12
|
+
|
|
13
|
+
**Antes (v4.1.0)**:
|
|
14
|
+
```typescript
|
|
15
|
+
// NODE_ENV=test
|
|
16
|
+
isDevelopment() // true (incluía test)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Ahora (v4.2.0)**:
|
|
20
|
+
```typescript
|
|
21
|
+
// NODE_ENV=test
|
|
22
|
+
isDevelopment() // false (excluye test)
|
|
23
|
+
isTest() // true
|
|
24
|
+
isNonProduction() // true (comportamiento anterior de isDevelopment)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
#### Migración recomendada
|
|
28
|
+
|
|
29
|
+
Si tu código dependía de `isDevelopment()` para incluir tests, migrar a `isNonProduction()`:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// ❌ Antes - isDevelopment() incluía test
|
|
33
|
+
if (isDevelopment()) {
|
|
34
|
+
enableDebugMode() // Se ejecutaba en dev Y test
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ✅ Ahora - usar isNonProduction() para mismo comportamiento
|
|
38
|
+
if (isNonProduction()) {
|
|
39
|
+
enableDebugMode() // Se ejecuta en dev, test y undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ✅ O específicamente por entorno
|
|
43
|
+
if (isDevelopment()) {
|
|
44
|
+
enableHotReload() // Solo development
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (isTest()) {
|
|
48
|
+
mockExternalAPIs() // Solo tests
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### ✨ Nuevas funciones
|
|
53
|
+
|
|
54
|
+
#### `isTest()` - Detección explícita de entorno test
|
|
55
|
+
|
|
56
|
+
Detecta si la aplicación está corriendo en modo test (`NODE_ENV=test`).
|
|
57
|
+
Vitest y Jest establecen automáticamente esta variable.
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { isTest } from '@g10/ts-helpers'
|
|
61
|
+
|
|
62
|
+
if (isTest()) {
|
|
63
|
+
// Solo en tests
|
|
64
|
+
loadTestFixtures()
|
|
65
|
+
mockExternalAPIs()
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### `isNonProduction()` - Detección de entornos no-producción
|
|
70
|
+
|
|
71
|
+
Retorna `true` para development, test, undefined o cualquier entorno que NO sea production.
|
|
72
|
+
Útil para habilitar debugging, logging o features de desarrollo en todos los entornos no-producción.
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { isNonProduction } from '@g10/ts-helpers'
|
|
76
|
+
|
|
77
|
+
if (isNonProduction()) {
|
|
78
|
+
// En dev, test y undefined
|
|
79
|
+
console.log('Debug mode enabled')
|
|
80
|
+
enableVerboseLogging()
|
|
81
|
+
allowSelfSignedCertificates()
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 📊 Matriz de comportamiento
|
|
86
|
+
|
|
87
|
+
| Función | `development` | `test` | `production` | `undefined` |
|
|
88
|
+
|---------|--------------|--------|--------------|-------------|
|
|
89
|
+
| `isDevelopment()` | ✅ true | ❌ false | ❌ false | ✅ true |
|
|
90
|
+
| `isTest()` | ❌ false | ✅ true | ❌ false | ❌ false |
|
|
91
|
+
| `isProduction()` | ❌ false | ❌ false | ✅ true | ❌ false |
|
|
92
|
+
| `isNonProduction()` | ✅ true | ✅ true | ❌ false | ✅ true |
|
|
93
|
+
|
|
94
|
+
### 🧪 Testing
|
|
95
|
+
|
|
96
|
+
- ✅ **600 tests** pasando (100%)
|
|
97
|
+
- ✅ Nuevas suites de tests para `isTest()` e `isNonProduction()`
|
|
98
|
+
- ✅ Tests actualizados para `isDevelopment()` con `NODE_ENV=test` y `undefined`
|
|
99
|
+
- ✅ Tests adicionales para `isProduction()` cubriendo todos los casos
|
|
100
|
+
|
|
101
|
+
### 📚 Documentación
|
|
102
|
+
|
|
103
|
+
- ✅ **JSDoc completo** para `isTest()` e `isNonProduction()` con múltiples ejemplos
|
|
104
|
+
- ✅ **README.md** actualizado con breaking changes y guía de migración
|
|
105
|
+
- ✅ **JSDOC-STATUS.md** actualizado (82+ funciones documentadas)
|
|
106
|
+
- ✅ **CLAUDE.md** actualizado con estado v4.2.0
|
|
107
|
+
|
|
108
|
+
### 🎯 Justificación
|
|
109
|
+
|
|
110
|
+
Esta mejora proporciona:
|
|
111
|
+
- **Semántica clara**: `isDevelopment()` realmente significa "solo development"
|
|
112
|
+
- **Flexibilidad**: `isTest()` permite comportamiento específico en tests
|
|
113
|
+
- **Compatibilidad**: `isNonProduction()` mantiene el comportamiento anterior
|
|
114
|
+
- **Mejores prácticas**: Separación explícita entre entornos dev, test y prod
|
|
115
|
+
|
|
116
|
+
## 4.1.0
|
|
117
|
+
|
|
118
|
+
### Minor Changes
|
|
119
|
+
|
|
120
|
+
- caa9a3f: Nuevas funciones para manejo de configuración y variables de entorno
|
|
121
|
+
|
|
122
|
+
## 🆕 Nuevas funciones
|
|
123
|
+
|
|
124
|
+
### **P0 - Alta prioridad**
|
|
125
|
+
- **`parseEnvValue(str)`** ([environment.ts](src/environment.ts))
|
|
126
|
+
- Convierte strings de variables de entorno a tipos nativos (boolean,
|
|
127
|
+
number, array, JSON)
|
|
128
|
+
- Soporta: booleans ('true', 'yes', '1'), numbers, JSON, arrays separados
|
|
129
|
+
por comas
|
|
130
|
+
- Ejemplo: `parseEnvValue('true')` → `true`, `parseEnvValue('[1,2,3]')` →
|
|
131
|
+
`[1,2,3]`
|
|
132
|
+
- **`setDeepValue(obj, path, value)`** y
|
|
133
|
+
**`getDeepValue(obj, path, defaultValue?)`** ([objects.ts](src/objects.ts))
|
|
134
|
+
- Manipulación de objetos anidados con dot notation
|
|
135
|
+
- Reemplaza `lodash.set()` y `lodash.get()` con implementación nativa
|
|
136
|
+
- Ejemplo: `setDeepValue(config, 'database.host', 'localhost')`
|
|
137
|
+
|
|
138
|
+
### **P1/P2 - Funcionalidad complementaria**
|
|
139
|
+
- **`matchPathPattern(path, pattern)`** ([strings.ts](src/strings.ts))
|
|
140
|
+
- Match de paths con wildcards (`features.*`)
|
|
141
|
+
- Útil para configuración, routing, permisos
|
|
142
|
+
- **`isValidDotNotationPath(path)`** ([validation.ts](src/validation.ts))
|
|
143
|
+
- Valida formato de path en dot-notation
|
|
144
|
+
- Detecta dots consecutivos, leading/trailing dots, caracteres inválidos
|
|
145
|
+
- **`envKeyToPath(envKey, prefix?)`** y **`pathToEnvKey(path, prefix?)`**
|
|
146
|
+
([strings.ts](src/strings.ts))
|
|
147
|
+
- Conversión entre env vars y dot-notation paths
|
|
148
|
+
- Ejemplo: `envKeyToPath('NX_FEATURES_AUTH')` → `'features.auth'`
|
|
149
|
+
- Ejemplo: `pathToEnvKey('features.auth')` → `'NX_FEATURES_AUTH'`
|
|
150
|
+
|
|
151
|
+
## ✅ Calidad
|
|
152
|
+
- ✅ **437 tests passing** (100% cobertura de nuevas funciones)
|
|
153
|
+
- ✅ **TypeScript strict mode** compatible
|
|
154
|
+
- ✅ **JSDoc completo** para IntelliSense
|
|
155
|
+
- ✅ **Tree-shaking** optimizado
|
|
156
|
+
- ✅ **Browser + Node.js** compatible
|
|
157
|
+
|
|
158
|
+
## 📖 Documentación
|
|
159
|
+
- Ejemplos de uso completos en JSDoc
|
|
160
|
+
- Tests unitarios como documentación ejecutable
|
|
161
|
+
- Casos de uso real-world incluidos
|
|
162
|
+
|
|
163
|
+
## 4.0.7
|
|
164
|
+
|
|
165
|
+
### Patch Changes
|
|
166
|
+
|
|
167
|
+
- Añade función isNumericValue para validar valores numéricos o convertibles a
|
|
168
|
+
número
|
|
169
|
+
- Nueva función `g.isNumericValue()` en API plana
|
|
170
|
+
- Acepta números (5) y strings numéricas ("5", "12.34", "-42")
|
|
171
|
+
- Rechaza valores no numéricos (null, undefined, NaN, Infinity, strings no
|
|
172
|
+
numéricas)
|
|
173
|
+
- Disponible tanto en API plana como import específico
|
|
174
|
+
- Compatible con todos los entornos (Browser/Node.js)
|
|
175
|
+
|
|
176
|
+
## 4.0.6
|
|
177
|
+
|
|
178
|
+
### Patch Changes
|
|
179
|
+
|
|
180
|
+
- feat: Certificación universal multi-environment completa
|
|
181
|
+
- ✅ CERTIFICACIÓN UNIVERSAL: Library completamente compatible con Browser +
|
|
182
|
+
Node.js + Worker environments
|
|
183
|
+
- 🏗️ Multi-environment builds: Universal (65.5KB CJS, 6.7KB ESM), Node.js
|
|
184
|
+
(97.9KB CJS, 7.5KB ESM), Browser (7.4KB ESM)
|
|
185
|
+
- 🔒 Environment guards: Funciones crypto con detección automática y fallbacks
|
|
186
|
+
seguros
|
|
187
|
+
- 📦 Exports condicionales: Resolución automática según entorno de ejecución
|
|
188
|
+
- 🧪 Testing completo: 100% compatibilidad verificada en todos los bundlers y
|
|
189
|
+
entornos
|
|
190
|
+
- ⚡ ESM compatibility: Fixes para iso-datestring-validator y lodash imports
|
|
191
|
+
- 🎯 Production ready: Librería universal certificada lista para uso en
|
|
192
|
+
cualquier proyecto JavaScript/TypeScript
|
|
193
|
+
|
|
194
|
+
## 4.0.5
|
|
195
|
+
|
|
196
|
+
### Patch Changes
|
|
197
|
+
|
|
198
|
+
- Deprecar detectFormatFromFilename en favor de detectFileExtension para mayor
|
|
199
|
+
claridad de API
|
|
200
|
+
|
|
201
|
+
## 4.0.1
|
|
202
|
+
|
|
203
|
+
### Patch Changes
|
|
204
|
+
|
|
205
|
+
- fix: Corregir extensión de archivos de tipos de .d.mts a .d.ts
|
|
206
|
+
|
|
207
|
+
Solucionado problema en la configuración de tsup que generaba archivos de
|
|
208
|
+
tipos con extensión .d.mts en lugar de .d.ts, causando errores de importación
|
|
209
|
+
de tipos en TypeScript.
|
|
210
|
+
|
|
211
|
+
## 4.0.0
|
|
212
|
+
|
|
213
|
+
### Major Changes
|
|
214
|
+
|
|
215
|
+
- BREAKING CHANGE: Arquitectura v4.0.0 - API plana revolucionaria
|
|
216
|
+
- API PLANA: Acceso directo g.validateNIF() vs
|
|
217
|
+
g.validation.validators.validateNIF()
|
|
218
|
+
- BREAKING: Eliminada estructura anidada técnica (src/lib/core/,
|
|
219
|
+
src/lib/primitives/)
|
|
220
|
+
- NUEVA ARQUITECTURA: 8 archivos consolidados por dominio funcional
|
|
221
|
+
- OPTIMIZACIÓN: Build 70-90% más rápido con tsup vs TypeScript
|
|
222
|
+
- DEPENDENCIAS: 31% menos deps (12→10), eliminadas re-exportaciones
|
|
223
|
+
- BUNDLE: 69% reducción (603KB→185KB) con tree-shaking preservado
|
|
224
|
+
- TESTS: 270 tests completamente refactorizados y optimizados
|
|
225
|
+
- TOOLING: Migración completa pnpm + changeset + vitest
|
|
226
|
+
- PERFORMANCE: Watch mode hasta 10x más rápido en desarrollo
|
|
227
|
+
|
|
228
|
+
Migración desde v3.x: Ver USAGE-GUIDE.md para ejemplos de API plana.
|
|
229
|
+
|
|
230
|
+
## 3.2.5
|
|
231
|
+
|
|
232
|
+
### Patch Changes
|
|
233
|
+
|
|
234
|
+
- Corrección de errores en tests
|
|
235
|
+
- Strings: Corregidas funciones toCamelCase, toKebabCase y countOccurrences
|
|
236
|
+
- Validation: Valores de test NIE/CIF corregidos y URL validation para
|
|
237
|
+
localhost
|
|
238
|
+
- Math: NPV calculation corregido con valor esperado matemáticamente correcto
|
|
239
|
+
- Data: Configuración de mocks mejorada para importTxt
|
|
240
|
+
- Objects: hasSameType y getShallowProperties funcionando correctamente
|
|
241
|
+
- Environment: Detección mejorada para tests con global.window/document
|
|
242
|
+
- Errors: TsHelpersError y DataError con parámetros corregidos
|
|
243
|
+
- Number: roundToDecimals manejo correcto de números negativos
|
|
244
|
+
|
|
245
|
+
270/270 tests pasando correctamente.
|
|
246
|
+
|
|
247
|
+
## [3.2.4] - 2025-01-15
|
|
248
|
+
|
|
249
|
+
### 🚀 BREAKING CHANGES
|
|
250
|
+
|
|
251
|
+
#### API Simplificada
|
|
252
|
+
|
|
253
|
+
- **API Plana**: Todas las funciones ahora disponibles en un solo nivel
|
|
254
|
+
- ✅ `g.validateNIF()` (vs ❌ `g.validation.validators.validateNIF()`)
|
|
255
|
+
- ✅ `g.generateSpanishNIF()` (vs ❌
|
|
256
|
+
`g.validation.generators.generateSpanishNIF()`)
|
|
257
|
+
- ✅ `g.toCamelCase()` (vs ❌ `g.primitives.string.toCamelCase()`)
|
|
258
|
+
- ✅ `g.sleep()` (vs ❌ `g.core.async.sleep()`)
|
|
259
|
+
|
|
260
|
+
#### Dependencias Eliminadas
|
|
261
|
+
|
|
262
|
+
- **Removidas re-exportaciones**: Ya no se incluyen `lodash`, `axios`, `dayjs`,
|
|
263
|
+
`numeral`, `qs`, `ms`
|
|
264
|
+
- **Implementaciones nativas**: Reemplazadas dependencias externas con código
|
|
265
|
+
nativo
|
|
266
|
+
- **31% menos dependencias**: De 12 → 10 dependencias runtime
|
|
267
|
+
|
|
268
|
+
#### Arquitectura Consolidada
|
|
269
|
+
|
|
270
|
+
- **Estructura simplificada**: 8 archivos consolidados vs 25+ archivos modulares
|
|
271
|
+
- **Eliminados**: `src/lib/core/`, `src/lib/primitives/`, `src/lib/specialized/`
|
|
272
|
+
- **Nuevos módulos**: `src/validation.ts`, `src/strings.ts`, `src/objects.ts`,
|
|
273
|
+
etc.
|
|
274
|
+
|
|
275
|
+
### ⚡ Performance
|
|
276
|
+
|
|
277
|
+
#### Build System Moderno
|
|
278
|
+
|
|
279
|
+
- **tsup vs TypeScript Compiler**: 70-90% más rápido (~40ms vs ~45s)
|
|
280
|
+
- **Configuración unificada**: 1 archivo `tsup.config.ts` vs 4 configs
|
|
281
|
+
TypeScript
|
|
282
|
+
- **Tree-shaking optimizado**: Automático en todos los formatos
|
|
283
|
+
|
|
284
|
+
#### Bundle Optimization
|
|
285
|
+
|
|
286
|
+
- **69% reducción tamaño**: De 603KB → 185KB
|
|
287
|
+
- **Eliminación código muerto**: Implementaciones nativas más eficientes
|
|
288
|
+
- **Formatos optimizados**: CJS, ESM, DTS en paralelo
|
|
289
|
+
|
|
290
|
+
### 🔧 Migración a pnpm
|
|
291
|
+
|
|
292
|
+
- **Package manager moderno**: npm → pnpm para mejor resolución dependencias
|
|
293
|
+
- **Lockfile eficiente**: `pnpm-lock.yaml` vs `package-lock.json`
|
|
294
|
+
- **Engine constraints**: Node.js >=18.0.0, pnpm >=8.0.0
|
|
295
|
+
|
|
296
|
+
### 🧹 Testing Eliminado
|
|
297
|
+
|
|
298
|
+
- **Jest removido**: Eliminadas todas las dependencias y configuraciones de
|
|
299
|
+
testing
|
|
300
|
+
- **Scripts simplificados**: `quality` script sin tests
|
|
301
|
+
- **Enfoque producción**: Librería lista para uso sin overhead de testing
|
|
302
|
+
|
|
303
|
+
### 📦 Exports Actualizados
|
|
304
|
+
|
|
305
|
+
- **Eliminados legacy exports**: `./core`, `./primitives`, `./specialized`
|
|
306
|
+
- **Mantenidos específicos**: `./validation`, `./strings`, `./objects`,
|
|
307
|
+
`./dates`, `./math`, `./async`, `./data`
|
|
308
|
+
- **Tree-shaking preservado**: Importaciones específicas funcionando
|
|
309
|
+
|
|
310
|
+
### 📝 Documentación
|
|
311
|
+
|
|
312
|
+
- **README.md actualizado**: Nueva API, ejemplos, migración
|
|
313
|
+
- **USAGE-GUIDE.md actualizado**: Guía completa con nuevos patrones
|
|
314
|
+
- **CLAUDE.md actualizado**: Estado actual y comandos de desarrollo
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
**Migración requerida**: Esta versión incluye cambios que rompen compatibilidad.
|
|
319
|
+
Consulta la [guía de migración](README.md#migración-desde-v2x) para actualizar
|
|
320
|
+
tu código.
|
package/README.md
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# @gzl10/ts-helpers
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@gzl10/ts-helpers)
|
|
4
|
+
[](https://gitlab.gzl10.com/oss/ts-helpers/-/pipelines)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
**Librería universal de utilidades TypeScript certificada para todos los
|
|
8
|
+
entornos JavaScript modernos.**
|
|
9
|
+
|
|
10
|
+
🚀 **v4.1.0** - NUEVAS FUNCIONES: Manejo avanzado de configuración, parsing de
|
|
11
|
+
env vars y manipulación de objetos anidados.
|
|
12
|
+
|
|
13
|
+
## 🌍 CERTIFICACIÓN UNIVERSAL v4.0.6
|
|
14
|
+
|
|
15
|
+
**@gzl10/ts-helpers** está **oficialmente certificada** como librería universal
|
|
16
|
+
compatible con **todos los entornos JavaScript modernos**:
|
|
17
|
+
|
|
18
|
+
### 🎯 Compatibilidad Total
|
|
19
|
+
|
|
20
|
+
- ✅ **Navegadores modernos** (Chrome, Firefox, Safari, Edge)
|
|
21
|
+
- ✅ **Node.js** (v18+) con funcionalidades completas
|
|
22
|
+
- ✅ **Web Workers** y **Service Workers**
|
|
23
|
+
- ✅ **Bundlers** (Webpack, Vite, Rollup, Parcel)
|
|
24
|
+
- ✅ **Frameworks** (React, Vue, Angular, Svelte)
|
|
25
|
+
|
|
26
|
+
### 🏗️ Builds Multi-Environment
|
|
27
|
+
|
|
28
|
+
- **Universal Build**: 65.5KB CJS, 6.7KB ESM (crypto-free, browser-safe)
|
|
29
|
+
- **Node.js Build**: 97.9KB CJS, 7.5KB ESM (crypto completo + operaciones de
|
|
30
|
+
archivo)
|
|
31
|
+
- **Browser Build**: 7.4KB ESM (Web Crypto API + fallbacks seguros)
|
|
32
|
+
|
|
33
|
+
### 🔒 Environment Guards
|
|
34
|
+
|
|
35
|
+
- Detección automática de entorno (Node.js/Browser/Worker)
|
|
36
|
+
- Fallbacks seguros para APIs no disponibles
|
|
37
|
+
- Exports condicionales automáticos según entorno
|
|
38
|
+
|
|
39
|
+
## ✨ Características v4.1.0
|
|
40
|
+
|
|
41
|
+
### 🆕 Novedades v4.1.0
|
|
42
|
+
|
|
43
|
+
- **⚙️ Configuración Avanzada**: Parsing de env vars, acceso a objetos anidados
|
|
44
|
+
con dot notation
|
|
45
|
+
- **🔍 Path Matching**: Wildcards para configuración, routing y permisos
|
|
46
|
+
(`features.*`)
|
|
47
|
+
- **🔄 Conversión Env Vars**: Transformación bidireccional env keys ↔ dot
|
|
48
|
+
notation paths
|
|
49
|
+
- **✅ Validación Paths**: Validación robusta de paths en dot notation
|
|
50
|
+
|
|
51
|
+
### v4.0.x Foundation
|
|
52
|
+
|
|
53
|
+
- **🎯 API Plana Revolucionaria**: Acceso directo (`g.validateNIF()` vs
|
|
54
|
+
`g.validation.validators.validateNIF()`)
|
|
55
|
+
- **⚡ Performance Extrema**: Build 70-90% más rápido (~40ms vs ~45s), bundle
|
|
56
|
+
69% menor (603KB→185KB)
|
|
57
|
+
- **🌲 Tree-shaking Optimizado**: Importaciones específicas por módulo
|
|
58
|
+
preservadas
|
|
59
|
+
- **📦 Arquitectura Consolidada**: 15 módulos exportados por dominio
|
|
60
|
+
- **🔧 Tooling Moderno**: pnpm + changeset + vitest + tsup
|
|
61
|
+
- **🌐 Environment Detection**: Detección avanzada Node.js/Browser con soporte
|
|
62
|
+
proxy
|
|
63
|
+
- **🇪🇸 Validación Española**: 150+ funciones - NIF, NIE, CIF, teléfonos, IBAN
|
|
64
|
+
- **📊 Manejo de Datos**: CSV, JSON, Tree con detección automática de formato
|
|
65
|
+
- **📁 Detección Universal**: 80+ formatos con categorización inteligente
|
|
66
|
+
- **✅ Testing Compatible**: Exports optimizados para Vitest y bundlers modernos
|
|
67
|
+
- **📚 Documentación JSDoc 100%**: 80+ funciones con ejemplos profesionales y
|
|
68
|
+
casos de uso reales
|
|
69
|
+
|
|
70
|
+
## Instalación
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Con pnpm (recomendado)
|
|
74
|
+
pnpm add @gzl10/ts-helpers
|
|
75
|
+
|
|
76
|
+
# Con npm
|
|
77
|
+
npm install @gzl10/ts-helpers
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Uso
|
|
81
|
+
|
|
82
|
+
### API Plana v4.0.0 (Recomendado)
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import g from '@gzl10/ts-helpers'
|
|
86
|
+
|
|
87
|
+
// 🚀 API completamente plana - sin anidación
|
|
88
|
+
g.validateNIF('12345678Z') // ✅ Validación española
|
|
89
|
+
g.generateSpanishNIF() // ✅ Generadores
|
|
90
|
+
g.toCamelCase('hello-world') // ✅ String manipulation
|
|
91
|
+
g.calculateNPV([-1000, 300, 400]) // ✅ Matemáticas financieras
|
|
92
|
+
g.sleep(1000) // ✅ Operaciones async
|
|
93
|
+
g.exportData(data, 'file.csv') // ✅ Import/export datos
|
|
94
|
+
g.deepEqual(obj1, obj2) // ✅ Comparación objetos
|
|
95
|
+
g.formatNow('DD/MM/YYYY') // ✅ Fechas con dayjs
|
|
96
|
+
|
|
97
|
+
// 🆕 v4.1.0 - Configuración y env vars
|
|
98
|
+
g.parseEnvValue('true') // true (boolean)
|
|
99
|
+
g.parseEnvValue('[1,2,3]') // [1,2,3] (array)
|
|
100
|
+
g.setDeepValue(config, 'database.host', 'localhost')
|
|
101
|
+
g.getDeepValue(config, 'database.port', 5432)
|
|
102
|
+
g.matchPathPattern('features.auth', 'features.*') // true
|
|
103
|
+
g.isValidDotNotationPath('db.host') // true
|
|
104
|
+
g.envKeyToPath('NX_FEATURES_AUTH') // 'features.auth'
|
|
105
|
+
g.pathToEnvKey('features.auth') // 'NX_FEATURES_AUTH'
|
|
106
|
+
|
|
107
|
+
// 🆕 Detección de entorno mejorada (v4.2.0)
|
|
108
|
+
g.isDevelopment() // true solo en development (excluye test)
|
|
109
|
+
g.isTest() // true en tests (Vitest/Jest)
|
|
110
|
+
g.isProduction() // true en producción
|
|
111
|
+
g.isNonProduction() // true en dev, test, undefined
|
|
112
|
+
g.detectProtocol(req) // 'https' con soporte proxy
|
|
113
|
+
g.isLocalhost('localhost') // true
|
|
114
|
+
console.log(g.isNode) // true en Node.js
|
|
115
|
+
|
|
116
|
+
// Detección universal de formatos (80+ tipos)
|
|
117
|
+
g.detectFileExtension('report.xlsx') // 'xlsx'
|
|
118
|
+
g.detectUniversalFormat('presentation.pptx')
|
|
119
|
+
// { extension: 'pptx', category: 'presentation', mimeType: '...', isText: false }
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Importaciones Específicas (Tree-shaking)
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// 🌲 Para bundles mínimos - importa solo lo que necesitas
|
|
126
|
+
import { validateNIF, generateSpanishNIF } from '@gzl10/ts-helpers/validation'
|
|
127
|
+
import { exportData, importData } from '@gzl10/ts-helpers/data'
|
|
128
|
+
import { parseEnvValue } from '@gzl10/ts-helpers/environment'
|
|
129
|
+
import { setDeepValue, getDeepValue } from '@gzl10/ts-helpers/objects'
|
|
130
|
+
import {
|
|
131
|
+
matchPathPattern,
|
|
132
|
+
envKeyToPath,
|
|
133
|
+
pathToEnvKey,
|
|
134
|
+
} from '@gzl10/ts-helpers/strings'
|
|
135
|
+
import { isValidDotNotationPath } from '@gzl10/ts-helpers/validation'
|
|
136
|
+
import { toCamelCase, sanitizeString } from '@gzl10/ts-helpers/strings'
|
|
137
|
+
import { sleep, runBatch } from '@gzl10/ts-helpers/async'
|
|
138
|
+
import { calculateNPV, calculateIRR } from '@gzl10/ts-helpers/math'
|
|
139
|
+
import { formatNow, addDays } from '@gzl10/ts-helpers/dates'
|
|
140
|
+
import { deepEqual, updateArrayElementsBy } from '@gzl10/ts-helpers/objects'
|
|
141
|
+
import {
|
|
142
|
+
isDevelopment,
|
|
143
|
+
isTest,
|
|
144
|
+
isProduction,
|
|
145
|
+
isNonProduction,
|
|
146
|
+
detectProtocol,
|
|
147
|
+
} from '@gzl10/ts-helpers/environment'
|
|
148
|
+
import {
|
|
149
|
+
detectFileExtension,
|
|
150
|
+
detectUniversalFormat,
|
|
151
|
+
} from '@gzl10/ts-helpers/data'
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 🔄 Migración
|
|
155
|
+
|
|
156
|
+
### 🆕 v4.2.0 - Detección de entorno mejorada
|
|
157
|
+
|
|
158
|
+
**⚠️ BREAKING CHANGE**: `isDevelopment()` ahora retorna `false` en entorno
|
|
159
|
+
`test`
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// ❌ Antes (v4.1.0)
|
|
163
|
+
if (isDevelopment()) {
|
|
164
|
+
// Se ejecutaba en dev Y test
|
|
165
|
+
enableDebugMode()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ✅ Ahora (v4.2.0) - Opciones según necesidad
|
|
169
|
+
if (isDevelopment()) {
|
|
170
|
+
// Solo en development (excluye test)
|
|
171
|
+
enableHotReload()
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (isTest()) {
|
|
175
|
+
// Solo en tests
|
|
176
|
+
mockExternalAPIs()
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (isNonProduction()) {
|
|
180
|
+
// En dev, test y undefined (comportamiento anterior de isDevelopment)
|
|
181
|
+
enableDebugMode()
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### 🔄 Migración desde v3.x
|
|
186
|
+
|
|
187
|
+
**BREAKING CHANGES v4.0.0**
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// ❌ v3.x - API anidada redundante
|
|
191
|
+
g.validation.validators.validateNIF('12345678Z')
|
|
192
|
+
g.primitives.string.toCamelCase('hello-world')
|
|
193
|
+
g.core.async.sleep(1000)
|
|
194
|
+
|
|
195
|
+
// ✅ v4.0.0 - API plana directa
|
|
196
|
+
g.validateNIF('12345678Z')
|
|
197
|
+
g.toCamelCase('hello-world')
|
|
198
|
+
g.sleep(1000)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Dependencias Eliminadas**
|
|
202
|
+
|
|
203
|
+
Las re-exportaciones fueron eliminadas. Instala por separado si las necesitas:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
npm install lodash axios dayjs numeral qs ms
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 📚 Documentación
|
|
210
|
+
|
|
211
|
+
- **[USAGE-GUIDE.md](USAGE-GUIDE.md)** - 📖 Guía técnica completa con 150+
|
|
212
|
+
funciones
|
|
213
|
+
- **[CHANGELOG.md](CHANGELOG.md)** - 📝 Historial de cambios detallado
|
|
214
|
+
- **[GitLab Issues](https://gitlab.gzl10.com/oss/ts-helpers/-/issues)** - 🐛
|
|
215
|
+
Reportar bugs
|
|
216
|
+
|
|
217
|
+
## 🛠️ Desarrollo
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
pnpm install # Instalar dependencias
|
|
221
|
+
pnpm run build # Build (~40ms)
|
|
222
|
+
pnpm test # 600+ tests
|
|
223
|
+
pnpm run quality # lint + format + build
|
|
224
|
+
pnpm release:prepare # Changeset
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## ☕ Support
|
|
228
|
+
|
|
229
|
+
<a href="https://www.buymeacoffee.com/gzl10g" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
|
|
230
|
+
|
|
231
|
+
## 📄 Licencia
|
|
232
|
+
|
|
233
|
+
MIT © [Gonzalo Díez](mailto:gonzalo@gzl10.com)
|