@based/schema 0.0.14 → 0.0.16

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.
@@ -1 +1,71 @@
1
+ // import { ParseError } from '../set/error'
2
+ // import { BasedSchema, BasedSetTarget } from '../types'
3
+ // import { walk } from '../walker'
4
+ // export const setWalker2 = (schema: BasedSchema, value: any) => {
5
+ // return walk<BasedSetTarget>(
6
+ // {
7
+ // schema,
8
+ // parsers: {
9
+ // keys: {},
10
+ // fields: {
11
+ // object: async (args) => {
12
+ // if (typeof value !== 'object') {
13
+ // args.error(args, ParseError.incorrectFormat)
14
+ // return
15
+ // }
16
+ // const isArray = Array.isArray(value)
17
+ // if (isArray) {
18
+ // args.error(args, ParseError.incorrectFormat)
19
+ // return
20
+ // }
21
+ // const q: Promise<any>[] = []
22
+ // for (const key in value) {
23
+ // q.push(args.parse(args, key, value[key]))
24
+ // }
25
+ // await Promise.all(q)
26
+ // },
27
+ // boolean: async (args) => {
28
+ // if (typeof value !== 'boolean') {
29
+ // args.error(args, ParseError.incorrectFormat)
30
+ // return
31
+ // }
32
+ // args.collect(args)
33
+ // },
34
+ // },
35
+ // any: async (args) => {
36
+ // args.error(args, ParseError.fieldDoesNotExist)
37
+ // },
38
+ // },
39
+ // init: async (value, args) => {
40
+ // let type: string
41
+ // if (value.$id) {
42
+ // type = schema.prefixToTypeMapping[value.$id.slice(0, 2)]
43
+ // if (!type) {
44
+ // args.error(args, ParseError.incorrectFieldType)
45
+ // return
46
+ // }
47
+ // }
48
+ // if (value.type) {
49
+ // if (type && value.type !== type) {
50
+ // args.error(args, ParseError.incorrectNodeType)
51
+ // return
52
+ // }
53
+ // type = value.type
54
+ // }
55
+ // const schemaType = schema.types[type]
56
+ // if (!schemaType) {
57
+ // args.error(args, ParseError.incorrectNodeType)
58
+ // return
59
+ // }
60
+ // const target: BasedSetTarget = {
61
+ // type,
62
+ // schema,
63
+ // required: [],
64
+ // }
65
+ // return { ...args, target }
66
+ // },
67
+ // },
68
+ // value
69
+ // )
70
+ // }
1
71
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/set2/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/set2/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,yDAAyD;AACzD,mCAAmC;AAEnC,mEAAmE;AACnE,iCAAiC;AACjC,QAAQ;AACR,gBAAgB;AAChB,mBAAmB;AACnB,oBAAoB;AACpB,oBAAoB;AACpB,sCAAsC;AACtC,+CAA+C;AAC/C,6DAA6D;AAC7D,uBAAuB;AACvB,gBAAgB;AAChB,mDAAmD;AACnD,6BAA6B;AAC7B,6DAA6D;AAC7D,uBAAuB;AACvB,gBAAgB;AAChB,2CAA2C;AAC3C,yCAAyC;AACzC,0DAA0D;AAC1D,gBAAgB;AAChB,mCAAmC;AACnC,eAAe;AACf,uCAAuC;AACvC,gDAAgD;AAChD,6DAA6D;AAC7D,uBAAuB;AACvB,gBAAgB;AAChB,iCAAiC;AACjC,eAAe;AACf,aAAa;AACb,iCAAiC;AACjC,2DAA2D;AAC3D,aAAa;AACb,WAAW;AACX,uCAAuC;AACvC,2BAA2B;AAC3B,2BAA2B;AAC3B,qEAAqE;AACrE,yBAAyB;AACzB,8DAA8D;AAC9D,qBAAqB;AACrB,cAAc;AACd,YAAY;AACZ,4BAA4B;AAC5B,+CAA+C;AAC/C,6DAA6D;AAC7D,qBAAqB;AACrB,cAAc;AACd,8BAA8B;AAC9B,YAAY;AACZ,gDAAgD;AAChD,6BAA6B;AAC7B,2DAA2D;AAC3D,mBAAmB;AACnB,YAAY;AACZ,2CAA2C;AAC3C,kBAAkB;AAClB,oBAAoB;AACpB,0BAA0B;AAC1B,YAAY;AACZ,qCAAqC;AACrC,WAAW;AACX,SAAS;AACT,YAAY;AACZ,MAAM;AACN,IAAI"}
package/dist/walker.d.ts CHANGED
@@ -4,6 +4,7 @@ import { BasedSchemaType, BasedSchemaFields } from './types';
4
4
  type Path = (string | number)[];
