@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.
Files changed (174) hide show
  1. package/.turbo/turbo-build$colon$watch.log +12 -410
  2. package/CHANGELOG.md +17 -0
  3. package/__tests__/.drizzle/migrations/0000_skinny_harrier.sql +22 -0
  4. package/__tests__/.drizzle/migrations/meta/0000_snapshot.json +156 -0
  5. package/__tests__/.drizzle/migrations/meta/_journal.json +13 -0
  6. package/__tests__/.drizzle/schema.ts +35 -0
  7. package/__tests__/drizzle.config.ts +11 -0
  8. package/__tests__/eslint.config.js +10 -0
  9. package/__tests__/manage.ts +5 -0
  10. package/__tests__/node_modules/.bin/drizzle-kit +17 -0
  11. package/__tests__/node_modules/.bin/esbuild +14 -0
  12. package/__tests__/node_modules/.bin/tsc +17 -0
  13. package/__tests__/node_modules/.bin/tsserver +17 -0
  14. package/__tests__/node_modules/.bin/tsx +17 -0
  15. package/__tests__/package.json +36 -0
  16. package/__tests__/sqlite.db +0 -0
  17. package/__tests__/src/core/array.test.ts +130 -0
  18. package/__tests__/src/core/boolean.test.ts +66 -0
  19. package/__tests__/src/core/datetime.test.ts +102 -0
  20. package/__tests__/src/core/index.ts +35 -0
  21. package/__tests__/src/core/model.test.ts +260 -0
  22. package/__tests__/src/core/models.ts +50 -0
  23. package/__tests__/src/core/numbers.test.ts +177 -0
  24. package/__tests__/src/core/object.test.ts +198 -0
  25. package/__tests__/src/core/string.test.ts +222 -0
  26. package/__tests__/src/core/test.test.ts +59 -0
  27. package/__tests__/src/core/types.test.ts +97 -0
  28. package/__tests__/src/core/union.test.ts +99 -0
  29. package/__tests__/src/settings.ts +71 -0
  30. package/__tests__/tsconfig.json +11 -0
  31. package/dist/cjs/src/adapter/fields/index.js +2 -2
  32. package/dist/cjs/src/adapter/fields/object.js +9 -0
  33. package/dist/cjs/src/adapter/index.js +1 -0
  34. package/dist/cjs/src/constants.js +1 -7
  35. package/dist/cjs/src/domain.js +146 -1
  36. package/dist/cjs/src/index.js +69 -74
  37. package/dist/cjs/src/model.js +206 -206
  38. package/dist/cjs/src/schema/array.js +185 -58
  39. package/dist/cjs/src/schema/boolean.js +105 -44
  40. package/dist/cjs/src/schema/datetime.js +104 -38
  41. package/dist/cjs/src/schema/number.js +134 -114
  42. package/dist/cjs/src/schema/object.js +106 -43
  43. package/dist/cjs/src/schema/schema.js +123 -75
  44. package/dist/cjs/src/schema/string.js +152 -58
  45. package/dist/cjs/src/schema/union.js +412 -290
  46. package/dist/cjs/src/utils.js +42 -15
  47. package/dist/cjs/src/validators/array.js +6 -1
  48. package/dist/cjs/src/validators/boolean.js +2 -0
  49. package/dist/cjs/src/validators/datetime.js +4 -0
  50. package/dist/cjs/src/validators/number.js +12 -40
  51. package/dist/cjs/src/validators/object.js +1 -0
  52. package/dist/cjs/src/validators/schema.js +5 -1
  53. package/dist/cjs/src/validators/string.js +30 -2
  54. package/dist/cjs/src/validators/union.js +5 -4
  55. package/dist/cjs/src/validators/utils.js +99 -27
  56. package/dist/cjs/tsconfig.types.tsbuildinfo +1 -1
  57. package/dist/cjs/types/adapter/fields/array.d.ts +2 -2
  58. package/dist/cjs/types/adapter/fields/array.d.ts.map +1 -1
  59. package/dist/cjs/types/adapter/fields/boolean.d.ts.map +1 -1
  60. package/dist/cjs/types/adapter/fields/datetime.d.ts.map +1 -1
  61. package/dist/cjs/types/adapter/fields/index.d.ts +2 -2
  62. package/dist/cjs/types/adapter/fields/index.d.ts.map +1 -1
  63. package/dist/cjs/types/adapter/fields/number.d.ts.map +1 -1
  64. package/dist/cjs/types/adapter/fields/object.d.ts +2 -1
  65. package/dist/cjs/types/adapter/fields/object.d.ts.map +1 -1
  66. package/dist/cjs/types/adapter/fields/string.d.ts.map +1 -1
  67. package/dist/cjs/types/adapter/fields/union.d.ts.map +1 -1
  68. package/dist/cjs/types/adapter/index.d.ts +1 -0
  69. package/dist/cjs/types/adapter/index.d.ts.map +1 -1
  70. package/dist/cjs/types/adapter/types.d.ts +28 -18
  71. package/dist/cjs/types/adapter/types.d.ts.map +1 -1
  72. package/dist/cjs/types/constants.d.ts +0 -1
  73. package/dist/cjs/types/constants.d.ts.map +1 -1
  74. package/dist/cjs/types/domain.d.ts +5 -4
  75. package/dist/cjs/types/domain.d.ts.map +1 -1
  76. package/dist/cjs/types/index.d.ts +78 -55
  77. package/dist/cjs/types/index.d.ts.map +1 -1
  78. package/dist/cjs/types/model.d.ts +17 -17
  79. package/dist/cjs/types/model.d.ts.map +1 -1
  80. package/dist/cjs/types/schema/array.d.ts +168 -47
  81. package/dist/cjs/types/schema/array.d.ts.map +1 -1
  82. package/dist/cjs/types/schema/boolean.d.ts +103 -44
  83. package/dist/cjs/types/schema/boolean.d.ts.map +1 -1
  84. package/dist/cjs/types/schema/datetime.d.ts +90 -30
  85. package/dist/cjs/types/schema/datetime.d.ts.map +1 -1
  86. package/dist/cjs/types/schema/number.d.ts +133 -125
  87. package/dist/cjs/types/schema/number.d.ts.map +1 -1
  88. package/dist/cjs/types/schema/object.d.ts +104 -35
  89. package/dist/cjs/types/schema/object.d.ts.map +1 -1
  90. package/dist/cjs/types/schema/schema.d.ts +62 -44
  91. package/dist/cjs/types/schema/schema.d.ts.map +1 -1
  92. package/dist/cjs/types/schema/string.d.ts +152 -65
  93. package/dist/cjs/types/schema/string.d.ts.map +1 -1
  94. package/dist/cjs/types/schema/types.d.ts +11 -2
  95. package/dist/cjs/types/schema/types.d.ts.map +1 -1
  96. package/dist/cjs/types/schema/union.d.ts +133 -40
  97. package/dist/cjs/types/schema/union.d.ts.map +1 -1
  98. package/dist/cjs/types/types.d.ts +35 -0
  99. package/dist/cjs/types/types.d.ts.map +1 -1
  100. package/dist/cjs/types/utils.d.ts +41 -27
  101. package/dist/cjs/types/utils.d.ts.map +1 -1
  102. package/dist/cjs/types/validators/array.d.ts.map +1 -1
  103. package/dist/cjs/types/validators/boolean.d.ts.map +1 -1
  104. package/dist/cjs/types/validators/datetime.d.ts.map +1 -1
  105. package/dist/cjs/types/validators/number.d.ts +5 -6
  106. package/dist/cjs/types/validators/number.d.ts.map +1 -1
  107. package/dist/cjs/types/validators/object.d.ts.map +1 -1
  108. package/dist/cjs/types/validators/schema.d.ts +2 -2
  109. package/dist/cjs/types/validators/schema.d.ts.map +1 -1
  110. package/dist/cjs/types/validators/string.d.ts +9 -9
  111. package/dist/cjs/types/validators/string.d.ts.map +1 -1
  112. package/dist/cjs/types/validators/utils.d.ts +44 -27
  113. package/dist/cjs/types/validators/utils.d.ts.map +1 -1
  114. package/dist/esm/src/adapter/fields/index.js +2 -2
  115. package/dist/esm/src/adapter/fields/object.js +6 -0
  116. package/dist/esm/src/adapter/index.js +1 -0
  117. package/dist/esm/src/constants.js +1 -2
  118. package/dist/esm/src/domain.js +11 -1
  119. package/dist/esm/src/index.js +38 -73
  120. package/dist/esm/src/model.js +83 -78
  121. package/dist/esm/src/schema/array.js +136 -54
  122. package/dist/esm/src/schema/boolean.js +98 -44
  123. package/dist/esm/src/schema/datetime.js +91 -38
  124. package/dist/esm/src/schema/number.js +127 -110
  125. package/dist/esm/src/schema/object.js +98 -43
  126. package/dist/esm/src/schema/schema.js +102 -67
  127. package/dist/esm/src/schema/string.js +147 -59
  128. package/dist/esm/src/schema/union.js +119 -40
  129. package/dist/esm/src/types.js +14 -1
  130. package/dist/esm/src/utils.js +56 -27
  131. package/dist/esm/src/validators/array.js +6 -1
  132. package/dist/esm/src/validators/boolean.js +2 -0
  133. package/dist/esm/src/validators/datetime.js +4 -0
  134. package/dist/esm/src/validators/number.js +9 -23
  135. package/dist/esm/src/validators/object.js +1 -0
  136. package/dist/esm/src/validators/schema.js +5 -1
  137. package/dist/esm/src/validators/string.js +30 -2
  138. package/dist/esm/src/validators/union.js +5 -4
  139. package/dist/esm/src/validators/utils.js +62 -36
  140. package/package.json +3 -3
  141. package/src/adapter/fields/array.ts +2 -2
  142. package/src/adapter/fields/boolean.ts +3 -8
  143. package/src/adapter/fields/datetime.ts +3 -9
  144. package/src/adapter/fields/index.ts +11 -11
  145. package/src/adapter/fields/number.ts +3 -9
  146. package/src/adapter/fields/object.ts +13 -10
  147. package/src/adapter/fields/string.ts +3 -9
  148. package/src/adapter/fields/union.ts +3 -9
  149. package/src/adapter/index.ts +1 -0
  150. package/src/adapter/types.ts +60 -45
  151. package/src/constants.ts +1 -3
  152. package/src/domain.ts +15 -1
  153. package/src/index.ts +189 -211
  154. package/src/model.ts +119 -115
  155. package/src/schema/array.ts +274 -90
  156. package/src/schema/boolean.ts +145 -60
  157. package/src/schema/datetime.ts +133 -49
  158. package/src/schema/number.ts +210 -173
  159. package/src/schema/object.ts +167 -74
  160. package/src/schema/schema.ts +205 -126
  161. package/src/schema/string.ts +221 -94
  162. package/src/schema/types.ts +44 -16
  163. package/src/schema/union.ts +193 -68
  164. package/src/types.ts +53 -0
  165. package/src/utils.ts +115 -57
  166. package/src/validators/array.ts +46 -27
  167. package/src/validators/boolean.ts +13 -7
  168. package/src/validators/datetime.ts +24 -16
  169. package/src/validators/number.ts +53 -63
  170. package/src/validators/object.ts +6 -5
  171. package/src/validators/schema.ts +33 -25
  172. package/src/validators/string.ts +122 -59
  173. package/src/validators/union.ts +8 -8
  174. package/src/validators/utils.ts +67 -42
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'drizzle-kit';
2
+
3
+ export default defineConfig({
4
+ schema: './.drizzle/schema.ts',
5
+ out: './.drizzle/migrations',
6
+ dialect: 'sqlite',
7
+ dbCredentials: {
8
+ databaseId: 'default',
9
+ url: 'sqlite.db',
10
+ },
11
+ });
@@ -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,5 @@
1
+ import { Commands } from '@palmares/core';
2
+
3
+ import settings from './src/settings';
4
+
5
+ Commands.handleCommands(settings, process.argv.slice(2));
@@ -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
+ });