qstd 0.3.76 → 0.3.77
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/dist/client/index.cjs +32 -2
- package/dist/client/index.js +33 -3
- package/dist/server/index.cjs +32 -2
- package/dist/server/index.js +33 -3
- package/dist/shared/time.d.ts +44 -1
- package/dist/shared/time.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/client/index.cjs
CHANGED
|
@@ -265,6 +265,7 @@ __export(time_exports, {
|
|
|
265
265
|
formatDateRange: () => formatDateRange,
|
|
266
266
|
formatDuration: () => formatDuration,
|
|
267
267
|
formatThreadDateRange: () => formatThreadDateRange,
|
|
268
|
+
formatTimeAgo: () => formatTimeAgo,
|
|
268
269
|
now: () => now,
|
|
269
270
|
sleep: () => sleep,
|
|
270
271
|
startTimer: () => startTimer,
|
|
@@ -389,14 +390,43 @@ var formatDate = (input, options = {}) => {
|
|
|
389
390
|
return includeTime ? dateFns.format(date2, "MMM d, yyyy h:mm a") : dateFns.format(date2, "MMM d, yyyy");
|
|
390
391
|
case "long":
|
|
391
392
|
return includeTime ? dateFns.format(date2, "MMMM d, yyyy 'at' h:mm a") : dateFns.format(date2, "MMMM d, yyyy");
|
|
392
|
-
case "relative":
|
|
393
|
-
return dateFns.formatDistanceToNow(date2, { addSuffix: true });
|
|
394
393
|
case "year":
|
|
395
394
|
return dateFns.format(date2, "yyyy");
|
|
396
395
|
default:
|
|
397
396
|
return includeTime ? dateFns.format(date2, "MMM d, yyyy h:mm a") : dateFns.format(date2, "MMM d, yyyy");
|
|
398
397
|
}
|
|
399
398
|
};
|
|
399
|
+
var formatTimeAgo = (input, options = {}) => {
|
|
400
|
+
const { verbose = false } = options;
|
|
401
|
+
let date2;
|
|
402
|
+
if (typeof input === "string") {
|
|
403
|
+
date2 = new Date(input);
|
|
404
|
+
} else if (typeof input === "number") {
|
|
405
|
+
date2 = new Date(input);
|
|
406
|
+
} else {
|
|
407
|
+
date2 = input;
|
|
408
|
+
}
|
|
409
|
+
if (isNaN(date2.getTime())) {
|
|
410
|
+
return "Invalid Date";
|
|
411
|
+
}
|
|
412
|
+
if (verbose) {
|
|
413
|
+
return dateFns.formatDistanceToNow(date2, { addSuffix: true });
|
|
414
|
+
}
|
|
415
|
+
const diffMs = Date.now() - date2.getTime();
|
|
416
|
+
const diffSeconds = Math.floor(diffMs / 1e3);
|
|
417
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
418
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
419
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
420
|
+
const diffWeeks = Math.floor(diffDays / 7);
|
|
421
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
422
|
+
const diffYears = Math.floor(diffDays / 365);
|
|
423
|
+
if (diffYears > 0) return `${diffYears}y ago`;
|
|
424
|
+
if (diffMonths > 0) return `${diffMonths}mo ago`;
|
|
425
|
+
if (diffWeeks > 0) return `${diffWeeks}w ago`;
|
|
426
|
+
if (diffDays > 0) return `${diffDays}d ago`;
|
|
427
|
+
if (diffHours > 0) return `${diffHours}h ago`;
|
|
428
|
+
return "just now";
|
|
429
|
+
};
|
|
400
430
|
var toDate = (input) => typeof input === "string" || typeof input === "number" ? new Date(input) : input;
|
|
401
431
|
var formatDateRange = (startInput, endInput, options = {}) => {
|
|
402
432
|
const now2 = options.now ?? /* @__PURE__ */ new Date();
|
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { format,
|
|
1
|
+
import { format, formatISO, formatDistanceToNow, isSameYear, isSameMonth, isSameDay, addSeconds, addMinutes, addHours, addDays, addWeeks, addBusinessDays, addMonths, addYears } from 'date-fns';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -258,6 +258,7 @@ __export(time_exports, {
|
|
|
258
258
|
formatDateRange: () => formatDateRange,
|
|
259
259
|
formatDuration: () => formatDuration,
|
|
260
260
|
formatThreadDateRange: () => formatThreadDateRange,
|
|
261
|
+
formatTimeAgo: () => formatTimeAgo,
|
|
261
262
|
now: () => now,
|
|
262
263
|
sleep: () => sleep,
|
|
263
264
|
startTimer: () => startTimer,
|
|
@@ -382,14 +383,43 @@ var formatDate = (input, options = {}) => {
|
|
|
382
383
|
return includeTime ? format(date2, "MMM d, yyyy h:mm a") : format(date2, "MMM d, yyyy");
|
|
383
384
|
case "long":
|
|
384
385
|
return includeTime ? format(date2, "MMMM d, yyyy 'at' h:mm a") : format(date2, "MMMM d, yyyy");
|
|
385
|
-
case "relative":
|
|
386
|
-
return formatDistanceToNow(date2, { addSuffix: true });
|
|
387
386
|
case "year":
|
|
388
387
|
return format(date2, "yyyy");
|
|
389
388
|
default:
|
|
390
389
|
return includeTime ? format(date2, "MMM d, yyyy h:mm a") : format(date2, "MMM d, yyyy");
|
|
391
390
|
}
|
|
392
391
|
};
|
|
392
|
+
var formatTimeAgo = (input, options = {}) => {
|
|
393
|
+
const { verbose = false } = options;
|
|
394
|
+
let date2;
|
|
395
|
+
if (typeof input === "string") {
|
|
396
|
+
date2 = new Date(input);
|
|
397
|
+
} else if (typeof input === "number") {
|
|
398
|
+
date2 = new Date(input);
|
|
399
|
+
} else {
|
|
400
|
+
date2 = input;
|
|
401
|
+
}
|
|
402
|
+
if (isNaN(date2.getTime())) {
|
|
403
|
+
return "Invalid Date";
|
|
404
|
+
}
|
|
405
|
+
if (verbose) {
|
|
406
|
+
return formatDistanceToNow(date2, { addSuffix: true });
|
|
407
|
+
}
|
|
408
|
+
const diffMs = Date.now() - date2.getTime();
|
|
409
|
+
const diffSeconds = Math.floor(diffMs / 1e3);
|
|
410
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
411
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
412
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
413
|
+
const diffWeeks = Math.floor(diffDays / 7);
|
|
414
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
415
|
+
const diffYears = Math.floor(diffDays / 365);
|
|
416
|
+
if (diffYears > 0) return `${diffYears}y ago`;
|
|
417
|
+
if (diffMonths > 0) return `${diffMonths}mo ago`;
|
|
418
|
+
if (diffWeeks > 0) return `${diffWeeks}w ago`;
|
|
419
|
+
if (diffDays > 0) return `${diffDays}d ago`;
|
|
420
|
+
if (diffHours > 0) return `${diffHours}h ago`;
|
|
421
|
+
return "just now";
|
|
422
|
+
};
|
|
393
423
|
var toDate = (input) => typeof input === "string" || typeof input === "number" ? new Date(input) : input;
|
|
394
424
|
var formatDateRange = (startInput, endInput, options = {}) => {
|
|
395
425
|
const now2 = options.now ?? /* @__PURE__ */ new Date();
|
package/dist/server/index.cjs
CHANGED
|
@@ -277,6 +277,7 @@ __export(time_exports, {
|
|
|
277
277
|
formatDateRange: () => formatDateRange,
|
|
278
278
|
formatDuration: () => formatDuration,
|
|
279
279
|
formatThreadDateRange: () => formatThreadDateRange,
|
|
280
|
+
formatTimeAgo: () => formatTimeAgo,
|
|
280
281
|
now: () => now,
|
|
281
282
|
sleep: () => sleep,
|
|
282
283
|
startTimer: () => startTimer,
|
|
@@ -401,14 +402,43 @@ var formatDate = (input, options = {}) => {
|
|
|
401
402
|
return includeTime ? dateFns.format(date2, "MMM d, yyyy h:mm a") : dateFns.format(date2, "MMM d, yyyy");
|
|
402
403
|
case "long":
|
|
403
404
|
return includeTime ? dateFns.format(date2, "MMMM d, yyyy 'at' h:mm a") : dateFns.format(date2, "MMMM d, yyyy");
|
|
404
|
-
case "relative":
|
|
405
|
-
return dateFns.formatDistanceToNow(date2, { addSuffix: true });
|
|
406
405
|
case "year":
|
|
407
406
|
return dateFns.format(date2, "yyyy");
|
|
408
407
|
default:
|
|
409
408
|
return includeTime ? dateFns.format(date2, "MMM d, yyyy h:mm a") : dateFns.format(date2, "MMM d, yyyy");
|
|
410
409
|
}
|
|
411
410
|
};
|
|
411
|
+
var formatTimeAgo = (input, options = {}) => {
|
|
412
|
+
const { verbose = false } = options;
|
|
413
|
+
let date2;
|
|
414
|
+
if (typeof input === "string") {
|
|
415
|
+
date2 = new Date(input);
|
|
416
|
+
} else if (typeof input === "number") {
|
|
417
|
+
date2 = new Date(input);
|
|
418
|
+
} else {
|
|
419
|
+
date2 = input;
|
|
420
|
+
}
|
|
421
|
+
if (isNaN(date2.getTime())) {
|
|
422
|
+
return "Invalid Date";
|
|
423
|
+
}
|
|
424
|
+
if (verbose) {
|
|
425
|
+
return dateFns.formatDistanceToNow(date2, { addSuffix: true });
|
|
426
|
+
}
|
|
427
|
+
const diffMs = Date.now() - date2.getTime();
|
|
428
|
+
const diffSeconds = Math.floor(diffMs / 1e3);
|
|
429
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
430
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
431
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
432
|
+
const diffWeeks = Math.floor(diffDays / 7);
|
|
433
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
434
|
+
const diffYears = Math.floor(diffDays / 365);
|
|
435
|
+
if (diffYears > 0) return `${diffYears}y ago`;
|
|
436
|
+
if (diffMonths > 0) return `${diffMonths}mo ago`;
|
|
437
|
+
if (diffWeeks > 0) return `${diffWeeks}w ago`;
|
|
438
|
+
if (diffDays > 0) return `${diffDays}d ago`;
|
|
439
|
+
if (diffHours > 0) return `${diffHours}h ago`;
|
|
440
|
+
return "just now";
|
|
441
|
+
};
|
|
412
442
|
var toDate = (input) => typeof input === "string" || typeof input === "number" ? new Date(input) : input;
|
|
413
443
|
var formatDateRange = (startInput, endInput, options = {}) => {
|
|
414
444
|
const now2 = options.now ?? /* @__PURE__ */ new Date();
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { format,
|
|
1
|
+
import { format, formatISO, formatDistanceToNow, isSameYear, isSameMonth, isSameDay, addSeconds, addMinutes, addHours, addDays, addWeeks, addBusinessDays, addMonths, addYears } from 'date-fns';
|
|
2
2
|
import awaitSpawn from 'await-spawn';
|
|
3
3
|
import { promises } from 'fs';
|
|
4
4
|
import { ArkErrors } from 'arktype';
|
|
@@ -269,6 +269,7 @@ __export(time_exports, {
|
|
|
269
269
|
formatDateRange: () => formatDateRange,
|
|
270
270
|
formatDuration: () => formatDuration,
|
|
271
271
|
formatThreadDateRange: () => formatThreadDateRange,
|
|
272
|
+
formatTimeAgo: () => formatTimeAgo,
|
|
272
273
|
now: () => now,
|
|
273
274
|
sleep: () => sleep,
|
|
274
275
|
startTimer: () => startTimer,
|
|
@@ -393,14 +394,43 @@ var formatDate = (input, options = {}) => {
|
|
|
393
394
|
return includeTime ? format(date2, "MMM d, yyyy h:mm a") : format(date2, "MMM d, yyyy");
|
|
394
395
|
case "long":
|
|
395
396
|
return includeTime ? format(date2, "MMMM d, yyyy 'at' h:mm a") : format(date2, "MMMM d, yyyy");
|
|
396
|
-
case "relative":
|
|
397
|
-
return formatDistanceToNow(date2, { addSuffix: true });
|
|
398
397
|
case "year":
|
|
399
398
|
return format(date2, "yyyy");
|
|
400
399
|
default:
|
|
401
400
|
return includeTime ? format(date2, "MMM d, yyyy h:mm a") : format(date2, "MMM d, yyyy");
|
|
402
401
|
}
|
|
403
402
|
};
|
|
403
|
+
var formatTimeAgo = (input, options = {}) => {
|
|
404
|
+
const { verbose = false } = options;
|
|
405
|
+
let date2;
|
|
406
|
+
if (typeof input === "string") {
|
|
407
|
+
date2 = new Date(input);
|
|
408
|
+
} else if (typeof input === "number") {
|
|
409
|
+
date2 = new Date(input);
|
|
410
|
+
} else {
|
|
411
|
+
date2 = input;
|
|
412
|
+
}
|
|
413
|
+
if (isNaN(date2.getTime())) {
|
|
414
|
+
return "Invalid Date";
|
|
415
|
+
}
|
|
416
|
+
if (verbose) {
|
|
417
|
+
return formatDistanceToNow(date2, { addSuffix: true });
|
|
418
|
+
}
|
|
419
|
+
const diffMs = Date.now() - date2.getTime();
|
|
420
|
+
const diffSeconds = Math.floor(diffMs / 1e3);
|
|
421
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
422
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
423
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
424
|
+
const diffWeeks = Math.floor(diffDays / 7);
|
|
425
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
426
|
+
const diffYears = Math.floor(diffDays / 365);
|
|
427
|
+
if (diffYears > 0) return `${diffYears}y ago`;
|
|
428
|
+
if (diffMonths > 0) return `${diffMonths}mo ago`;
|
|
429
|
+
if (diffWeeks > 0) return `${diffWeeks}w ago`;
|
|
430
|
+
if (diffDays > 0) return `${diffDays}d ago`;
|
|
431
|
+
if (diffHours > 0) return `${diffHours}h ago`;
|
|
432
|
+
return "just now";
|
|
433
|
+
};
|
|
404
434
|
var toDate = (input) => typeof input === "string" || typeof input === "number" ? new Date(input) : input;
|
|
405
435
|
var formatDateRange = (startInput, endInput, options = {}) => {
|
|
406
436
|
const now2 = options.now ?? /* @__PURE__ */ new Date();
|
package/dist/shared/time.d.ts
CHANGED
|
@@ -98,7 +98,7 @@ type DurationOptions = {
|
|
|
98
98
|
*/
|
|
99
99
|
export declare const formatDuration: (value: number | null | undefined, options?: DurationOptions) => string;
|
|
100
100
|
type DateInput = Date | string | number;
|
|
101
|
-
type DateFormatStyle = "iso" | "short" | "medium" | "long" | "
|
|
101
|
+
type DateFormatStyle = "iso" | "short" | "medium" | "long" | "year";
|
|
102
102
|
type DateOptions = {
|
|
103
103
|
/** Predefined format style */
|
|
104
104
|
style?: DateFormatStyle;
|
|
@@ -121,6 +121,49 @@ type DateOptions = {
|
|
|
121
121
|
* formatDate(date, { pattern: "yyyy-MM-dd" }) // Custom format
|
|
122
122
|
*/
|
|
123
123
|
export declare const formatDate: (input: DateInput, options?: DateOptions) => string;
|
|
124
|
+
type TimeAgoInput = Date | string | number;
|
|
125
|
+
type TimeAgoOptions = {
|
|
126
|
+
/** Use verbose format ("about 3 hours ago") instead of compact ("3h ago"). Default: false */
|
|
127
|
+
verbose?: boolean;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Formats a past date as relative elapsed time ("3h ago", "1d ago", "just now").
|
|
131
|
+
*
|
|
132
|
+
* Compact by default for UI badges, sync indicators, and timestamps.
|
|
133
|
+
* Use `verbose: true` for accessibility or screen readers.
|
|
134
|
+
*
|
|
135
|
+
* @param input - Date to format (Date object, ISO string, or Unix timestamp)
|
|
136
|
+
* @param options - Configuration options
|
|
137
|
+
* @param options.verbose - Use verbose format ("about 3 hours ago") instead of compact ("3h ago")
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* // COMPACT FORMAT (default) - Best for UI badges, sync indicators
|
|
142
|
+
*
|
|
143
|
+
* formatTimeAgo(new Date()) // "just now"
|
|
144
|
+
* formatTimeAgo(Date.now() - 1000 * 60 * 30) // "just now" (< 1 hour)
|
|
145
|
+
* formatTimeAgo(Date.now() - 1000 * 60 * 60 * 3) // "3h ago"
|
|
146
|
+
* formatTimeAgo(Date.now() - 1000 * 60 * 60 * 24) // "1d ago"
|
|
147
|
+
* formatTimeAgo(Date.now() - 1000 * 60 * 60 * 24 * 5) // "5d ago"
|
|
148
|
+
*
|
|
149
|
+
* // VERBOSE FORMAT - Best for accessibility, screen readers
|
|
150
|
+
*
|
|
151
|
+
* formatTimeAgo(date, { verbose: true }) // "about 3 hours ago"
|
|
152
|
+
* formatTimeAgo(date, { verbose: true }) // "5 days ago"
|
|
153
|
+
*
|
|
154
|
+
* // COMMON USE CASES
|
|
155
|
+
*
|
|
156
|
+
* // Search index freshness indicator
|
|
157
|
+
* `${count} songs indexed · ${formatTimeAgo(buildTime)}` // "1,234 songs indexed · 3h ago"
|
|
158
|
+
*
|
|
159
|
+
* // Last sync timestamp
|
|
160
|
+
* `Last synced ${formatTimeAgo(lastSync)}` // "Last synced 5d ago"
|
|
161
|
+
*
|
|
162
|
+
* // Comment timestamps
|
|
163
|
+
* `Posted ${formatTimeAgo(createdAt)}` // "Posted just now"
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
export declare const formatTimeAgo: (input: TimeAgoInput, options?: TimeAgoOptions) => string;
|
|
124
167
|
type DateRangeInput = Date | string | number;
|
|
125
168
|
type DateRangeOptions = {
|
|
126
169
|
/** Reference date for today checks (defaults to new Date()) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/shared/time.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/shared/time.ts"],"names":[],"mappings":"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"}
|