Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
"devDependencies": {
"@commitlint/config-conventional": "^19.8.1",
"@commitlint/types": "^19.8.1",
"@types/node": "^22.17.0",
"@types/node": "^22.17.2",
"@vitest/coverage-v8": "^3.2.4",
"@webdeveric/eslint-config-ts": "^0.11.0",
"@webdeveric/prettier-config": "^0.3.0",
Expand All @@ -101,7 +101,7 @@
"eslint-plugin-import": "^2.32.0",
"husky": "^9.1.7",
"jsdom": "^26.1.0",
"lint-staged": "^16.1.2",
"lint-staged": "^16.1.5",
"prettier": "^3.6.2",
"rimraf": "^6.0.1",
"semantic-release": "^24.2.7",
Expand Down
496 changes: 242 additions & 254 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/predicate/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export * from './isBigIntArray.js';
export * from './isBinaryNumberString.js';
export * from './isBoolean.js';
export * from './isBooleanArray.js';
export * from './isDateInputString.js';
export * from './isDateString.js';
export * from './isDigitsString.js';
export * from './isFiniteNumber.js';
Expand Down
8 changes: 8 additions & 0 deletions src/predicate/isDateInputString.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { DateInputString } from '../types/date-time.js';
import type { TypePredicateFn } from '../types/functions.js';

/**
* Determine if `input` is a valid date string.
*/
export const isDateInputString: TypePredicateFn<DateInputString> = (input: unknown): input is DateInputString =>
typeof input === 'string' && !Number.isNaN(Date.parse(input));
7 changes: 5 additions & 2 deletions src/predicate/isDateString.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { isDateInputString } from './isDateInputString.js';

import type { TypePredicateFn } from '../types/functions.js';

/**
* Determine if `input` is a valid date string.
*
* @deprecated Use `isDateInputString` instead.
*/
export const isDateString: TypePredicateFn<string> = (input: unknown): input is string =>
typeof input === 'string' && !Number.isNaN(Date.parse(input));
export const isDateString: TypePredicateFn<string> = isDateInputString;
2 changes: 1 addition & 1 deletion src/predicate/isISODateString.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { matching } from './factory/matching.js';
import type { ISODateString } from '../types/date-time.js';

export const ISO_DATE_PATTERN =
/^(?<year>\d{4,})-(?<month>[01]\d)-(?<day>0[1-9]|[12]\d|3[01])T(?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})\.(?<timezone>\d{3}Z)$/;
/^(?<year>\d{4,})-(?<month>[01]\d)-(?<day>0[1-9]|[12]\d|3[01])T(?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})\.(?<timezone>\d+Z)$/;

/**
* This checks to see if the input matches the format that `toISOString()`
Expand Down
5 changes: 5 additions & 0 deletions src/types/date-time.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ import type { NumericString } from './common.js';

export type DateInput = ConstructorParameters<typeof Date>[0];

/**
* This is used to represent a string can be used as input for a `Date` constructor.
*/
export type DateInputString = Branded<string, 'DateInputString'>;

export type YearString = Branded<NumericString<number>, 'YearString'>;

export type MonthString = Branded<NumericString<number>, 'MonthString'>;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { describe, it, expect } from 'vitest';

import { isDateString } from '../../src/predicate/isDateString.js';
import { isDateInputString } from '../../src/predicate/isDateInputString.js';

describe('isDateString()', () => {
describe('isDateInputString()', () => {
it.each([
new Date().toISOString(),
new Date().toLocaleDateString('en-US'),
new Date().toLocaleString(),
new Date().toUTCString(),
new Date().toString(),
])('Returns true for valid input: %j', (input) => {
expect(isDateString(input)).toBeTruthy();
expect(isDateInputString(input)).toBeTruthy();
});

it.each([Date.now(), 'bad input', true, null, {}, undefined])('Returns false for invalid input: %j', (input) => {
expect(isDateString(input)).toBeFalsy();
expect(isDateInputString(input)).toBeFalsy();
});
});
16 changes: 16 additions & 0 deletions test/predicate/isISODateString.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { describe, it, expect } from 'vitest';

import { isISODateString } from '../../src/predicate/isISODateString.js';

describe('isISODateString()', () => {
it.each([new Date(0).toISOString(), new Date('+9999-12-31').toISOString(), '2025-08-01T01:23:34.123456789Z'])(
'Returns true for valid input: "%s"',
(input) => {
expect(isISODateString(input)).toBeTruthy();
},
);

it.each(['9999-12-31T06:00:00', null, false, ''])('Returns false for invalid input: "%s"', (input) => {
expect(isISODateString(input)).toBeFalsy();
});
});
14 changes: 0 additions & 14 deletions test/type-predicate.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
isFunction,
isInteger,
isIntString,
isISODateString,
isIterable,
isLengthAware,
isNull,
Expand Down Expand Up @@ -323,19 +322,6 @@ describe('isIntString()', () => {
});
});

describe('isISODateString()', () => {
it.each([new Date(0).toISOString(), new Date('+9999-12-31').toISOString()])(
'Returns true for valid input: "%s"',
(input) => {
expect(isISODateString(input)).toBeTruthy();
},
);

it.each(['9999-12-31T06:00:00', null, false, ''])('Returns false for invalid input: "%s"', (input) => {
expect(isISODateString(input)).toBeFalsy();
});
});

describe('isDigitsString()', () => {
it('Returns true for valid input', () => {
expect(isDigitsString('12345')).toBeTruthy();
Expand Down
Loading