@palmares/schemas 0.0.1 → 0.1.0
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/.turbo/turbo-build$colon$watch.log +12 -410
- package/CHANGELOG.md +17 -0
- package/__tests__/.drizzle/migrations/0000_skinny_harrier.sql +22 -0
- package/__tests__/.drizzle/migrations/meta/0000_snapshot.json +156 -0
- package/__tests__/.drizzle/migrations/meta/_journal.json +13 -0
- package/__tests__/.drizzle/schema.ts +35 -0
- package/__tests__/drizzle.config.ts +11 -0
- package/__tests__/eslint.config.js +10 -0
- package/__tests__/manage.ts +5 -0
- package/__tests__/node_modules/.bin/drizzle-kit +17 -0
- package/__tests__/node_modules/.bin/esbuild +14 -0
- package/__tests__/node_modules/.bin/tsc +17 -0
- package/__tests__/node_modules/.bin/tsserver +17 -0
- package/__tests__/node_modules/.bin/tsx +17 -0
- package/__tests__/package.json +36 -0
- package/__tests__/sqlite.db +0 -0
- package/__tests__/src/core/array.test.ts +130 -0
- package/__tests__/src/core/boolean.test.ts +66 -0
- package/__tests__/src/core/datetime.test.ts +102 -0
- package/__tests__/src/core/index.ts +35 -0
- package/__tests__/src/core/model.test.ts +260 -0
- package/__tests__/src/core/models.ts +50 -0
- package/__tests__/src/core/numbers.test.ts +177 -0
- package/__tests__/src/core/object.test.ts +198 -0
- package/__tests__/src/core/string.test.ts +222 -0
- package/__tests__/src/core/test.test.ts +59 -0
- package/__tests__/src/core/types.test.ts +97 -0
- package/__tests__/src/core/union.test.ts +99 -0
- package/__tests__/src/settings.ts +71 -0
- package/__tests__/tsconfig.json +11 -0
- package/dist/cjs/src/adapter/fields/index.js +2 -2
- package/dist/cjs/src/adapter/fields/object.js +9 -0
- package/dist/cjs/src/adapter/index.js +1 -0
- package/dist/cjs/src/constants.js +1 -7
- package/dist/cjs/src/domain.js +146 -1
- package/dist/cjs/src/index.js +69 -74
- package/dist/cjs/src/model.js +206 -206
- package/dist/cjs/src/schema/array.js +185 -58
- package/dist/cjs/src/schema/boolean.js +105 -44
- package/dist/cjs/src/schema/datetime.js +104 -38
- package/dist/cjs/src/schema/number.js +134 -114
- package/dist/cjs/src/schema/object.js +106 -43
- package/dist/cjs/src/schema/schema.js +123 -75
- package/dist/cjs/src/schema/string.js +152 -58
- package/dist/cjs/src/schema/union.js +412 -290
- package/dist/cjs/src/utils.js +42 -15
- package/dist/cjs/src/validators/array.js +6 -1
- package/dist/cjs/src/validators/boolean.js +2 -0
- package/dist/cjs/src/validators/datetime.js +4 -0
- package/dist/cjs/src/validators/number.js +12 -40
- package/dist/cjs/src/validators/object.js +1 -0
- package/dist/cjs/src/validators/schema.js +5 -1
- package/dist/cjs/src/validators/string.js +30 -2
- package/dist/cjs/src/validators/union.js +5 -4
- package/dist/cjs/src/validators/utils.js +99 -27
- package/dist/cjs/tsconfig.types.tsbuildinfo +1 -1
- package/dist/cjs/types/adapter/fields/array.d.ts +2 -2
- package/dist/cjs/types/adapter/fields/array.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/boolean.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/datetime.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/index.d.ts +2 -2
- package/dist/cjs/types/adapter/fields/index.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/number.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/object.d.ts +2 -1
- package/dist/cjs/types/adapter/fields/object.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/string.d.ts.map +1 -1
- package/dist/cjs/types/adapter/fields/union.d.ts.map +1 -1
- package/dist/cjs/types/adapter/index.d.ts +1 -0
- package/dist/cjs/types/adapter/index.d.ts.map +1 -1
- package/dist/cjs/types/adapter/types.d.ts +28 -18
- package/dist/cjs/types/adapter/types.d.ts.map +1 -1
- package/dist/cjs/types/constants.d.ts +0 -1
- package/dist/cjs/types/constants.d.ts.map +1 -1
- package/dist/cjs/types/domain.d.ts +5 -4
- package/dist/cjs/types/domain.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +78 -55
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/model.d.ts +17 -17
- package/dist/cjs/types/model.d.ts.map +1 -1
- package/dist/cjs/types/schema/array.d.ts +168 -47
- package/dist/cjs/types/schema/array.d.ts.map +1 -1
- package/dist/cjs/types/schema/boolean.d.ts +103 -44
- package/dist/cjs/types/schema/boolean.d.ts.map +1 -1
- package/dist/cjs/types/schema/datetime.d.ts +90 -30
- package/dist/cjs/types/schema/datetime.d.ts.map +1 -1
- package/dist/cjs/types/schema/number.d.ts +133 -125
- package/dist/cjs/types/schema/number.d.ts.map +1 -1
- package/dist/cjs/types/schema/object.d.ts +104 -35
- package/dist/cjs/types/schema/object.d.ts.map +1 -1
- package/dist/cjs/types/schema/schema.d.ts +62 -44
- package/dist/cjs/types/schema/schema.d.ts.map +1 -1
- package/dist/cjs/types/schema/string.d.ts +152 -65
- package/dist/cjs/types/schema/string.d.ts.map +1 -1
- package/dist/cjs/types/schema/types.d.ts +11 -2
- package/dist/cjs/types/schema/types.d.ts.map +1 -1
- package/dist/cjs/types/schema/union.d.ts +133 -40
- package/dist/cjs/types/schema/union.d.ts.map +1 -1
- package/dist/cjs/types/types.d.ts +35 -0
- package/dist/cjs/types/types.d.ts.map +1 -1
- package/dist/cjs/types/utils.d.ts +41 -27
- package/dist/cjs/types/utils.d.ts.map +1 -1
- package/dist/cjs/types/validators/array.d.ts.map +1 -1
- package/dist/cjs/types/validators/boolean.d.ts.map +1 -1
- package/dist/cjs/types/validators/datetime.d.ts.map +1 -1
- package/dist/cjs/types/validators/number.d.ts +5 -6
- package/dist/cjs/types/validators/number.d.ts.map +1 -1
- package/dist/cjs/types/validators/object.d.ts.map +1 -1
- package/dist/cjs/types/validators/schema.d.ts +2 -2
- package/dist/cjs/types/validators/schema.d.ts.map +1 -1
- package/dist/cjs/types/validators/string.d.ts +9 -9
- package/dist/cjs/types/validators/string.d.ts.map +1 -1
- package/dist/cjs/types/validators/utils.d.ts +44 -27
- package/dist/cjs/types/validators/utils.d.ts.map +1 -1
- package/dist/esm/src/adapter/fields/index.js +2 -2
- package/dist/esm/src/adapter/fields/object.js +6 -0
- package/dist/esm/src/adapter/index.js +1 -0
- package/dist/esm/src/constants.js +1 -2
- package/dist/esm/src/domain.js +11 -1
- package/dist/esm/src/index.js +38 -73
- package/dist/esm/src/model.js +83 -78
- package/dist/esm/src/schema/array.js +136 -54
- package/dist/esm/src/schema/boolean.js +98 -44
- package/dist/esm/src/schema/datetime.js +91 -38
- package/dist/esm/src/schema/number.js +127 -110
- package/dist/esm/src/schema/object.js +98 -43
- package/dist/esm/src/schema/schema.js +102 -67
- package/dist/esm/src/schema/string.js +147 -59
- package/dist/esm/src/schema/union.js +119 -40
- package/dist/esm/src/types.js +14 -1
- package/dist/esm/src/utils.js +56 -27
- package/dist/esm/src/validators/array.js +6 -1
- package/dist/esm/src/validators/boolean.js +2 -0
- package/dist/esm/src/validators/datetime.js +4 -0
- package/dist/esm/src/validators/number.js +9 -23
- package/dist/esm/src/validators/object.js +1 -0
- package/dist/esm/src/validators/schema.js +5 -1
- package/dist/esm/src/validators/string.js +30 -2
- package/dist/esm/src/validators/union.js +5 -4
- package/dist/esm/src/validators/utils.js +62 -36
- package/package.json +3 -3
- package/src/adapter/fields/array.ts +2 -2
- package/src/adapter/fields/boolean.ts +3 -8
- package/src/adapter/fields/datetime.ts +3 -9
- package/src/adapter/fields/index.ts +11 -11
- package/src/adapter/fields/number.ts +3 -9
- package/src/adapter/fields/object.ts +13 -10
- package/src/adapter/fields/string.ts +3 -9
- package/src/adapter/fields/union.ts +3 -9
- package/src/adapter/index.ts +1 -0
- package/src/adapter/types.ts +60 -45
- package/src/constants.ts +1 -3
- package/src/domain.ts +15 -1
- package/src/index.ts +189 -211
- package/src/model.ts +119 -115
- package/src/schema/array.ts +274 -90
- package/src/schema/boolean.ts +145 -60
- package/src/schema/datetime.ts +133 -49
- package/src/schema/number.ts +210 -173
- package/src/schema/object.ts +167 -74
- package/src/schema/schema.ts +205 -126
- package/src/schema/string.ts +221 -94
- package/src/schema/types.ts +44 -16
- package/src/schema/union.ts +193 -68
- package/src/types.ts +53 -0
- package/src/utils.ts +115 -57
- package/src/validators/array.ts +46 -27
- package/src/validators/boolean.ts +13 -7
- package/src/validators/datetime.ts +24 -16
- package/src/validators/number.ts +53 -63
- package/src/validators/object.ts +6 -5
- package/src/validators/schema.ts +33 -25
- package/src/validators/string.ts +122 -59
- package/src/validators/union.ts +8 -8
- package/src/validators/utils.ts +67 -42
@@ -0,0 +1,10 @@
|
|
1
|
+
import config from '../../../eslint.config.js';
|
2
|
+
|
3
|
+
/** @type {import('eslint').Linter.RulesRecord} */
|
4
|
+
const configs = [{
|
5
|
+
...config[0],
|
6
|
+
name: '@palmares/databases/tests',
|
7
|
+
files: ['src/**/*.ts', 'src/**/*.postgres.ts', 'manage.ts', 'drizzle.config.ts', '.drizzle/schema.ts'],
|
8
|
+
}];
|
9
|
+
|
10
|
+
export default configs;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
3
|
+
|
4
|
+
case `uname` in
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
6
|
+
esac
|
7
|
+
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
9
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/drizzle-kit@0.23.0/node_modules/drizzle-kit/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/drizzle-kit@0.23.0/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules"
|
10
|
+
else
|
11
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/drizzle-kit@0.23.0/node_modules/drizzle-kit/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/drizzle-kit@0.23.0/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules:$NODE_PATH"
|
12
|
+
fi
|
13
|
+
if [ -x "$basedir/node" ]; then
|
14
|
+
exec "$basedir/node" "$basedir/../drizzle-kit/bin.cjs" "$@"
|
15
|
+
else
|
16
|
+
exec node "$basedir/../drizzle-kit/bin.cjs" "$@"
|
17
|
+
fi
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
3
|
+
|
4
|
+
case `uname` in
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
6
|
+
esac
|
7
|
+
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
9
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/esbuild@0.19.12/node_modules/esbuild/bin/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/esbuild@0.19.12/node_modules/esbuild/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/esbuild@0.19.12/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules"
|
10
|
+
else
|
11
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/esbuild@0.19.12/node_modules/esbuild/bin/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/esbuild@0.19.12/node_modules/esbuild/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/esbuild@0.19.12/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules:$NODE_PATH"
|
12
|
+
fi
|
13
|
+
"$basedir/../../../../../node_modules/.pnpm/esbuild@0.19.12/node_modules/esbuild/bin/esbuild" "$@"
|
14
|
+
exit $?
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
3
|
+
|
4
|
+
case `uname` in
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
6
|
+
esac
|
7
|
+
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
9
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/bin/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules"
|
10
|
+
else
|
11
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/bin/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules:$NODE_PATH"
|
12
|
+
fi
|
13
|
+
if [ -x "$basedir/node" ]; then
|
14
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
|
15
|
+
else
|
16
|
+
exec node "$basedir/../typescript/bin/tsc" "$@"
|
17
|
+
fi
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
3
|
+
|
4
|
+
case `uname` in
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
6
|
+
esac
|
7
|
+
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
9
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/bin/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules"
|
10
|
+
else
|
11
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/bin/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/typescript@5.5.4/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules:$NODE_PATH"
|
12
|
+
fi
|
13
|
+
if [ -x "$basedir/node" ]; then
|
14
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
|
15
|
+
else
|
16
|
+
exec node "$basedir/../typescript/bin/tsserver" "$@"
|
17
|
+
fi
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
3
|
+
|
4
|
+
case `uname` in
|
5
|
+
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
6
|
+
esac
|
7
|
+
|
8
|
+
if [ -z "$NODE_PATH" ]; then
|
9
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/tsx@4.16.2/node_modules/tsx/dist/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/tsx@4.16.2/node_modules/tsx/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/tsx@4.16.2/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules"
|
10
|
+
else
|
11
|
+
export NODE_PATH="/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/tsx@4.16.2/node_modules/tsx/dist/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/tsx@4.16.2/node_modules/tsx/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/tsx@4.16.2/node_modules:/Users/nicolasmelo/workspace/palmares/node_modules/.pnpm/node_modules:$NODE_PATH"
|
12
|
+
fi
|
13
|
+
if [ -x "$basedir/node" ]; then
|
14
|
+
exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@"
|
15
|
+
else
|
16
|
+
exec node "$basedir/../tsx/dist/cli.mjs" "$@"
|
17
|
+
fi
|
@@ -0,0 +1,36 @@
|
|
1
|
+
{
|
2
|
+
"name": "@tests/schemas",
|
3
|
+
"version": "0.0.1",
|
4
|
+
"description": "testing the schemas",
|
5
|
+
"main": "manage.ts",
|
6
|
+
"scripts": {
|
7
|
+
"test": "tsx manage.ts test",
|
8
|
+
"test:watch": "WATCH=true tsx manage.ts test",
|
9
|
+
"load": "tsx manage.ts load-models",
|
10
|
+
"makemigrations": "drizzle-kit generate",
|
11
|
+
"migrate": "tsx manage.ts drizzleMigrate"
|
12
|
+
},
|
13
|
+
"keywords": [],
|
14
|
+
"author": "",
|
15
|
+
"license": "ISC",
|
16
|
+
"dependencies": {
|
17
|
+
"@palmares/console-logging": "workspace:*",
|
18
|
+
"@palmares/core": "workspace:*",
|
19
|
+
"@palmares/databases": "workspace:*",
|
20
|
+
"@palmares/drizzle-engine": "workspace:*",
|
21
|
+
"@palmares/jest-tests": "workspace:*",
|
22
|
+
"@palmares/logging": "workspace:*",
|
23
|
+
"@palmares/node-std": "workspace:*",
|
24
|
+
"@palmares/schemas": "workspace:*",
|
25
|
+
"@palmares/tests": "workspace:*",
|
26
|
+
"@palmares/zod-schema": "workspace:*",
|
27
|
+
"better-sqlite3": "^11.1.2",
|
28
|
+
"drizzle-kit": "^0.23.0",
|
29
|
+
"drizzle-orm": "^0.32.0"
|
30
|
+
},
|
31
|
+
"devDependencies": {
|
32
|
+
"@types/better-sqlite3": "^7.6.11",
|
33
|
+
"tsx": "^4.16.2",
|
34
|
+
"typescript": "^5.5.4"
|
35
|
+
}
|
36
|
+
}
|
Binary file
|
@@ -0,0 +1,130 @@
|
|
1
|
+
import * as p from '@palmares/schemas';
|
2
|
+
import { describe } from '@palmares/tests';
|
3
|
+
|
4
|
+
import type JestTestAdapter from '@palmares/jest-tests';
|
5
|
+
|
6
|
+
describe<JestTestAdapter>('Array Tests', ({ test }) => {
|
7
|
+
test('optional', async ({ expect }) => {
|
8
|
+
const arraySchema = p.array([p.number()]);
|
9
|
+
const tupleSchema = p.array(p.number(), p.string());
|
10
|
+
const arraySchemaWithCustomMessage = p.array([p.number()]).nonOptional({ message: 'hello' });
|
11
|
+
const tupleSchemaWithCustomMessage = p.array(p.number(), p.string()).nonOptional({ message: 'hello' });
|
12
|
+
|
13
|
+
const [
|
14
|
+
{ errors: errorsArrayOnFail },
|
15
|
+
{ errors: errorsTupleOnFail },
|
16
|
+
{ errors: errorsArrayOnFailWithCustomMessage },
|
17
|
+
{ errors: errorsTupleOnFailWithCustomMessage },
|
18
|
+
{ errors: errorsOnValidArray, parsed: parsedArray },
|
19
|
+
{ errors: errorsOnValidTuple, parsed: parsedTuple }
|
20
|
+
] = await Promise.all([
|
21
|
+
arraySchema.parse(undefined as any),
|
22
|
+
tupleSchema.parse(undefined as any),
|
23
|
+
arraySchemaWithCustomMessage.parse(undefined as any),
|
24
|
+
tupleSchemaWithCustomMessage.parse(undefined as any),
|
25
|
+
arraySchema.parse([1, 2, 3]),
|
26
|
+
tupleSchema.parse([1, 'test'])
|
27
|
+
]);
|
28
|
+
|
29
|
+
expect(errorsArrayOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
30
|
+
expect(errorsTupleOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
31
|
+
expect(errorsArrayOnFail?.[0]?.code).toBe('required');
|
32
|
+
expect(errorsArrayOnFail?.[0]?.message).toBe('Required');
|
33
|
+
expect(errorsTupleOnFail?.[0]?.code).toBe('required');
|
34
|
+
expect(errorsTupleOnFail?.[0]?.message).toBe('Required');
|
35
|
+
expect((errorsOnValidArray || []).length).toBe(0);
|
36
|
+
expect(parsedArray[0]).toBe(1);
|
37
|
+
expect(parsedArray[2]).toBe(3);
|
38
|
+
expect((errorsOnValidTuple || []).length).toBe(0);
|
39
|
+
expect(parsedTuple[0]).toBe(1);
|
40
|
+
expect(parsedTuple[1]).toBe('test');
|
41
|
+
});
|
42
|
+
|
43
|
+
test('nullable', async ({ expect }) => {
|
44
|
+
const arraySchema = p.array([p.number()]);
|
45
|
+
const tupleSchema = p.array(p.number(), p.string());
|
46
|
+
const arraySchemaWithCustomMessage = p.array([p.number()]).nonNullable({ message: 'hello' });
|
47
|
+
const tupleSchemaWithCustomMessage = p.array(p.number(), p.string()).nonNullable({ message: 'hello' });
|
48
|
+
|
49
|
+
const [
|
50
|
+
{ errors: errorsArrayOnFail },
|
51
|
+
{ errors: errorsTupleOnFail },
|
52
|
+
{ errors: errorsArrayOnFailWithCustomMessage },
|
53
|
+
{ errors: errorsTupleOnFailWithCustomMessage },
|
54
|
+
{ errors: errorsOnValidArray, parsed: parsedArray },
|
55
|
+
{ errors: errorsOnValidTuple, parsed: parsedTuple }
|
56
|
+
] = await Promise.all([
|
57
|
+
arraySchema.parse(null as any),
|
58
|
+
tupleSchema.parse(null as any),
|
59
|
+
arraySchemaWithCustomMessage.parse(null as any),
|
60
|
+
tupleSchemaWithCustomMessage.parse(null as any),
|
61
|
+
arraySchema.parse([1, 2, 3]),
|
62
|
+
tupleSchema.parse([1, 'test'])
|
63
|
+
]);
|
64
|
+
|
65
|
+
expect(errorsArrayOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
66
|
+
expect(errorsTupleOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
67
|
+
expect(errorsArrayOnFail?.[0]?.code).toBe('null');
|
68
|
+
expect(errorsArrayOnFail?.[0]?.message).toBe('Cannot be null');
|
69
|
+
expect(errorsTupleOnFail?.[0]?.code).toBe('null');
|
70
|
+
expect(errorsTupleOnFail?.[0]?.message).toBe('Cannot be null');
|
71
|
+
expect((errorsOnValidArray || []).length).toBe(0);
|
72
|
+
expect(parsedArray[0]).toBe(1);
|
73
|
+
expect(parsedArray[2]).toBe(3);
|
74
|
+
expect((errorsOnValidTuple || []).length).toBe(0);
|
75
|
+
expect(parsedTuple[0]).toBe(1);
|
76
|
+
expect(parsedTuple[1]).toBe('test');
|
77
|
+
});
|
78
|
+
|
79
|
+
test('nested', async ({ expect }) => {
|
80
|
+
const arraySchema = p.array([p.union([p.number(), p.string().toRepresentation(async () => 'hey')])]);
|
81
|
+
|
82
|
+
const data = await arraySchema.data(['test', 1]);
|
83
|
+
|
84
|
+
expect(data[0]).toBe('hey');
|
85
|
+
expect(data[1]).toBe(1)
|
86
|
+
});
|
87
|
+
|
88
|
+
test('min length', async ({ expect }) => {
|
89
|
+
const arraySchema = p.array([p.number()]).minLength(1);
|
90
|
+
const arraySchemaWithCustomMessage = p.array([p.number()]).minLength(1, { inclusive: true, message: 'hello' });
|
91
|
+
|
92
|
+
const [
|
93
|
+
{ errors: errorsArrayOnFail },
|
94
|
+
{ errors: errorsArrayOnFailWithCustomMessage },
|
95
|
+
{ errors: errorsOnValidArray, parsed: parsedArray }
|
96
|
+
] = await Promise.all([
|
97
|
+
arraySchema.parse([] as any),
|
98
|
+
arraySchemaWithCustomMessage.parse([] as any),
|
99
|
+
arraySchema.parse([1, 2, 3])
|
100
|
+
]);
|
101
|
+
|
102
|
+
expect(errorsArrayOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
103
|
+
expect(errorsArrayOnFail?.[0]?.code).toBe('minLength');
|
104
|
+
expect(errorsArrayOnFail?.[0]?.message).toBe('The array must have a minimum length of 1');
|
105
|
+
expect((errorsOnValidArray || []).length).toBe(0);
|
106
|
+
expect(parsedArray[0]).toBe(1);
|
107
|
+
expect(parsedArray[2]).toBe(3);
|
108
|
+
});
|
109
|
+
|
110
|
+
test('max length', async ({ expect }) => {
|
111
|
+
const arraySchema = p.array([p.number()]).maxLength(1);
|
112
|
+
const arraySchemaWithCustomMessage = p.array([p.number()]).maxLength(1, { inclusive: true, message: 'hello' });
|
113
|
+
|
114
|
+
const [
|
115
|
+
{ errors: errorsArrayOnFail },
|
116
|
+
{ errors: errorsArrayOnFailWithCustomMessage },
|
117
|
+
{ errors: errorsOnValidArray, parsed: parsedArray }
|
118
|
+
] = await Promise.all([
|
119
|
+
arraySchema.parse([1, 2, 3] as any),
|
120
|
+
arraySchemaWithCustomMessage.parse([1, 2, 3] as any),
|
121
|
+
arraySchema.parse([1])
|
122
|
+
]);
|
123
|
+
|
124
|
+
expect(errorsArrayOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
125
|
+
expect(errorsArrayOnFail?.[0]?.code).toBe('maxLength');
|
126
|
+
expect(errorsArrayOnFail?.[0]?.message).toBe('The array must have a maximum length of 1');
|
127
|
+
expect((errorsOnValidArray || []).length).toBe(0);
|
128
|
+
expect(parsedArray[0]).toBe(1);
|
129
|
+
});
|
130
|
+
});
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import * as p from '@palmares/schemas';
|
2
|
+
import { describe } from '@palmares/tests';
|
3
|
+
|
4
|
+
import type JestTestAdapter from '@palmares/jest-tests';
|
5
|
+
|
6
|
+
describe<JestTestAdapter>('Boolean Tests', ({ test }) => {
|
7
|
+
test('optional', async ({ expect }) => {
|
8
|
+
const booleanSchema = p.boolean();
|
9
|
+
const booleanSchemaWithCustomMessage = p.boolean().nonOptional({ message: 'hello' });
|
10
|
+
|
11
|
+
const [{ errors: errorsOnFail }, { errors: errorsOnFailWithCustomMessage }, { errors: errorsOnValid, parsed }] =
|
12
|
+
await Promise.all([
|
13
|
+
booleanSchema.parse(undefined as any),
|
14
|
+
booleanSchemaWithCustomMessage.parse(undefined as any),
|
15
|
+
booleanSchema.parse(true)
|
16
|
+
]);
|
17
|
+
|
18
|
+
expect(errorsOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
19
|
+
expect(errorsOnFail?.[0]?.code).toBe('required');
|
20
|
+
expect(errorsOnFail?.[0]?.message).toBe('Required');
|
21
|
+
expect((errorsOnValid || []).length).toBe(0);
|
22
|
+
expect(parsed).toBe(true);
|
23
|
+
});
|
24
|
+
|
25
|
+
test('nullable', async ({ expect }) => {
|
26
|
+
const booleanSchema = p.boolean();
|
27
|
+
const booleanSchemaWithCustomMessage = p.boolean().nonNullable({ message: 'hello' });
|
28
|
+
|
29
|
+
const [{ errors: errorsOnFail }, { errors: errorsOnFailWithCustomMessage }, { errors: errorsOnValid, parsed }] =
|
30
|
+
await Promise.all([
|
31
|
+
booleanSchema.parse(null as any),
|
32
|
+
booleanSchemaWithCustomMessage.parse(null as any),
|
33
|
+
booleanSchema.parse(true)
|
34
|
+
]);
|
35
|
+
|
36
|
+
expect(errorsOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
37
|
+
expect(errorsOnFail?.[0]?.code).toBe('null');
|
38
|
+
expect(errorsOnFail?.[0]?.message).toBe('Cannot be null');
|
39
|
+
expect((errorsOnValid || []).length).toBe(0);
|
40
|
+
expect(parsed).toBe(true);
|
41
|
+
});
|
42
|
+
|
43
|
+
test('true and false values', async ({ expect }) => {
|
44
|
+
const booleanSchema = p.boolean().trueValues(['Y']).falseValues(['N']);
|
45
|
+
|
46
|
+
const [{ errors: errorsTrue, parsed: parsedTrue }, { errors: errorsFalse, parsed: parsedFalse }] =
|
47
|
+
await Promise.all([booleanSchema.parse('Y'), booleanSchema.parse('N')]);
|
48
|
+
|
49
|
+
expect((errorsTrue || []).length).toBe(0);
|
50
|
+
expect((errorsFalse || []).length).toBe(0);
|
51
|
+
expect(parsedTrue).toBe(true);
|
52
|
+
expect(parsedFalse).toBe(false);
|
53
|
+
});
|
54
|
+
|
55
|
+
test('number and string values', async ({ expect }) => {
|
56
|
+
const booleanSchema = p.boolean().allowNumber().allowString();
|
57
|
+
|
58
|
+
const [{ errors: errorsNumber, parsed: parsedNumber }, { errors: errorsString, parsed: parsedString }] =
|
59
|
+
await Promise.all([booleanSchema.parse(1), booleanSchema.parse('true')]);
|
60
|
+
|
61
|
+
expect((errorsNumber || []).length).toBe(0);
|
62
|
+
expect((errorsString || []).length).toBe(0);
|
63
|
+
expect(parsedNumber).toBe(true);
|
64
|
+
expect(parsedString).toBe(true);
|
65
|
+
});
|
66
|
+
});
|
@@ -0,0 +1,102 @@
|
|
1
|
+
import * as p from '@palmares/schemas';
|
2
|
+
import { describe } from '@palmares/tests';
|
3
|
+
|
4
|
+
import type JestTestAdapter from '@palmares/jest-tests';
|
5
|
+
|
6
|
+
describe<JestTestAdapter>('Datetime Tests', ({ test }) => {
|
7
|
+
test('optional', async ({ expect }) => {
|
8
|
+
const datetimeSchema = p.datetime();
|
9
|
+
const datetimeSchemaWithCustomMessage = p.datetime().nonOptional({ message: 'hello' });
|
10
|
+
const now = new Date();
|
11
|
+
|
12
|
+
const [{ errors: errorsOnFail }, { errors: errorsOnFailWithCustomMessage }, { errors: errorsOnValid, parsed }] =
|
13
|
+
await Promise.all([
|
14
|
+
datetimeSchema.parse(undefined as any),
|
15
|
+
datetimeSchemaWithCustomMessage.parse(undefined as any),
|
16
|
+
datetimeSchema.parse(now)
|
17
|
+
]);
|
18
|
+
|
19
|
+
expect(errorsOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
20
|
+
expect(errorsOnFail?.[0]?.code).toBe('required');
|
21
|
+
expect(errorsOnFail?.[0]?.message).toBe('Required');
|
22
|
+
expect((errorsOnValid || []).length).toBe(0);
|
23
|
+
expect(parsed.toISOString()).toBe(now.toISOString());
|
24
|
+
});
|
25
|
+
|
26
|
+
test('nullable', async ({ expect }) => {
|
27
|
+
const datetimeSchema = p.datetime();
|
28
|
+
const datetimeSchemaWithCustomMessage = p.datetime().nonNullable({ message: 'hello' });
|
29
|
+
const now = new Date();
|
30
|
+
|
31
|
+
const [{ errors: errorsOnFail }, { errors: errorsOnFailWithCustomMessage }, { errors: errorsOnValid, parsed }] =
|
32
|
+
await Promise.all([
|
33
|
+
datetimeSchema.parse(null as any),
|
34
|
+
datetimeSchemaWithCustomMessage.parse(null as any),
|
35
|
+
datetimeSchema.parse(now)
|
36
|
+
]);
|
37
|
+
|
38
|
+
expect(errorsOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
39
|
+
expect(errorsOnFail?.[0]?.code).toBe('null');
|
40
|
+
expect(errorsOnFail?.[0]?.message).toBe('Cannot be null');
|
41
|
+
expect((errorsOnValid || []).length).toBe(0);
|
42
|
+
expect(parsed.toISOString()).toBe(now.toISOString());
|
43
|
+
});
|
44
|
+
|
45
|
+
test('below', async ({ expect }) => {
|
46
|
+
const nowMinus10Minutes = new Date();
|
47
|
+
nowMinus10Minutes.setMinutes(-10);
|
48
|
+
const nowMinus20Minutes = new Date();
|
49
|
+
nowMinus20Minutes.setMinutes(-20);
|
50
|
+
const datetimeSchema = p.datetime().below(nowMinus10Minutes);
|
51
|
+
const datetimeSchemaWithCustomMessage = p
|
52
|
+
.datetime()
|
53
|
+
.below(nowMinus10Minutes, { message: 'hello', inclusive: false });
|
54
|
+
|
55
|
+
const [{ errors: errorsOnFail }, { errors: errorsOnFailWithCustomMessage }, { errors: errorsOnValid, parsed }] =
|
56
|
+
await Promise.all([
|
57
|
+
datetimeSchema.parse(nowMinus10Minutes),
|
58
|
+
datetimeSchemaWithCustomMessage.parse(nowMinus10Minutes),
|
59
|
+
datetimeSchema.parse(nowMinus20Minutes)
|
60
|
+
]);
|
61
|
+
|
62
|
+
expect(errorsOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
63
|
+
expect(errorsOnFail?.[0]?.code).toBe('below');
|
64
|
+
expect(errorsOnFail?.[0]?.message).toBe('Value is not below the specified date');
|
65
|
+
expect((errorsOnValid || []).length).toBe(0);
|
66
|
+
expect(parsed.toISOString()).toBe(nowMinus20Minutes.toISOString());
|
67
|
+
});
|
68
|
+
|
69
|
+
test('above', async ({ expect }) => {
|
70
|
+
const nowPlus10Minutes = new Date();
|
71
|
+
nowPlus10Minutes.setMinutes(nowPlus10Minutes.getMinutes() + 10);
|
72
|
+
const nowPlus20Minutes = new Date();
|
73
|
+
nowPlus20Minutes.setMinutes(nowPlus20Minutes.getMinutes() + 20);
|
74
|
+
const datetimeSchema = p.datetime().above(nowPlus10Minutes);
|
75
|
+
const datetimeSchemaWithCustomMessage = p
|
76
|
+
.datetime()
|
77
|
+
.below(nowPlus10Minutes, { message: 'hello', inclusive: false });
|
78
|
+
|
79
|
+
const [{ errors: errorsOnFail }, { errors: errorsOnFailWithCustomMessage }, { errors: errorsOnValid, parsed }] =
|
80
|
+
await Promise.all([
|
81
|
+
datetimeSchema.parse(nowPlus10Minutes),
|
82
|
+
datetimeSchemaWithCustomMessage.parse(nowPlus10Minutes),
|
83
|
+
datetimeSchema.parse(nowPlus20Minutes)
|
84
|
+
]);
|
85
|
+
|
86
|
+
expect(errorsOnFailWithCustomMessage?.[0]?.message).toBe('hello');
|
87
|
+
expect(errorsOnFail?.[0]?.code).toBe('above');
|
88
|
+
expect(errorsOnFail?.[0]?.message).toBe('Value is not above the specified date');
|
89
|
+
expect((errorsOnValid || []).length).toBe(0);
|
90
|
+
expect(parsed.toISOString()).toBe(nowPlus20Minutes.toISOString());
|
91
|
+
});
|
92
|
+
|
93
|
+
test('allowString', async ({ expect }) => {
|
94
|
+
const datetimeSchema = p.datetime().allowString();
|
95
|
+
const now = new Date();
|
96
|
+
|
97
|
+
const { errors: errorsOnValid, parsed } = await datetimeSchema.parse(now.toISOString());
|
98
|
+
|
99
|
+
expect((errorsOnValid || []).length).toBe(0);
|
100
|
+
expect((parsed as Date).toISOString()).toBe(now.toISOString());
|
101
|
+
});
|
102
|
+
});
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { domain } from '@palmares/core';
|
2
|
+
import { testDomainModifier, } from '@palmares/tests';
|
3
|
+
import { databaseDomainModifier } from '@palmares/databases';
|
4
|
+
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
|
5
|
+
|
6
|
+
import * as models from './models';
|
7
|
+
import { db } from '../settings';
|
8
|
+
|
9
|
+
export default domain('testingDrizzle', __dirname, {
|
10
|
+
commands: {
|
11
|
+
drizzleMigrate: {
|
12
|
+
description: 'Migrate the database using drizzle',
|
13
|
+
keywordArgs: undefined,
|
14
|
+
positionalArgs: undefined,
|
15
|
+
handler: () => {
|
16
|
+
migrate(db, { migrationsFolder: './.drizzle/migrations' });
|
17
|
+
}
|
18
|
+
}
|
19
|
+
},
|
20
|
+
modifiers: [testDomainModifier, databaseDomainModifier] as const,
|
21
|
+
getMigrations: () => [],
|
22
|
+
getModels: () => models,
|
23
|
+
getTests: () => [
|
24
|
+
__dirname + '/test.test.ts',
|
25
|
+
__dirname + '/numbers.test.ts',
|
26
|
+
__dirname + '/boolean.test.ts',
|
27
|
+
__dirname + '/datetime.test.ts',
|
28
|
+
__dirname + '/object.test.ts',
|
29
|
+
__dirname + '/union.test.ts',
|
30
|
+
__dirname + '/array.test.ts',
|
31
|
+
__dirname + '/types.test.ts',
|
32
|
+
__dirname + '/string.test.ts',
|
33
|
+
__dirname + '/model.test.ts'
|
34
|
+
]
|
35
|
+
});
|