@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
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File and security validators
|
|
3
|
+
*
|
|
4
|
+
* This module provides validation functions for file operations and content security.
|
|
5
|
+
* Functions implement basic security checks to prevent common attack vectors:
|
|
6
|
+
* - Path traversal attacks (../, ..\)
|
|
7
|
+
* - XSS injection (script tags, javascript: URLs)
|
|
8
|
+
* - File size limits
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ WARNING: These are basic validations. For production systems, consider:
|
|
11
|
+
* - Additional OS-specific path validation
|
|
12
|
+
* - Symbolic link resolution checking
|
|
13
|
+
* - Comprehensive XSS prevention libraries (e.g., DOMPurify)
|
|
14
|
+
* - Content-Type validation
|
|
15
|
+
* - Virus scanning for uploaded files
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Validates file path for security vulnerabilities
|
|
19
|
+
*
|
|
20
|
+
* Protects against common path traversal attacks by checking for:
|
|
21
|
+
* - Parent directory references (../, ..\)
|
|
22
|
+
* - Mixed path separators (//\, \\)
|
|
23
|
+
* - Excessive path length (>1000 chars)
|
|
24
|
+
* - Empty or null paths
|
|
25
|
+
*
|
|
26
|
+
* ⚠️ SECURITY NOTE: This is basic validation. For production use, consider:
|
|
27
|
+
* - Validating against an allowed directory whitelist
|
|
28
|
+
* - Resolving symbolic links
|
|
29
|
+
* - OS-specific path rules (Windows vs Unix)
|
|
30
|
+
* - Canonicalization before validation
|
|
31
|
+
*
|
|
32
|
+
* @param filePath - File path string to validate
|
|
33
|
+
* @returns True if path appears safe, false if potentially dangerous
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // Safe paths - Allowed
|
|
38
|
+
* isValidFilePath('./data/users.json') // true
|
|
39
|
+
* isValidFilePath('data/users.json') // true
|
|
40
|
+
* isValidFilePath('/absolute/path/file.txt') // true
|
|
41
|
+
* isValidFilePath('C:\\Users\\data\\file.txt') // true
|
|
42
|
+
*
|
|
43
|
+
* // Dangerous paths - Path traversal attacks
|
|
44
|
+
* isValidFilePath('../../../etc/passwd') // false
|
|
45
|
+
* isValidFilePath('data/../../../etc/passwd') // false
|
|
46
|
+
* isValidFilePath('..\\..\\..\\windows\\system32\\config') // false
|
|
47
|
+
* isValidFilePath('data//\\..//config') // false
|
|
48
|
+
*
|
|
49
|
+
* // Invalid paths - Malformed
|
|
50
|
+
* isValidFilePath('') // false
|
|
51
|
+
* isValidFilePath(null as any) // false
|
|
52
|
+
* isValidFilePath(undefined as any) // false
|
|
53
|
+
* isValidFilePath('x'.repeat(1001)) // false (too long)
|
|
54
|
+
*
|
|
55
|
+
* // Real-world usage in file operations
|
|
56
|
+
* async function readUserFile(userPath: string) {
|
|
57
|
+
* if (!isValidFilePath(userPath)) {
|
|
58
|
+
* throw new Error('Invalid or unsafe file path detected')
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* // Additional check: ensure path is within allowed directory
|
|
62
|
+
* const allowedDir = '/var/app/uploads'
|
|
63
|
+
* const fullPath = path.join(allowedDir, userPath)
|
|
64
|
+
*
|
|
65
|
+
* return fs.readFile(fullPath, 'utf-8')
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @see {@link isValidTextContent} for content security validation
|
|
70
|
+
* @see {@link isValidFileSize} for file size validation
|
|
71
|
+
*/
|
|
72
|
+
declare function isValidFilePath(filePath: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Validates file size against a maximum limit
|
|
75
|
+
*
|
|
76
|
+
* Checks if a file size is valid (non-negative) and within acceptable limits.
|
|
77
|
+
* Used to prevent:
|
|
78
|
+
* - Denial of Service (DoS) attacks via large file uploads
|
|
79
|
+
* - Disk space exhaustion
|
|
80
|
+
* - Memory overflow during file processing
|
|
81
|
+
*
|
|
82
|
+
* @param size - File size in bytes to validate
|
|
83
|
+
* @param maxSize - Maximum allowed size in bytes
|
|
84
|
+
* @returns True if size is valid and within limit, false otherwise
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* // Common size limits
|
|
89
|
+
* const KB = 1024
|
|
90
|
+
* const MB = 1024 * KB
|
|
91
|
+
* const GB = 1024 * MB
|
|
92
|
+
*
|
|
93
|
+
* // Image upload validation (5 MB limit)
|
|
94
|
+
* const imageSize = 4 * MB
|
|
95
|
+
* isValidFileSize(imageSize, 5 * MB) // true
|
|
96
|
+
*
|
|
97
|
+
* // Document upload validation (10 MB limit)
|
|
98
|
+
* const docSize = 12 * MB
|
|
99
|
+
* isValidFileSize(docSize, 10 * MB) // false (exceeds limit)
|
|
100
|
+
*
|
|
101
|
+
* // Video upload validation (1 GB limit)
|
|
102
|
+
* const videoSize = 500 * MB
|
|
103
|
+
* isValidFileSize(videoSize, 1 * GB) // true
|
|
104
|
+
*
|
|
105
|
+
* // Invalid sizes
|
|
106
|
+
* isValidFileSize(-100, 1 * MB) // false (negative size)
|
|
107
|
+
* isValidFileSize(NaN, 1 * MB) // false (invalid number)
|
|
108
|
+
* isValidFileSize('1000' as any, 1 * MB) // false (not a number)
|
|
109
|
+
*
|
|
110
|
+
* // Real-world usage in file upload handler
|
|
111
|
+
* app.post('/upload', (req, res) => {
|
|
112
|
+
* const file = req.files.document
|
|
113
|
+
* const maxSize = 10 * 1024 * 1024 // 10 MB
|
|
114
|
+
*
|
|
115
|
+
* if (!isValidFileSize(file.size, maxSize)) {
|
|
116
|
+
* return res.status(413).json({
|
|
117
|
+
* error: 'File too large',
|
|
118
|
+
* maxSize: '10 MB',
|
|
119
|
+
* received: `${(file.size / (1024 * 1024)).toFixed(2)} MB`
|
|
120
|
+
* })
|
|
121
|
+
* }
|
|
122
|
+
*
|
|
123
|
+
* // Process file...
|
|
124
|
+
* })
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* @see {@link isValidFilePath} for path security validation
|
|
128
|
+
*/
|
|
129
|
+
declare function isValidFileSize(size: number, maxSize: number): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Validates text content for security vulnerabilities and size limits
|
|
132
|
+
*
|
|
133
|
+
* Performs basic security checks on text content to detect common XSS attack vectors:
|
|
134
|
+
* - Script tags (<script>)
|
|
135
|
+
* - JavaScript URLs (javascript:)
|
|
136
|
+
* - Data URLs with HTML (data:text/html)
|
|
137
|
+
* - VBScript URLs (vbscript:)
|
|
138
|
+
*
|
|
139
|
+
* Also enforces maximum content length to prevent DoS attacks.
|
|
140
|
+
*
|
|
141
|
+
* ⚠️ WARNING: This is basic XSS detection. For production systems:
|
|
142
|
+
* - Use dedicated sanitization libraries (DOMPurify, sanitize-html)
|
|
143
|
+
* - Implement Content Security Policy (CSP)
|
|
144
|
+
* - Apply output encoding based on context (HTML, JS, URL)
|
|
145
|
+
* - Validate against allowlists, not just blocklists
|
|
146
|
+
*
|
|
147
|
+
* @param content - Text content to validate
|
|
148
|
+
* @param options - Validation options
|
|
149
|
+
* @param options.maxLength - Maximum content length in characters (default: 1,000,000)
|
|
150
|
+
* @returns True if content appears safe, false if dangerous patterns detected
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* // Safe content - Allowed
|
|
155
|
+
* isValidTextContent('Hello, world!') // true
|
|
156
|
+
* isValidTextContent('User input: <b>bold</b>') // true
|
|
157
|
+
* isValidTextContent('Email: user@example.com') // true
|
|
158
|
+
*
|
|
159
|
+
* // Dangerous content - XSS vectors detected
|
|
160
|
+
* isValidTextContent('<script>alert("XSS")</script>') // false
|
|
161
|
+
* isValidTextContent('<img src=x onerror="alert(1)">') // false (contains 'script' in onerror)
|
|
162
|
+
* isValidTextContent('<a href="javascript:void(0)">') // false
|
|
163
|
+
* isValidTextContent('<iframe src="data:text/html,..."') // false
|
|
164
|
+
* isValidTextContent('vbscript:msgbox("XSS")') // false
|
|
165
|
+
*
|
|
166
|
+
* // Size limit validation
|
|
167
|
+
* isValidTextContent('x'.repeat(999_999)) // true (under default 1M limit)
|
|
168
|
+
* isValidTextContent('x'.repeat(1_000_001)) // false (exceeds default limit)
|
|
169
|
+
* isValidTextContent('x'.repeat(5000), { maxLength: 1000 }) // false (custom limit)
|
|
170
|
+
*
|
|
171
|
+
* // Edge cases
|
|
172
|
+
* isValidTextContent('') // true (empty is valid)
|
|
173
|
+
* isValidTextContent(null as any) // false (not a string)
|
|
174
|
+
* isValidTextContent(undefined as any) // false (not a string)
|
|
175
|
+
* isValidTextContent(123 as any) // false (not a string)
|
|
176
|
+
*
|
|
177
|
+
* // Real-world usage in comment system
|
|
178
|
+
* app.post('/api/comments', (req, res) => {
|
|
179
|
+
* const { content } = req.body
|
|
180
|
+
*
|
|
181
|
+
* if (!isValidTextContent(content, { maxLength: 5000 })) {
|
|
182
|
+
* return res.status(400).json({
|
|
183
|
+
* error: 'Invalid comment content',
|
|
184
|
+
* details: 'Content contains dangerous patterns or exceeds 5000 characters'
|
|
185
|
+
* })
|
|
186
|
+
* }
|
|
187
|
+
*
|
|
188
|
+
* // Additional sanitization recommended
|
|
189
|
+
* const sanitized = DOMPurify.sanitize(content)
|
|
190
|
+
*
|
|
191
|
+
* // Save to database...
|
|
192
|
+
* })
|
|
193
|
+
* ```
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* // Form validation with custom limits
|
|
198
|
+
* function validateUserBio(bio: string): { valid: boolean; error?: string } {
|
|
199
|
+
* if (!isValidTextContent(bio, { maxLength: 500 })) {
|
|
200
|
+
* return {
|
|
201
|
+
* valid: false,
|
|
202
|
+
* error: 'Bio must be less than 500 characters and cannot contain scripts'
|
|
203
|
+
* }
|
|
204
|
+
* }
|
|
205
|
+
* return { valid: true }
|
|
206
|
+
* }
|
|
207
|
+
* ```
|
|
208
|
+
*
|
|
209
|
+
* @see {@link isValidFilePath} for file path validation
|
|
210
|
+
* @see sanitizeHtml from validation module for HTML sanitization
|
|
211
|
+
*/
|
|
212
|
+
declare function isValidTextContent(content: string, options?: {
|
|
213
|
+
maxLength?: number;
|
|
214
|
+
}): boolean;
|
|
215
|
+
|
|
216
|
+
export { isValidFilePath, isValidFileSize, isValidTextContent };
|
package/package.json
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gzl10/ts-helpers",
|
|
3
|
+
"version": "4.2.1",
|
|
4
|
+
"description": "Librería de utilidades TypeScript con herramientas especializadas para desarrollo web, validación española, manejo de datos y operaciones asíncronas.",
|
|
5
|
+
"main": "./dist/cjs/index.js",
|
|
6
|
+
"module": "./dist/esm/index.js",
|
|
7
|
+
"types": "./dist/types/index.d.ts",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=18.0.0",
|
|
10
|
+
"pnpm": ">=8.0.0"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"node": {
|
|
15
|
+
"types": "./dist/types/index.d.ts",
|
|
16
|
+
"import": "./dist/node-esm/index.js",
|
|
17
|
+
"require": "./dist/node/index.js"
|
|
18
|
+
},
|
|
19
|
+
"browser": {
|
|
20
|
+
"types": "./dist/types/index.d.ts",
|
|
21
|
+
"import": "./dist/browser/index.js"
|
|
22
|
+
},
|
|
23
|
+
"default": {
|
|
24
|
+
"types": "./dist/types/index.d.ts",
|
|
25
|
+
"import": "./dist/esm/index.js",
|
|
26
|
+
"require": "./dist/cjs/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"./node": {
|
|
30
|
+
"types": "./dist/types/index.d.ts",
|
|
31
|
+
"import": "./dist/node-esm/index.js",
|
|
32
|
+
"require": "./dist/node/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./browser": {
|
|
35
|
+
"types": "./dist/types/index.d.ts",
|
|
36
|
+
"import": "./dist/browser/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./universal": {
|
|
39
|
+
"types": "./dist/types/index.d.ts",
|
|
40
|
+
"import": "./dist/esm/index.js",
|
|
41
|
+
"require": "./dist/cjs/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./validation": {
|
|
44
|
+
"node": {
|
|
45
|
+
"types": "./dist/types/validation.d.ts",
|
|
46
|
+
"import": "./dist/node-esm/validation.js",
|
|
47
|
+
"require": "./dist/node/validation.js"
|
|
48
|
+
},
|
|
49
|
+
"browser": {
|
|
50
|
+
"types": "./dist/types/validation.d.ts",
|
|
51
|
+
"import": "./dist/browser/validation-core.js"
|
|
52
|
+
},
|
|
53
|
+
"default": {
|
|
54
|
+
"types": "./dist/types/validation.d.ts",
|
|
55
|
+
"import": "./dist/esm/validation.js",
|
|
56
|
+
"require": "./dist/cjs/validation.js"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"./validation-core": {
|
|
60
|
+
"types": "./dist/types/validation.d.ts",
|
|
61
|
+
"import": "./dist/esm/validation.js",
|
|
62
|
+
"require": "./dist/cjs/validation.js"
|
|
63
|
+
},
|
|
64
|
+
"./validation-crypto": {
|
|
65
|
+
"node": {
|
|
66
|
+
"types": "./dist/types/validation-crypto-node.d.ts",
|
|
67
|
+
"import": "./dist/node-esm/validation-crypto.js",
|
|
68
|
+
"require": "./dist/node/validation-crypto.js"
|
|
69
|
+
},
|
|
70
|
+
"browser": {
|
|
71
|
+
"types": "./dist/types/validation-crypto-browser.d.ts",
|
|
72
|
+
"import": "./dist/browser/validation-crypto.js"
|
|
73
|
+
},
|
|
74
|
+
"default": {
|
|
75
|
+
"types": "./dist/types/validation-crypto-browser.d.ts",
|
|
76
|
+
"import": "./dist/browser/validation-crypto.js"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"./environment-detection": {
|
|
80
|
+
"types": "./dist/types/environment-detection.d.ts",
|
|
81
|
+
"import": "./dist/esm/environment-detection.js",
|
|
82
|
+
"require": "./dist/cjs/environment-detection.js"
|
|
83
|
+
},
|
|
84
|
+
"./strings": {
|
|
85
|
+
"types": "./dist/types/strings.d.ts",
|
|
86
|
+
"import": "./dist/esm/strings.js",
|
|
87
|
+
"require": "./dist/cjs/strings.js"
|
|
88
|
+
},
|
|
89
|
+
"./objects": {
|
|
90
|
+
"types": "./dist/types/objects.d.ts",
|
|
91
|
+
"import": "./dist/esm/objects.js",
|
|
92
|
+
"require": "./dist/cjs/objects.js"
|
|
93
|
+
},
|
|
94
|
+
"./dates": {
|
|
95
|
+
"types": "./dist/types/dates.d.ts",
|
|
96
|
+
"import": "./dist/esm/dates.js",
|
|
97
|
+
"require": "./dist/cjs/dates.js"
|
|
98
|
+
},
|
|
99
|
+
"./math": {
|
|
100
|
+
"types": "./dist/types/math.d.ts",
|
|
101
|
+
"import": "./dist/esm/math.js",
|
|
102
|
+
"require": "./dist/cjs/math.js"
|
|
103
|
+
},
|
|
104
|
+
"./async": {
|
|
105
|
+
"types": "./dist/types/async.d.ts",
|
|
106
|
+
"import": "./dist/esm/async.js",
|
|
107
|
+
"require": "./dist/cjs/async.js"
|
|
108
|
+
},
|
|
109
|
+
"./data": {
|
|
110
|
+
"types": "./dist/types/data.d.ts",
|
|
111
|
+
"import": "./dist/node-esm/data.js",
|
|
112
|
+
"require": "./dist/node/data.js"
|
|
113
|
+
},
|
|
114
|
+
"./environment": {
|
|
115
|
+
"types": "./dist/types/environment.d.ts",
|
|
116
|
+
"import": "./dist/esm/environment.js",
|
|
117
|
+
"require": "./dist/cjs/environment.js"
|
|
118
|
+
},
|
|
119
|
+
"./errors": {
|
|
120
|
+
"types": "./dist/types/errors.d.ts",
|
|
121
|
+
"import": "./dist/esm/errors.js",
|
|
122
|
+
"require": "./dist/cjs/errors.js"
|
|
123
|
+
},
|
|
124
|
+
"./csv": {
|
|
125
|
+
"types": "./dist/types/csv.d.ts",
|
|
126
|
+
"import": "./dist/node-esm/csv.js",
|
|
127
|
+
"require": "./dist/node/csv.js"
|
|
128
|
+
},
|
|
129
|
+
"./json": {
|
|
130
|
+
"types": "./dist/types/json.d.ts",
|
|
131
|
+
"import": "./dist/node-esm/json.js",
|
|
132
|
+
"require": "./dist/node/json.js"
|
|
133
|
+
},
|
|
134
|
+
"./tree": {
|
|
135
|
+
"types": "./dist/types/tree.d.ts",
|
|
136
|
+
"import": "./dist/node-esm/tree.js",
|
|
137
|
+
"require": "./dist/node/tree.js"
|
|
138
|
+
},
|
|
139
|
+
"./validators": {
|
|
140
|
+
"types": "./dist/types/validators.d.ts",
|
|
141
|
+
"import": "./dist/node-esm/validators.js",
|
|
142
|
+
"require": "./dist/node/validators.js"
|
|
143
|
+
},
|
|
144
|
+
"./number": {
|
|
145
|
+
"types": "./dist/types/number.d.ts",
|
|
146
|
+
"import": "./dist/esm/number.js",
|
|
147
|
+
"require": "./dist/cjs/number.js"
|
|
148
|
+
},
|
|
149
|
+
"./package.json": "./package.json",
|
|
150
|
+
"./dist/*": "./dist/*"
|
|
151
|
+
},
|
|
152
|
+
"author": "Gonzalo Díez<gonzalo@gzl10.com>",
|
|
153
|
+
"repository": {
|
|
154
|
+
"type": "git",
|
|
155
|
+
"url": "https://gitlab.gzl10.com/oss/ts-helpers.git"
|
|
156
|
+
},
|
|
157
|
+
"homepage": "https://gitlab.gzl10.com/oss/ts-helpers",
|
|
158
|
+
"bugs": {
|
|
159
|
+
"url": "https://gitlab.gzl10.com/oss/ts-helpers/-/issues"
|
|
160
|
+
},
|
|
161
|
+
"license": "MIT",
|
|
162
|
+
"files": [
|
|
163
|
+
"dist/**/*.d.ts",
|
|
164
|
+
"dist/**/*.js",
|
|
165
|
+
"dist/**/*.map",
|
|
166
|
+
"README.md",
|
|
167
|
+
"USAGE-GUIDE.md",
|
|
168
|
+
"CHANGELOG.md"
|
|
169
|
+
],
|
|
170
|
+
"dependencies": {
|
|
171
|
+
"crc": "^4.3.2",
|
|
172
|
+
"dayjs": "^1.11.13",
|
|
173
|
+
"fast-deep-equal": "^3.1.3",
|
|
174
|
+
"iso-datestring-validator": "^2.2.2",
|
|
175
|
+
"lodash": "^4.17.21",
|
|
176
|
+
"numeral": "^2.0.6",
|
|
177
|
+
"papaparse": "^5.5.3",
|
|
178
|
+
"qs": "^6.14.0",
|
|
179
|
+
"tslib": "^2.8.1",
|
|
180
|
+
"validator": "^13.15.15"
|
|
181
|
+
},
|
|
182
|
+
"devDependencies": {
|
|
183
|
+
"@changesets/cli": "^2.29.7",
|
|
184
|
+
"@types/lodash": "^4.17.20",
|
|
185
|
+
"@types/node": "^20.19.13",
|
|
186
|
+
"@types/numeral": "^2.0.5",
|
|
187
|
+
"@types/papaparse": "^5.3.16",
|
|
188
|
+
"@types/qs": "^6.14.0",
|
|
189
|
+
"@typescript-eslint/eslint-plugin": "^8.44.0",
|
|
190
|
+
"@typescript-eslint/parser": "^8.44.0",
|
|
191
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
192
|
+
"@vitest/ui": "^3.2.4",
|
|
193
|
+
"eslint": "^9.34.0",
|
|
194
|
+
"eslint-config-prettier": "^9.1.2",
|
|
195
|
+
"eslint-plugin-compat": "^6.0.2",
|
|
196
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
197
|
+
"globals": "^16.3.0",
|
|
198
|
+
"jsdom": "^27.0.0",
|
|
199
|
+
"prettier": "^3.6.2",
|
|
200
|
+
"rimraf": "^6.0.1",
|
|
201
|
+
"tsup": "^8.5.0",
|
|
202
|
+
"typescript": "^5.9.2",
|
|
203
|
+
"typescript-eslint": "^8.44.0",
|
|
204
|
+
"vitest": "^3.2.4"
|
|
205
|
+
},
|
|
206
|
+
"browserslist": [
|
|
207
|
+
"Chrome >= 58"
|
|
208
|
+
],
|
|
209
|
+
"keywords": [
|
|
210
|
+
"typescript",
|
|
211
|
+
"utilities",
|
|
212
|
+
"helpers",
|
|
213
|
+
"spanish",
|
|
214
|
+
"tools",
|
|
215
|
+
"utils",
|
|
216
|
+
"dates",
|
|
217
|
+
"numbers",
|
|
218
|
+
"format",
|
|
219
|
+
"validation",
|
|
220
|
+
"web-development",
|
|
221
|
+
"async",
|
|
222
|
+
"data-import",
|
|
223
|
+
"data-export"
|
|
224
|
+
],
|
|
225
|
+
"scripts": {
|
|
226
|
+
"clean": "rimraf dist package-lock.json node_modules test-results",
|
|
227
|
+
"build": "tsup",
|
|
228
|
+
"build:cjs": "tsup --config tsup.config.ts --format cjs",
|
|
229
|
+
"build:esm": "tsup --config tsup.config.ts --format esm",
|
|
230
|
+
"build:types": "tsup --config tsup.config.ts --dts-only",
|
|
231
|
+
"build:watch": "tsup --watch",
|
|
232
|
+
"typecheck": "tsc --noEmit",
|
|
233
|
+
"lint": "eslint 'src/**/*.{ts,js,mjs}' 'tests/**/*.{ts,js}' --fix",
|
|
234
|
+
"lint:check": "eslint 'src/**/*.{ts,js,mjs}' 'tests/**/*.{ts,js}'",
|
|
235
|
+
"format": "prettier --write .",
|
|
236
|
+
"format:check": "prettier --check .",
|
|
237
|
+
"test": "vitest run",
|
|
238
|
+
"test:watch": "vitest",
|
|
239
|
+
"test:ui": "vitest --ui",
|
|
240
|
+
"test:coverage": "vitest run --coverage",
|
|
241
|
+
"test:report": "vitest run --reporter=html --reporter=junit && echo 'HTML report generated at test-results/index.html'",
|
|
242
|
+
"test:report:open": "vitest run --reporter=html --reporter=junit && open test-results/index.html",
|
|
243
|
+
"test:docs": "vitest run --reporter=verbose --reporter=html --reporter=junit",
|
|
244
|
+
"test:ci": "vitest run --reporter=junit --reporter=html --coverage",
|
|
245
|
+
"dev": "npm run build:watch",
|
|
246
|
+
"release:prepare": "changeset",
|
|
247
|
+
"release:version": "changeset version",
|
|
248
|
+
"release:publish": "changeset publish",
|
|
249
|
+
"release": "pnpm release:version && pnpm release:publish",
|
|
250
|
+
"quality": "pnpm run format && pnpm run lint && pnpm run test && pnpm run build",
|
|
251
|
+
"quality:check": "pnpm run lint:check && pnpm run format:check && pnpm run test && pnpm run build"
|
|
252
|
+
}
|
|
253
|
+
}
|