Skip to content

Commit

Permalink
Merge pull request #130 from samualtnorman/main
Browse files Browse the repository at this point in the history
Add support for cuid2s
  • Loading branch information
fabian-hiller authored Sep 8, 2023
2 parents 66145c6 + 9e7833a commit 478bfc0
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 1 deletion.
1 change: 1 addition & 0 deletions library/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ All notable changes to the library will be documented in this file.

## vX.X.X (Month DD, YYYY)

- Add `cuid2` validation (pull request #130)
- Fix bug in `strict` and `strictAsync` method for optional keys (issue #131)

## v0.13.1 (August 23, 2023)
Expand Down
30 changes: 30 additions & 0 deletions library/src/validations/cuid2/cuid2.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { describe, expect, test } from 'vitest';
import { cuid2 } from './cuid2.ts';

describe('cuid2', () => {
test('should pass only cuid2s', () => {
const validate = cuid2();

const value1 = 'o2dyrckf0vbqhftbcx8ex7r8';
expect(validate(value1).output).toBe(value1);
const value2 = 'pj17j4wheabtydu00x2yuo8s';
expect(validate(value2).output).toBe(value2);
const value3 = 'vkydd2qpoediyioixyeh8zyo';
expect(validate(value3).output).toBe(value3);
const value4 = 'ja3j1arc87i80ys1zxk8iyiv';
expect(validate(value4).output).toBe(value4);
const value5 = 'pbe6zw7wikj83vv5knjk1wx8';
expect(validate(value5).output).toBe(value5);

expect(validate('').issue).toBeTruthy();
expect(validate('w#@%^').issue).toBeTruthy();
expect(validate('o2dyrcKf0vbqhftBcx8ex7r8').issue).toBeTruthy();
expect(validate('1vx6pa5rqog2tqdztxaa0xgw').issue).toBeTruthy();
});

test('should return custom error message', () => {
const error = 'Value is not an cuid2!';
const validate = cuid2(error);
expect(validate('').issue?.message).toBe(error);
});
});
23 changes: 23 additions & 0 deletions library/src/validations/cuid2/cuid2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import type { PipeResult } from '../../types.ts';

/**
* Creates a validation functions that validates a [cuid2](https://github.com/paralleldrive/cuid2#cuid2).
*
* @param error The error message.
*
* @returns A validation function.
*/
export function cuid2<TInput extends string>(error?: string) {
return (input: TInput): PipeResult<TInput> => {
if (!/^[a-z][a-z0-9]*$/.test(input)) {
return {
issue: {
validation: 'cuid2',
message: error || 'Invalid cuid2',
input,
},
};
}
return { output: input };
};
}
1 change: 1 addition & 0 deletions library/src/validations/cuid2/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './cuid2.ts';
1 change: 1 addition & 0 deletions library/src/validations/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './bytes/index.ts';
export * from './cuid2/index.ts';
export * from './custom/index.ts';
export * from './email/index.ts';
export * from './emoji/index.ts';
Expand Down
7 changes: 7 additions & 0 deletions website/src/routes/api/(validations)/cuid2/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: cuid2
---

# cuid2

> The content of this page is not yet ready. Until then just use the [source code](https://github.com/fabian-hiller/valibot/blob/main/library/src/validations/cuid2/cuid2.ts).
1 change: 1 addition & 0 deletions website/src/routes/api/menu.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
## Validations

- [bytes](/api/bytes)
- [cuid2](/api/cuid2)
- [custom](/api/custom)
- [email](/api/email)
- [emoji](/api/emoji)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const StringSchema = string([

Since the code of a pipeline, as seen in the previous example, can quickly become confusing. I provide you with small utility functions that make your code more understandable and readable.

Utility functions: <Link href="/api/bytes">`bytes`</Link>, <Link href="/api/custom">`custom`</Link>, <Link href="/api/customAsync">`customAsync`</Link> <Link href="/api/email">`email`</Link>, <Link href="/api/emoji">`emoji`</Link>, <Link href="/api/endsWith">`endsWith`</Link>, <Link href="/api/equal">`equal`</Link>, <Link href="/api/excludes">`excludes`</Link>, <Link href="/api/finite">`finite`</Link>, <Link href="/api/includes">`includes`</Link>, <Link href="/api/integer">`integer`</Link>, <Link href="/api/ip">`ip`</Link>, <Link href="/api/ipv4">`ipv4`</Link>, <Link href="/api/ipv6">`ipv6`</Link>, <Link href="/api/isoDate">`isoDate`</Link>, <Link href="/api/isoDateTime">`isoDateTime`</Link>, <Link href="/api/isoTime">`isoTime`</Link>, <Link href="/api/isoTimeSecond">`isoTimeSecond`</Link>, <Link href="/api/isoTimestamp">`isoTimestamp`</Link>, <Link href="/api/isoWeek">`isoWeek`</Link>, <Link href="/api/length">`length`</Link>, <Link href="/api/maxBytes">`maxBytes`</Link>, <Link href="/api/maxLength">`maxLength`</Link>, <Link href="/api/maxSize">`maxSize`</Link>, <Link href="/api/maxValue">`maxValue`</Link>, <Link href="/api/mimeType">`mimeType`</Link>, <Link href="/api/minBytes">`minBytes`</Link>, <Link href="/api/minLength">`minLength`</Link>, <Link href="/api/minSize">`minSize`</Link>, <Link href="/api/minValue">`minValue`</Link>, <Link href="/api/multipleOf">`multipleOf`</Link>, <Link href="/api/regex">`regex`</Link>, <Link href="/api/safeInteger">`safeInteger`</Link>, <Link href="/api/size">`size`</Link>, <Link href="/api/startsWith">`startsWith`</Link>, <Link href="/api/url">`url`</Link>, <Link href="/api/uuid">`uuid`</Link>, <Link href="/api/value">`value`</Link>
Utility functions: <Link href="/api/bytes">`bytes`</Link>, <Link href="/api/cuid2">`cuid2`</Link>, <Link href="/api/custom">`custom`</Link>, <Link href="/api/customAsync">`customAsync`</Link> <Link href="/api/email">`email`</Link>, <Link href="/api/emoji">`emoji`</Link>, <Link href="/api/endsWith">`endsWith`</Link>, <Link href="/api/equal">`equal`</Link>, <Link href="/api/excludes">`excludes`</Link>, <Link href="/api/finite">`finite`</Link>, <Link href="/api/includes">`includes`</Link>, <Link href="/api/integer">`integer`</Link>, <Link href="/api/ip">`ip`</Link>, <Link href="/api/ipv4">`ipv4`</Link>, <Link href="/api/ipv6">`ipv6`</Link>, <Link href="/api/isoDate">`isoDate`</Link>, <Link href="/api/isoDateTime">`isoDateTime`</Link>, <Link href="/api/isoTime">`isoTime`</Link>, <Link href="/api/isoTimeSecond">`isoTimeSecond`</Link>, <Link href="/api/isoTimestamp">`isoTimestamp`</Link>, <Link href="/api/isoWeek">`isoWeek`</Link>, <Link href="/api/length">`length`</Link>, <Link href="/api/maxBytes">`maxBytes`</Link>, <Link href="/api/maxLength">`maxLength`</Link>, <Link href="/api/maxSize">`maxSize`</Link>, <Link href="/api/maxValue">`maxValue`</Link>, <Link href="/api/mimeType">`mimeType`</Link>, <Link href="/api/minBytes">`minBytes`</Link>, <Link href="/api/minLength">`minLength`</Link>, <Link href="/api/minSize">`minSize`</Link>, <Link href="/api/minValue">`minValue`</Link>, <Link href="/api/multipleOf">`multipleOf`</Link>, <Link href="/api/regex">`regex`</Link>, <Link href="/api/safeInteger">`safeInteger`</Link>, <Link href="/api/size">`size`</Link>, <Link href="/api/startsWith">`startsWith`</Link>, <Link href="/api/url">`url`</Link>, <Link href="/api/uuid">`uuid`</Link>, <Link href="/api/value">`value`</Link>

Some of these utility functions can be used in the pipeline of different schema functions. For example, <Link href="/api/minValue">`minValue`</Link> can be used in the pipeline of <Link href="/api/string">`string`</Link>, <Link href="/api/number">`number`</Link>, <Link href="/api/bigint">`bigint`</Link> und <Link href="/api/date">`date`</Link>.

Expand Down

0 comments on commit 478bfc0

Please sign in to comment.