5
5
  type ErrorHandler<T> = (args: Args<T>, code: ParseError) => void;
6
6
  type Parse<T> = (args: Args<T>, key?: string | number, value?: any) => Promise<Args<T> | void>;
7
+ type BackTrack<T> = (args: Args<T>, fromBackTrack: any[], collectedCommands: any[]) => any;
7
8
  export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields> = {
8
9
  schema: BasedSchema;
9
10
  parentValue?: any;
@@ -14,23 +15,21 @@ export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields>
14
15
  key?: number | string;
15
16
  value: any;
16
17
  target: T;
18
+ fromBackTrack: any[];
17
19
  parse: Parse<T>;
18
20
  collect: (args: Args<T>) => any;
19
- backtrack: (args: Args<T>, collectedCommands: any[]) => any;
21
+ backtrack: BackTrack<T>;
20
22
  requiresAsyncValidation: (validationType: any) => Promise<any>;
21
23
  error: ErrorHandler<T>;
22
24
  };
23
- export type FieldParser<T, K extends keyof BasedSchemaFields> = (args: Args<T, K>) => Promise<Args<T> | void>;
24
- export type KeyParser<T> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
25
+ export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (args: Args<T, K>) => Promise<Args<T> | void>;
26
+ export type KeyParser<T = any> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
25
27
  export type Opts<T> = {
26
28
  schema: BasedSchema;
27
- init: (value: any, opts: Opts<T>, errors: {
28
- code: ParseError;
29
- message: string;
30
- }[]) => Promise<T>;
29
+ init: (args: Args<T>) => Promise<Args<T>>;
31
30
  parsers: {
32
31
  fields: Partial<{
33
- [Key in keyof BasedSchemaFields]: FieldParser<T, Key>;
32
+ [Key in keyof BasedSchemaFields]: FieldParser<Key, T>;
34
33
  }>;
35
34
  keys: {
36
35
  [key: string]: KeyParser<T>;
@@ -38,7 +37,7 @@ export type Opts<T> = {
38
37
  any: KeyParser<T>;
39
38
  };
40
39
  collect?: (args: Args<T>) => any;
41
- backtrack?: (args: Args<T>, collectedCommands: any[]) => any;
40
+ backtrack?: BackTrack<T>;
42
41
  requiresAsyncValidation?: (validationType: any) => Promise<boolean>;
43
42
  errorsCollector?: ErrorHandler<T>;
44
43
  };
package/dist/walker.js CHANGED
@@ -7,21 +7,21 @@ const walk = async (opts, value) => {
7
7
  opts.collect = () => { };
8
8
  }
9
9
  if (!('backtrack' in opts)) {
10
- opts.backtrack = (c) => c;
10
+ opts.backtrack = (args, btC, c) => btC;
11
11
  }
12
12
  if (!('requiresAsyncValidation' in opts)) {
13
13
  opts.requiresAsyncValidation = async () => true;
14
14
  }
15
- const target = await opts.init(value, opts, errors);
16
15
  const errorsCollector = (args, code) => {
17
- errors.push({
16
+ const err = {
18
17
  code,
19
18
  message: `Error in ${args.path.join('.')}`,
20
- });
19
+ };
20
+ if (opts.errorsCollector) {
21
+ opts.errorsCollector(args, code);
22
+ }
23
+ errors.push(err);
21
24
  };
22
- if (!('errorsCollector' in opts)) {
23
- opts.errorsCollector = errorsCollector;
24
- }
25
25
  const parse = async (prevArgs, key, value) => {
26
26
  const collectedCommands = [];
27
27
  const fromBackTrack = [];
@@ -31,19 +31,25 @@ const walk = async (opts, value) => {
31
31
  key: key ?? prevArgs.path[prevArgs.path.length - 1],
32
32
  parentValue: value ? prevArgs.value : undefined,
33
33
  value: value ?? prevArgs.value,
34
- target,
35
- parse,
34
+ target: prevArgs.target,
35
+ parse: prevArgs.parse,
36
36
  collect: (args) => {
37
37
  collectedCommands.push(opts.collect(args));
38
38
  },
39
- backtrack: (args, commands) => {
40
- fromBackTrack.push(opts.backtrack(args, commands));
41
- },
39
+ fromBackTrack,
40
+ backtrack: opts.backtrack,
42
41
  error: errorsCollector,
43
- requiresAsyncValidation: opts.requiresAsyncValidation,
42
+ requiresAsyncValidation: prevArgs.requiresAsyncValidation,
44
43
  };
45
44
  if (typeof args.value === 'object' && args.value !== null) {
46
45
  const q = [];
46
+ if (args.typeSchema && !args.fieldSchema) {
47
+ // top level
48
+ }
49
+ if (args.fieldSchema) {
50
+ //
51
+ }
52
+ // first do key parsers
47
53
  if (Array.isArray(args.value)) {
48
54
  for (let i = 0; i < args.value.length; i++) {
49
55
  const parser = opts.parsers.keys[i] || opts.parsers.any;
@@ -78,28 +84,35 @@ const walk = async (opts, value) => {
78
84
  }
79
85
  }
80
86
  await Promise.all(q);
81
- if (fromBackTrack.length) {
82
- args.backtrack(args, fromBackTrack);
83
- }
84
- else if (collectedCommands.length) {
85
- args.backtrack(args, collectedCommands);
87
+ if (fromBackTrack.length || collectedCommands.length) {
88
+ const x = args.backtrack(args, fromBackTrack, collectedCommands);
89
+ if (x) {
90
+ prevArgs.fromBackTrack?.push(x);
91
+ }
86
92
  }
87
93
  }
88
94
  };
89
- const args = {
95
+ const args = await opts.init({
90
96
  schema: opts.schema,
91
97
  path: [],
92
98
  value,
93
- target,
94
99
  parse,
95
100
  collect: opts.collect,
96
101
  backtrack: opts.backtrack,
97
102
  error: errorsCollector,
98
103
  requiresAsyncValidation: opts.requiresAsyncValidation,
99
- };
104
+ });
105
+ if (!args) {
106
+ return {
107
+ // TODO: temp
108
+ // @ts-ignore // for now
109
+ target: {},
110
+ errors,
111
+ };
112
+ }
100
113
  await parse(args);
101
114
  return {
102
- target,
115
+ target: args.target,
103
116
  errors,
104
117
  };
105
118
  };
@@ -1 +1 @@
1
- {"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@based/schema",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/set2/index.ts CHANGED
@@ -0,0 +1,71 @@
1
+ // import { ParseError } from '../set/error'
2
+ // import { BasedSchema, BasedSetTarget } from '../types'
3
+ // import { walk } from '../walker'
4
+
5
+ // export const setWalker2 = (schema: BasedSchema, value: any) => {
6
+ // return walk<BasedSetTarget>(
7
+ // {
8
+ // schema,
9
+ // parsers: {
10
+ // keys: {},
11
+ // fields: {
12
+ // object: async (args) => {
13
+ // if (typeof value !== 'object') {
14
+ // args.error(args, ParseError.incorrectFormat)
15
+ // return
16
+ // }
17
+ // const isArray = Array.isArray(value)
18
+ // if (isArray) {
19
+ // args.error(args, ParseError.incorrectFormat)
20
+ // return
21
+ // }
22
+ // const q: Promise<any>[] = []
23
+ // for (const key in value) {
24
+ // q.push(args.parse(args, key, value[key]))
25
+ // }
26
+ // await Promise.all(q)
27
+ // },
28
+ // boolean: async (args) => {
29
+ // if (typeof value !== 'boolean') {
30
+ // args.error(args, ParseError.incorrectFormat)
31
+ // return
32
+ // }
33
+ // args.collect(args)
34
+ // },
35
+ // },
36
+ // any: async (args) => {
37
+ // args.error(args, ParseError.fieldDoesNotExist)
38
+ // },
39
+ // },
40
+ // init: async (value, args) => {
41
+ // let type: string
42
+ // if (value.$id) {
43
+ // type = schema.prefixToTypeMapping[value.$id.slice(0, 2)]
44
+ // if (!type) {
45
+ // args.error(args, ParseError.incorrectFieldType)
46
+ // return
47
+ // }
48
+ // }
49
+ // if (value.type) {
50
+ // if (type && value.type !== type) {
51
+ // args.error(args, ParseError.incorrectNodeType)
52
+ // return
53
+ // }
54
+ // type = value.type
55
+ // }
56
+ // const schemaType = schema.types[type]
57
+ // if (!schemaType) {
58
+ // args.error(args, ParseError.incorrectNodeType)
59
+ // return
60
+ // }
61
+ // const target: BasedSetTarget = {
62
+ // type,
63
+ // schema,
64
+ // required: [],
65
+ // }
66
+ // return { ...args, target }
67
+ // },
68
+ // },
69
+ // value
70
+ // )
71
+ // }
package/src/walker.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { ParseError } from './set/error'
2
2
  import { BasedSchema, BasedSetHandlers, BasedSetTarget } from './types'
3
3
  import { BasedSchemaType, BasedSchemaFields } from './types'
4
- import { SetOptional } from 'type-fest'
5
4
 
6
5
  type Path = (string | number)[]
7
6
 
@@ -13,6 +12,12 @@ type Parse<T> = (
13
12
  value?: any
14
13
  ) => Promise<Args<T> | void> // If true will not continue
15
14
 
15
+ type BackTrack<T> = (
16
+ args: Args<T>,
17
+ fromBackTrack: any[],
18
+ collectedCommands: any[]
19
+ ) => any
20
+
16
21
  export type Args<
17
22
  T,
18
23
  K extends keyof BasedSchemaFields = keyof BasedSchemaFields
@@ -26,37 +31,34 @@ export type Args<
26
31
  key?: number | string
27
32
  value: any
28
33
  target: T
34
+ fromBackTrack: any[]
29
35
  parse: Parse<T>
30
36
  collect: (args: Args<T>) => any
31
- backtrack: (args: Args<T>, collectedCommands: any[]) => any
37
+ backtrack: BackTrack<T>
32
38
  requiresAsyncValidation: (validationType: any) => Promise<any>
33
39
  error: ErrorHandler<T>
34
40
  }
35
41
 
36
- export type FieldParser<T, K extends keyof BasedSchemaFields> = (
42
+ export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (
37
43
  args: Args<T, K>
38
44
  ) => Promise<Args<T> | void>
39
45
 
40
- export type KeyParser<T> = (
46
+ export type KeyParser<T = any> = (
41
47
  args: Args<T, keyof BasedSchemaFields>
42
48
  ) => Promise<Args<T> | void>
43
49
 
44
50
  export type Opts<T> = {
45
51
  schema: BasedSchema
46
- init: (
47
- value: any,
48
- opts: Opts<T>,
49
- errors: { code: ParseError; message: string }[]
50
- ) => Promise<T>
52
+ init: (args: Args<T>) => Promise<Args<T>>
51
53
  parsers: {
52
54
  fields: Partial<{
53
- [Key in keyof BasedSchemaFields]: FieldParser<T, Key>
55
+ [Key in keyof BasedSchemaFields]: FieldParser<Key, T>
54
56
  }>
55
57
  keys: { [key: string]: KeyParser<T> } // $list -> true
56
58
  any: KeyParser<T> // y.x
57
59
  }
58
60
  collect?: (args: Args<T>) => any
59
- backtrack?: (args: Args<T>, collectedCommands: any[]) => any // from back TRACKS OR COLLECT
61
+ backtrack?: BackTrack<T>
60
62
  requiresAsyncValidation?: (validationType: any) => Promise<boolean>
61
63
  errorsCollector?: ErrorHandler<T>
62
64
  }
@@ -75,24 +77,22 @@ export const walk = async <T>(
75
77
  }
76
78
 
77
79
  if (!('backtrack' in opts)) {
78
- opts.backtrack = (c) => c
80
+ opts.backtrack = (args, btC, c) => btC
79
81
  }
80
82
 
81
83
  if (!('requiresAsyncValidation' in opts)) {
82
84
  opts.requiresAsyncValidation = async () => true
83
85
  }
84
86
 
85
- const target = await opts.init(value, opts, errors)
86
-
87
87
  const errorsCollector: ErrorHandler<T> = (args, code) => {
88
- errors.push({
88
+ const err = {
89
89
  code,
90
90
  message: `Error in ${args.path.join('.')}`,
91
- })
92
- }
93
-
94
- if (!('errorsCollector' in opts)) {
95
- opts.errorsCollector = errorsCollector
91
+ }
92
+ if (opts.errorsCollector) {
93
+ opts.errorsCollector(args, code)
94
+ }
95
+ errors.push(err)
96
96
  }
97
97
 
98
98
  const parse: Parse<T> = async (prevArgs, key, value) => {
@@ -104,19 +104,29 @@ export const walk = async <T>(
104
104
  key: key ?? prevArgs.path[prevArgs.path.length - 1],
105
105
  parentValue: value ? prevArgs.value : undefined,
106
106
  value: value ?? prevArgs.value,
107
- target,
108
- parse,
107
+ target: prevArgs.target,
108
+ parse: prevArgs.parse,
109
109
  collect: (args) => {
110
110
  collectedCommands.push(opts.collect(args))
111
111
  },
112
- backtrack: (args, commands) => {
113
- fromBackTrack.push(opts.backtrack(args, commands))
114
- },
112
+ fromBackTrack,
113
+ backtrack: opts.backtrack,
115
114
  error: errorsCollector,
116
- requiresAsyncValidation: opts.requiresAsyncValidation,
115
+ requiresAsyncValidation: prevArgs.requiresAsyncValidation,
117
116
  }
118
117
  if (typeof args.value === 'object' && args.value !== null) {
119
118
  const q: Promise<Args<T> | void>[] = []
119
+
120
+ if (args.typeSchema && !args.fieldSchema) {
121
+ // top level
122
+ }
123
+
124
+ if (args.fieldSchema) {
125
+ //
126
+ }
127
+
128
+ // first do key parsers
129
+
120
130
  if (Array.isArray(args.value)) {
121
131
  for (let i = 0; i < args.value.length; i++) {
122
132
  const parser = opts.parsers.keys[i] || opts.parsers.any
@@ -156,30 +166,36 @@ export const walk = async <T>(
156
166
 
157
167
  await Promise.all(q)
158
168
 
159
- if (fromBackTrack.length) {
160
- args.backtrack(args, fromBackTrack)
161
- } else if (collectedCommands.length) {
162
- args.backtrack(args, collectedCommands)
169
+ if (fromBackTrack.length || collectedCommands.length) {
170
+ const x = args.backtrack(args, fromBackTrack, collectedCommands)
171
+ if (x) {
172
+ prevArgs.fromBackTrack?.push(x)
173
+ }
163
174
  }
164
175
  }
165
176
  }
166
-
167
- const args: Args<T> = {
177
+ const args: Args<T> = await opts.init(<Args<T>>{
168
178
  schema: opts.schema,
169
179
  path: [],
170
180
  value,
171
- target,
172
181
  parse,
173
182
  collect: opts.collect,
174
183
  backtrack: opts.backtrack,
175
184
  error: errorsCollector,
176
185
  requiresAsyncValidation: opts.requiresAsyncValidation,
186
+ })
187
+
188
+ if (!args) {
189
+ return {
190
+ // TODO: temp
191
+ // @ts-ignore // for now
192
+ target: {},
193
+ errors,
194
+ }
177
195
  }
178
-
179
196
  await parse(args)
180
-
181
197
  return {
182
- target,
198
+ target: args.target,
183
199
  errors,
184
200
  }
185
201
  }
package/test/walker.ts CHANGED
@@ -36,19 +36,17 @@ test('walker', async (t) => {
36
36
  const x = await walk(
37
37
  {
38
38
  schema,
39
- init: async () => {
40
- console.log('init!\n')
41
- return { lullz: true }
39
+ init: async (args) => {
40
+ return { ...args, target: { lullz: true } }
42
41
  },
43
42
  parsers: {
44
43
  keys: {
45
- $list: async (args) => {
46
- return {
47
- ...args,
48
-
49
- value: { flapdrol: true },
50
- }
51
- },
44
+ // $list: async (args) => {
45
+ // return {
46
+ // ...args,
47
+ // value: { flapdrol: true },
48
+ // }
49
+ // },
52
50
  },
53
51
  fields: {
54
52
  // string: () => {}
@@ -61,10 +59,21 @@ test('walker', async (t) => {
61
59
  collect: (args) => {
62
60
  return args.path.join('.')
63
61
  },
64
- backtrack: (args, collectedCommands) => {
65
- console.log(' \n-----------BACK TRACK GOOD GO', collectedCommands)
66
- // if return next btrack will not receive backtrack from commands
67
- return collectedCommands
62
+ backtrack: (args, fromBt, collected) => {
63
+ console.log(
64
+ ' \n-----------BACK TRACK GOOD GO',
65
+ '\n',
66
+ 'path:',
67
+ args.path.join('.'),
68
+ '\n',
69
+ 'backtracked:',
70
+ JSON.stringify(fromBt),
71
+ '\n',
72
+ 'collected:',
73
+ collected,
74
+ '--------------------'
75
+ )
76
+ return fromBt.length ? fromBt : collected
68
77
  },
69
78
  },
70
79
  {
@@ -90,7 +99,6 @@ test('walker', async (t) => {
90
99
  )
91
100
 
92
101
  console.info('------------')
93
- console.info(x)
94
102
 
95
103
  t.true(true)
96
104
  })