@based/schema 0.0.10 → 0.0.11

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 (90) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +1 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/set/collections.js +39 -17
  5. package/dist/set/collections.js.map +1 -1
  6. package/dist/set/error.d.ts +4 -2
  7. package/dist/set/error.js +9 -3
  8. package/dist/set/error.js.map +1 -1
  9. package/dist/set/index.d.ts +2 -2
  10. package/dist/set/index.js +48 -8
  11. package/dist/set/index.js.map +1 -1
  12. package/dist/set/number.js +37 -23
  13. package/dist/set/number.js.map +1 -1
  14. package/dist/set/parseDefaultAndValue.js +5 -3
  15. package/dist/set/parseDefaultAndValue.js.map +1 -1
  16. package/dist/set/references.js +12 -5
  17. package/dist/set/references.js.map +1 -1
  18. package/dist/set/rest.js +4 -4
  19. package/dist/set/rest.js.map +1 -1
  20. package/dist/set/string.js +38 -34
  21. package/dist/set/string.js.map +1 -1
  22. package/dist/set2/index.js +1 -0
  23. package/dist/set2/index.js.map +1 -0
  24. package/dist/types.d.ts +8 -2
  25. package/dist/types.js.map +1 -1
  26. package/dist/walker.d.ts +50 -0
  27. package/dist/walker.js +83 -0
  28. package/dist/walker.js.map +1 -0
  29. package/package.json +1 -1
  30. package/src/index.ts +2 -0
  31. package/src/set/collections.ts +42 -17
  32. package/src/set/error.ts +13 -3
  33. package/src/set/index.ts +65 -8
  34. package/src/set/number.ts +39 -22
  35. package/src/set/parseDefaultAndValue.ts +13 -3
  36. package/src/set/references.ts +11 -5
  37. package/src/set/rest.ts +4 -4
  38. package/src/set/string.ts +48 -36
  39. package/src/set2/index.ts +0 -0
  40. package/src/types.ts +16 -7
  41. package/src/walker.ts +152 -0
  42. package/test/number.ts +646 -0
  43. package/test/reference.ts +207 -0
  44. package/test/setWalker.ts +101 -21
  45. package/test/string.ts +183 -0
  46. package/test/text.ts +171 -0
  47. package/test/validateSchema.ts +0 -1
  48. package/test/walker.ts +99 -0
  49. package/dist/deepPartial.js +0 -3
  50. package/dist/deepPartial.js.map +0 -1
  51. package/dist/schema.d.ts +0 -1
  52. package/dist/schema.js +0 -3
  53. package/dist/schema.js.map +0 -1
  54. package/dist/set/checkDefaultAndValue.d.ts +0 -3
  55. package/dist/set/checkDefaultAndValue.js +0 -33
  56. package/dist/set/checkDefaultAndValue.js.map +0 -1
  57. package/dist/set/enum.d.ts +0 -2
  58. package/dist/set/enum.js +0 -15
  59. package/dist/set/enum.js.map +0 -1
  60. package/dist/set/fieldValidator.d.ts +0 -6
  61. package/dist/set/fieldValidator.js +0 -144
  62. package/dist/set/fieldValidator.js.map +0 -1
  63. package/dist/set/handleError.d.ts +0 -1
  64. package/dist/set/handleError.js +0 -9
  65. package/dist/set/handleError.js.map +0 -1
  66. package/dist/set/number copy.d.ts +0 -4
  67. package/dist/set/number copy.js +0 -57
  68. package/dist/set/number copy.js.map +0 -1
  69. package/dist/set/rest copy.d.ts +0 -5
  70. package/dist/set/rest copy.js +0 -53
  71. package/dist/set/rest copy.js.map +0 -1
  72. package/dist/setWalker.d.ts +0 -11
  73. package/dist/setWalker.js +0 -189
  74. package/dist/setWalker.js.map +0 -1
  75. package/dist/transformers.d.ts +0 -3
  76. package/dist/transformers.js +0 -18
  77. package/dist/transformers.js.map +0 -1
  78. package/dist/typeWalker.d.ts +0 -3
  79. package/dist/typeWalker.js +0 -18
  80. package/dist/typeWalker.js.map +0 -1
  81. package/dist/validate.d.ts +0 -4
  82. package/dist/validate.js +0 -34
  83. package/dist/validate.js.map +0 -1
  84. package/dist/validateFields.d.ts +0 -4
  85. package/dist/validateFields.js +0 -34
  86. package/dist/validateFields.js.map +0 -1
  87. package/dist/validateSchema copy.d.ts +0 -4
  88. package/dist/validateSchema copy.js +0 -34
  89. package/dist/validateSchema copy.js.map +0 -1
  90. /package/dist/{deepPartial.d.ts → set2/index.d.ts} +0 -0
