chronal 0.0.1-0 → 0.0.1-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.
Files changed (2) hide show
  1. package/README.md +357 -0
  2. package/package.json +1 -1
package/README.md ADDED
@@ -0,0 +1,357 @@
1
+ # Chronal
2
+
3
+ A tiny, fast, and modern date utility library for JavaScript/TypeScript with zero dependencies.
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ ## Features
8
+
9
+ - 🪶 **Lightweight** - Zero dependencies, minimal bundle size
10
+ - 🌍 **i18n Support** - Locale-aware formatting with `Intl` API
11
+ - ⏰ **UTC First** - All operations work in UTC by default, avoiding timezone pitfalls
12
+ - 🔧 **Modern API** - Simple, intuitive function-based API
13
+ - 📦 **Tree-shakeable** - Import only what you need
14
+ - 🦕 **Deno Native** - Built for Deno, works everywhere
15
+ - ✅ **Fully Tested** - Comprehensive test coverage
16
+
17
+ ## Installation
18
+
19
+ ### Deno
20
+
21
+ ```typescript
22
+ import { format, add, sub } from "jsr:@your-scope/chronal";
23
+ ```
24
+
25
+ ### Node.js / npm
26
+
27
+ ```bash
28
+ npm install chronal
29
+ ```
30
+
31
+ ```javascript
32
+ import { format, add, sub } from "chronal";
33
+ ```
34
+
35
+ ## Quick Start
36
+
37
+ ```typescript
38
+ import { format, add, sub, startOf, endOf } from "chronal";
39
+
40
+ const date = new Date("2024-06-15T14:35:22Z");
41
+
42
+ // Format dates
43
+ format(date, "YYYY-MM-DD"); // '2024-06-15'
44
+ format(date, "YYYY-MM-DD HH:mm:ss"); // '2024-06-15 14:35:22'
45
+ format(date, "DD/MM/YYYY [at] HH:mm"); // '15/06/2024 at 14:35'
46
+
47
+ // Add time
48
+ add(date, { days: 5, hours: 2 }); // 2024-06-20T16:35:22Z
49
+
50
+ // Subtract time
51
+ sub(date, { months: 1, days: 10 }); // 2024-05-05T14:35:22Z
52
+
53
+ // Start/End of period
54
+ startOf(date, "month"); // 2024-06-01T00:00:00.000Z
55
+ endOf(date, "day"); // 2024-06-15T23:59:59.999Z
56
+ ```
57
+
58
+ ## API Reference
59
+
60
+ ### Formatting
61
+
62
+ #### `format(date, formatString, options?)`
63
+
64
+ Formats a date into a string using the specified format pattern.
65
+
66
+ **Parameters:**
67
+ - `date` (Date) - The date to format
68
+ - `formatString` (string) - Format pattern with tokens
69
+ - `options` (object, optional)
70
+ - `locale` (string) - Locale for internationalization (default: 'en-US')
71
+ - `tz` (string) - Timezone (default: 'UTC')
72
+
73
+ **Format Tokens:**
74
+
75
+ | Token | Output | Description |
76
+ |-------|--------|-------------|
77
+ | `YYYY` | 2024 | 4-digit year |
78
+ | `YY` | 24 | 2-digit year |
79
+ | `MMMM` | June | Full month name |
80
+ | `MMM` | Jun | Short month name |
81
+ | `MM` | 06 | 2-digit month |
82
+ | `M` | 6 | Month number |
83
+ | `DD` | 05 | 2-digit day |
84
+ | `D` | 5 | Day of month |
85
+ | `HH` | 14 | 2-digit hour (24h) |
86
+ | `H` | 14 | Hour (24h) |
87
+ | `mm` | 35 | 2-digit minute |
88
+ | `m` | 35 | Minute |
89
+ | `ss` | 22 | 2-digit second |
90
+ | `s` | 22 | Second |
91
+
92
+ **Literals:**
93
+ Use square brackets to escape literals: `[at]` → "at"
94
+
95
+ **Examples:**
96
+
97
+ ```typescript
98
+ const date = new Date("2024-06-15T14:35:22Z");
99
+
100
+ format(date, "YYYY-MM-DD"); // '2024-06-15'
101
+ format(date, "DD/MM/YYYY HH:mm"); // '15/06/2024 14:35'
102
+ format(date, "MMMM D, YYYY"); // 'June 15, 2024'
103
+ format(date, "YYYY-MM-DD [at] HH:mm"); // '2024-06-15 at 14:35'
104
+
105
+ // With locale
106
+ format(date, "MMMM D, YYYY", { locale: "pt-BR" }); // 'junho 15, 2024'
107
+ ```
108
+
109
+ ### Date Manipulation
110
+
111
+ #### `add(date, options)`
112
+
113
+ Adds specified time units to a date.
114
+
115
+ **Parameters:**
116
+ - `date` (Date) - The original date
117
+ - `options` (object) - Time units to add
118
+ - `years` (number)
119
+ - `months` (number)
120
+ - `weeks` (number)
121
+ - `days` (number)
122
+ - `hours` (number)
123
+ - `minutes` (number)
124
+ - `seconds` (number)
125
+ - `milliseconds` (number)
126
+
127
+ **Returns:** New Date object
128
+
129
+ **Examples:**
130
+
131
+ ```typescript
132
+ const date = new Date("2024-01-31T12:00:00Z");
133
+
134
+ add(date, { days: 5 }); // 2024-02-05T12:00:00.000Z
135
+ add(date, { months: 1 }); // 2024-02-29T12:00:00.000Z (handles leap year)
136
+ add(date, { years: 1, months: 2, days: 3 }); // 2025-04-03T12:00:00.000Z
137
+ ```
138
+
139
+ #### `sub(date, options)`
140
+
141
+ Subtracts specified time units from a date.
142
+
143
+ **Parameters:** Same as `add()`
144
+
145
+ **Examples:**
146
+
147
+ ```typescript
148
+ const date = new Date("2024-03-31T12:00:00Z");
149
+
150
+ sub(date, { days: 5 }); // 2024-03-26T12:00:00.000Z
151
+ sub(date, { months: 1 }); // 2024-02-29T12:00:00.000Z (handles month overflow)
152
+ ```
153
+
154
+ ### Start/End of Period
155
+
156
+ #### `startOf(date, unit)`
157
+
158
+ Returns the start of the specified time unit.
159
+
160
+ **Parameters:**
161
+ - `date` (Date) - The original date
162
+ - `unit` ('year' | 'month' | 'day' | 'hour' | 'minute' | 'second')
163
+
164
+ **Examples:**
165
+
166
+ ```typescript
167
+ const date = new Date("2024-06-15T14:35:22.500Z");
168
+
169
+ startOf(date, "year"); // 2024-01-01T00:00:00.000Z
170
+ startOf(date, "month"); // 2024-06-01T00:00:00.000Z
171
+ startOf(date, "day"); // 2024-06-15T00:00:00.000Z
172
+ ```
173
+
174
+ #### `endOf(date, unit)`
175
+
176
+ Returns the end (last millisecond) of the specified time unit.
177
+
178
+ **Parameters:** Same as `startOf()`
179
+
180
+ **Examples:**
181
+
182
+ ```typescript
183
+ const date = new Date("2024-06-15T14:35:22.500Z");
184
+
185
+ endOf(date, "year"); // 2024-12-31T23:59:59.999Z
186
+ endOf(date, "month"); // 2024-06-30T23:59:59.999Z
187
+ endOf(date, "day"); // 2024-06-15T23:59:59.999Z
188
+ ```
189
+
190
+ ### Date Comparison
191
+
192
+ #### `isAfter(dateLeft, dateRight)`
193
+
194
+ Checks if the first date is after the second date.
195
+
196
+ ```typescript
197
+ const date1 = new Date("2024-01-20T12:00:00Z");
198
+ const date2 = new Date("2024-01-15T12:00:00Z");
199
+
200
+ isAfter(date1, date2); // true
201
+ ```
202
+
203
+ #### `isBefore(dateLeft, dateRight)`
204
+
205
+ Checks if the first date is before the second date.
206
+
207
+ ```typescript
208
+ isBefore(date2, date1); // true
209
+ ```
210
+
211
+ #### `isEqual(dateLeft, dateRight)`
212
+
213
+ Checks if two dates are equal (same exact millisecond).
214
+
215
+ ```typescript
216
+ const date1 = new Date("2024-01-15T12:00:00.000Z");
217
+ const date2 = new Date("2024-01-15T12:00:00.000Z");
218
+
219
+ isEqual(date1, date2); // true
220
+ ```
221
+
222
+ #### `isSame(dateLeft, dateRight, unit)`
223
+
224
+ Checks if two dates are in the same time unit.
225
+
226
+ **Parameters:**
227
+ - `dateLeft` (Date)
228
+ - `dateRight` (Date)
229
+ - `unit` ('year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second')
230
+
231
+ ```typescript
232
+ const date1 = new Date("2024-06-15T14:30:00Z");
233
+ const date2 = new Date("2024-06-15T18:45:00Z");
234
+
235
+ isSame(date1, date2, "day"); // true (same day)
236
+ isSame(date1, date2, "hour"); // false (different hours)
237
+ ```
238
+
239
+ ### Min/Max
240
+
241
+ #### `max(...dates)`
242
+
243
+ Returns the latest date from the given dates.
244
+
245
+ ```typescript
246
+ const date1 = new Date("2024-01-15T12:00:00Z");
247
+ const date2 = new Date("2024-01-20T12:00:00Z");
248
+ const date3 = new Date("2024-01-10T12:00:00Z");
249
+
250
+ max(date1, date2, date3); // 2024-01-20T12:00:00.000Z
251
+ ```
252
+
253
+ #### `min(...dates)`
254
+
255
+ Returns the earliest date from the given dates.
256
+
257
+ ```typescript
258
+ min(date1, date2, date3); // 2024-01-10T12:00:00.000Z
259
+ ```
260
+
261
+ ### Date Difference
262
+
263
+ #### `difference(dateLeft, dateRight, unit)`
264
+
265
+ Calculates the difference between two dates in the specified unit.
266
+
267
+ **Parameters:**
268
+ - `dateLeft` (Date)
269
+ - `dateRight` (Date)
270
+ - `unit` ('years' | 'months' | 'weeks' | 'days' | 'hours' | 'minutes' | 'seconds')
271
+
272
+ **Returns:** Number (can be negative)
273
+
274
+ ```typescript
275
+ const date1 = new Date("2024-01-20T12:00:00Z");
276
+ const date2 = new Date("2024-01-15T12:00:00Z");
277
+
278
+ difference(date1, date2, "days"); // 5
279
+ difference(date2, date1, "days"); // -5
280
+ difference(date1, date2, "hours"); // 120
281
+ ```
282
+
283
+ ### Localization
284
+
285
+ #### `months(locale?, format?)`
286
+
287
+ Returns an array of month names for the specified locale.
288
+
289
+ **Parameters:**
290
+ - `locale` (string, optional) - Default: 'en-US'
291
+ - `format` ('long' | 'short' | 'narrow', optional) - Default: 'long'
292
+
293
+ ```typescript
294
+ months("en-US", "long"); // ['January', 'February', ...]
295
+ months("en-US", "short"); // ['Jan', 'Feb', ...]
296
+ months("pt-BR", "long"); // ['janeiro', 'fevereiro', ...]
297
+ ```
298
+
299
+ #### `weekdays(locale?, format?)`
300
+
301
+ Returns an array of weekday names (Monday to Sunday) for the specified locale.
302
+
303
+ **Parameters:** Same as `months()`
304
+
305
+ ```typescript
306
+ weekdays("en-US", "long"); // ['Monday', 'Tuesday', ...]
307
+ weekdays("en-US", "short"); // ['Mon', 'Tue', ...]
308
+ weekdays("pt-BR", "long"); // ['segunda-feira', 'terça-feira', ...]
309
+
310
+ ```
311
+
312
+ Key optimizations:
313
+ - Format string caching (no repeated regex parsing)
314
+ - Fast UTC path (avoids expensive Intl.DateTimeFormat for UTC)
315
+ - Optimized padding functions
316
+ - Direct string concatenation
317
+
318
+ ## Why Chronal?
319
+
320
+ Chronal offers a modern approach to date manipulation with a focus on simplicity and performance:
321
+
322
+ - **Performance-focused** - Optimized for common operations like formatting
323
+ - **Zero dependencies** - Built on native JavaScript APIs
324
+ - **UTC-first** - Reduces timezone-related bugs by defaulting to UTC
325
+ - **Lightweight** - Small bundle size, fully tree-shakeable
326
+ - **Modern** - ES modules, TypeScript support, immutable operations
327
+
328
+ Chronal works well alongside other date libraries. Choose the tool that best fits your project's needs.
329
+
330
+ ## Design Principles
331
+
332
+ 1. **UTC First** - All operations work in UTC to avoid timezone surprises
333
+ 2. **Immutability** - Functions always return new Date objects
334
+ 3. **Zero Dependencies** - Leverages native Intl API for localization
335
+ 4. **Performance** - Optimized hot paths with caching
336
+ 5. **Type Safety** - Full TypeScript support
337
+ 6. **Small API Surface** - Easy to learn, hard to misuse
338
+
339
+ ## Browser Support
340
+
341
+ Chronal works in all modern browsers and JavaScript runtimes that support:
342
+ - ES6+ features
343
+ - `Intl.DateTimeFormat` API
344
+ - Native Date object
345
+
346
+ ## Contributing
347
+
348
+ Contributions are welcome! Please feel free to submit a Pull Request.
349
+
350
+ ## License
351
+
352
+ MIT © André Luiz Gomes Filho
353
+
354
+ ## Links
355
+
356
+ - [GitHub Repository](https://github.com/andreluizsgf/chronal)
357
+ - [Report Issues](https://github.com/andreluizsgf/chronal/issues)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chronal",
3
- "version": "0.0.1-0",
3
+ "version": "0.0.1-3",
4
4
  "description": "A tiny and fast date utility library for modern JavaScript runtimes.",
5
5
  "repository": {
6
6
  "type": "git",