package/src/walker.ts ADDED
@@ -0,0 +1,152 @@
1
+ import { ParseError } from './set/error'
2
+ import { BasedSchema, BasedSetHandlers, BasedSetTarget } from './types'
3
+ import { BasedSchemaType, BasedSchemaFields } from './types'
4
+
5
+ type Path = (string | number)[]
6
+
7
+ type ErrorHandler<T> = (args: Args<T>, code: ParseError) => void
8
+
9
+ type Parse<T> = (
10
+ args: Args<T>,
11
+ key?: string | number,
12
+ value?: any
13
+ ) => Promise<Args<T> | void> // If true will not continue
14
+
15
+ export type Args<
16
+ T,
17
+ K extends keyof BasedSchemaFields = keyof BasedSchemaFields
18
+ > = {
19
+ schema: BasedSchema
20
+ parentValue?: any
21
+ skipCollection?: boolean
22
+ fieldSchema?: BasedSchemaFields[K]
23
+ typeSchema?: BasedSchemaType
24
+ path: Path
25
+ value: any
26
+ target: T
27
+ parse: Parse<T>
28
+ collect: (args: Args<T>) => any
29
+ backtrack: (collectedCommands: any[]) => any
30
+ requiresAsyncValidaton: (validationType: any) => Promise<any>
31
+ error: ErrorHandler<T>
32
+ }
33
+
34
+ export type FieldParser<T, K extends keyof BasedSchemaFields> = (
35
+ args: Args<T, K>
36
+ ) => Promise<Args<T> | void>
37
+
38
+ export type KeyParser<T> = (
39
+ args: Args<T, keyof BasedSchemaFields>
40
+ ) => Promise<Args<T> | void>
41
+
42
+ export type Opts<T> = {
43
+ schema: BasedSchema
44
+ init: (
45
+ value: any,
46
+ opts: Opts<T>,
47
+ errors: { code: ParseError; message: string }[]
48
+ ) => Promise<T>
49
+ parsers: {
50
+ fields: Partial<{
51
+ [Key in keyof BasedSchemaFields]: FieldParser<T, Key>
52
+ }>
53
+ keys: { [key: string]: KeyParser<T> } // $list -> true
54
+ any: KeyParser<T> // y.x
55
+ }
56
+ collect: (args: Args<T>) => any
57
+ backtrack: (collectedCommands: any[]) => any // from back TRACKS OR COLLECT
58
+ requiresAsyncValidaton: (validationType: any) => Promise<boolean>
59
+ }
60
+
61
+ export const walk = async <T>(
62
+ opts: Opts<T>,
63
+ value: any
64
+ ): Promise<{
65
+ target: T
66
+ errors: { code: ParseError; message: string }[]
67
+ }> => {
68
+ const errors: { code: ParseError; message: string }[] = []
69
+ const target = await opts.init(value, opts, errors)
70
+
71
+ const errorsCollector: ErrorHandler<T> = (args, code) => {
72
+ errors.push({
73
+ code,
74
+ message: 'flap flap',
75
+ })
76
+ }
77
+
78
+ const parse: Parse<T> = async (prevArgs, key, value) => {
79
+ const collectedCommands: any[] = []
80
+ const fromBackTrack: any[] = []
81
+ const args: Args<T> = {
82
+ schema: opts.schema,
83
+ path: key ? [...prevArgs.path, key] : prevArgs.path,
84
+ parentValue: value ? prevArgs.value : undefined,
85
+ value: value ?? prevArgs.value,
86
+ target,
87
+ parse: prevArgs.parse,
88
+ collect: (args) => {
89
+ collectedCommands.push(opts.collect(args))
90
+ },
91
+ backtrack: (args) => {
92
+ fromBackTrack.push(opts.backtrack(args))
93
+ },
94
+ error: errorsCollector,
95
+ requiresAsyncValidaton: opts.requiresAsyncValidaton,
96
+ }
97
+ if (typeof args.value === 'object' && args.value !== null) {
98
+ const q: Promise<Args<T> | void>[] = []
99
+ if (Array.isArray(args.value)) {
100
+ for (let i = 0; i < args.value.length; i++) {
101
+ //
102
+ const parser = opts.parsers.keys[i] || opts.parsers.any
103
+ q.push(
104
+ parser({ ...args, value: args.value[i], path: [...args.path, i] })
105
+ )
106
+ }
107
+ } else {
108
+ for (const key in args.value) {
109
+ const parser = opts.parsers.keys[key] || opts.parsers.any
110
+ q.push(
111
+ (async () => {
112
+ const newArgs = await parser({
113
+ ...args,
114
+ value: args.value[key],
115
+ path: [...args.path, key],
116
+ })
117
+
118
+ if (newArgs) {
119
+ return parse(newArgs)
120
+ }
121
+ })()
122
+ )
123
+ }
124
+ }
125
+ await Promise.all(q)
126
+ if (fromBackTrack.length) {
127
+ opts.backtrack(fromBackTrack)
128
+ } else if (collectedCommands.length) {
129
+ opts.backtrack(collectedCommands)
130
+ }
131
+ }
132
+ }
133
+
134
+ const args: Args<T> = {
135
+ schema: opts.schema,
136
+ path: [],
137
+ value,
138
+ target,
139
+ parse,
140
+ collect: opts.collect,
141
+ backtrack: opts.backtrack,
142
+ error: errorsCollector,
143
+ requiresAsyncValidaton: opts.requiresAsyncValidaton,
144
+ }
145
+
146
+ parse(args)
147
+
148
+ return {
149
+ target,
150
+ errors,
151
+ }
152
+ }