@based/schema 0.0.13 → 0.0.15
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/dist/set2/index.js +70 -0
- package/dist/set2/index.js.map +1 -1
- package/dist/walker.d.ts +4 -7
- package/dist/walker.js +32 -15
- package/dist/walker.js.map +1 -1
- package/package.json +1 -1
- package/src/set2/index.ts +71 -0
- package/src/walker.ts +39 -28
- package/test/walker.ts +3 -3
package/dist/set2/index.js
CHANGED
|
@@ -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
|
package/dist/set2/index.js.map
CHANGED
|
@@ -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
|
@@ -20,17 +20,14 @@ export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields>
|
|
|
20
20
|
requiresAsyncValidation: (validationType: any) => Promise<any>;
|
|
21
21
|
error: ErrorHandler<T>;
|
|
22
22
|
};
|
|
23
|
-
export type FieldParser<
|
|
24
|
-
export type KeyParser<T> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
|
|
23
|
+
export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (args: Args<T, K>) => Promise<Args<T> | void>;
|
|
24
|
+
export type KeyParser<T = any> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
|
|
25
25
|
export type Opts<T> = {
|
|
26
26
|
schema: BasedSchema;
|
|
27
|
-
init: (
|
|
28
|
-
code: ParseError;
|
|
29
|
-
message: string;
|
|
30
|
-
}[]) => Promise<T>;
|
|
27
|
+
init: (args: Args<T>) => Promise<Args<T>>;
|
|
31
28
|
parsers: {
|
|
32
29
|
fields: Partial<{
|
|
33
|
-
[Key in keyof BasedSchemaFields]: FieldParser<
|
|
30
|
+
[Key in keyof BasedSchemaFields]: FieldParser<Key, T>;
|
|
34
31
|
}>;
|
|
35
32
|
keys: {
|
|
36
33
|
[key: string]: KeyParser<T>;
|
package/dist/walker.js
CHANGED
|
@@ -12,16 +12,16 @@ const walk = async (opts, value) => {
|
|
|
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
|
-
|
|
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,8 +31,8 @@ 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
|
},
|
|
@@ -44,14 +44,22 @@ const walk = async (opts, value) => {
|
|
|
44
44
|
};
|
|
45
45
|
if (typeof args.value === 'object' && args.value !== null) {
|
|
46
46
|
const q = [];
|
|
47
|
+
if (args.typeSchema && !args.fieldSchema) {
|
|
48
|
+
// top level
|
|
49
|
+
}
|
|
50
|
+
if (args.fieldSchema) {
|
|
51
|
+
//
|
|
52
|
+
}
|
|
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;
|
|
56
|
+
const j = i;
|
|
50
57
|
q.push((async () => {
|
|
51
58
|
const newArgs = await parser({
|
|
52
59
|
...args,
|
|
53
|
-
value: args.value[
|
|
54
|
-
path: [...args.path,
|
|
60
|
+
value: args.value[j],
|
|
61
|
+
path: [...args.path, j],
|
|
62
|
+
key: j,
|
|
55
63
|
});
|
|
56
64
|
if (newArgs) {
|
|
57
65
|
return parse(newArgs);
|
|
@@ -67,6 +75,7 @@ const walk = async (opts, value) => {
|
|
|
67
75
|
...args,
|
|
68
76
|
value: args.value[key],
|
|
69
77
|
path: [...args.path, key],
|
|
78
|
+
key,
|
|
70
79
|
});
|
|
71
80
|
if (newArgs) {
|
|
72
81
|
return parse(newArgs);
|
|
@@ -74,6 +83,7 @@ const walk = async (opts, value) => {
|
|
|
74
83
|
})());
|
|
75
84
|
}
|
|
76
85
|
}
|
|
86
|
+
await Promise.all(q);
|
|
77
87
|
if (fromBackTrack.length) {
|
|
78
88
|
args.backtrack(args, fromBackTrack);
|
|
79
89
|
}
|
|
@@ -82,20 +92,27 @@ const walk = async (opts, value) => {
|
|
|
82
92
|
}
|
|
83
93
|
}
|
|
84
94
|
};
|
|
85
|
-
const args = {
|
|
95
|
+
const args = await opts.init({
|
|
86
96
|
schema: opts.schema,
|
|
87
97
|
path: [],
|
|
88
98
|
value,
|
|
89
|
-
target,
|
|
90
99
|
parse,
|
|
91
100
|
collect: opts.collect,
|
|
92
101
|
backtrack: opts.backtrack,
|
|
93
102
|
error: errorsCollector,
|
|
94
103
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
95
|
-
};
|
|
96
|
-
|
|
104
|
+
});
|
|
105
|
+
if (!args) {
|
|
106
|
+
return {
|
|
107
|
+
// TODO: temp
|
|
108
|
+
// @ts-ignore // for now
|
|
109
|
+
target: {},
|
|
110
|
+
errors,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
await parse(args);
|
|
97
114
|
return {
|
|
98
|
-
target,
|
|
115
|
+
target: args.target,
|
|
99
116
|
errors,
|
|
100
117
|
};
|
|
101
118
|
};
|
package/dist/walker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
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
|
|
|
@@ -33,24 +32,20 @@ export type Args<
|
|
|
33
32
|
error: ErrorHandler<T>
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
export type FieldParser<
|
|
35
|
+
export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (
|
|
37
36
|
args: Args<T, K>
|
|
38
37
|
) => Promise<Args<T> | void>
|
|
39
38
|
|
|
40
|
-
export type KeyParser<T> = (
|
|
39
|
+
export type KeyParser<T = any> = (
|
|
41
40
|
args: Args<T, keyof BasedSchemaFields>
|
|
42
41
|
) => Promise<Args<T> | void>
|
|
43
42
|
|
|
44
43
|
export type Opts<T> = {
|
|
45
44
|
schema: BasedSchema
|
|
46
|
-
init: (
|
|
47
|
-
value: any,
|
|
48
|
-
opts: Opts<T>,
|
|
49
|
-
errors: { code: ParseError; message: string }[]
|
|
50
|
-
) => Promise<T>
|
|
45
|
+
init: (args: Args<T>) => Promise<Args<T>>
|
|
51
46
|
parsers: {
|
|
52
47
|
fields: Partial<{
|
|
53
|
-
[Key in keyof BasedSchemaFields]: FieldParser<
|
|
48
|
+
[Key in keyof BasedSchemaFields]: FieldParser<Key, T>
|
|
54
49
|
}>
|
|
55
50
|
keys: { [key: string]: KeyParser<T> } // $list -> true
|
|
56
51
|
any: KeyParser<T> // y.x
|
|
@@ -82,17 +77,15 @@ export const walk = async <T>(
|
|
|
82
77
|
opts.requiresAsyncValidation = async () => true
|
|
83
78
|
}
|
|
84
79
|
|
|
85
|
-
const target = await opts.init(value, opts, errors)
|
|
86
|
-
|
|
87
80
|
const errorsCollector: ErrorHandler<T> = (args, code) => {
|
|
88
|
-
|
|
81
|
+
const err = {
|
|
89
82
|
code,
|
|
90
83
|
message: `Error in ${args.path.join('.')}`,
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
}
|
|
85
|
+
if (opts.errorsCollector) {
|
|
86
|
+
opts.errorsCollector(args, code)
|
|
87
|
+
}
|
|
88
|
+
errors.push(err)
|
|
96
89
|
}
|
|
97
90
|
|
|
98
91
|
const parse: Parse<T> = async (prevArgs, key, value) => {
|
|
@@ -104,8 +97,8 @@ export const walk = async <T>(
|
|
|
104
97
|
key: key ?? prevArgs.path[prevArgs.path.length - 1],
|
|
105
98
|
parentValue: value ? prevArgs.value : undefined,
|
|
106
99
|
value: value ?? prevArgs.value,
|
|
107
|
-
target,
|
|
108
|
-
parse,
|
|
100
|
+
target: prevArgs.target,
|
|
101
|
+
parse: prevArgs.parse,
|
|
109
102
|
collect: (args) => {
|
|
110
103
|
collectedCommands.push(opts.collect(args))
|
|
111
104
|
},
|
|
@@ -117,15 +110,26 @@ export const walk = async <T>(
|
|
|
117
110
|
}
|
|
118
111
|
if (typeof args.value === 'object' && args.value !== null) {
|
|
119
112
|
const q: Promise<Args<T> | void>[] = []
|
|
113
|
+
|
|
114
|
+
if (args.typeSchema && !args.fieldSchema) {
|
|
115
|
+
// top level
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (args.fieldSchema) {
|
|
119
|
+
//
|
|
120
|
+
}
|
|
121
|
+
|
|
120
122
|
if (Array.isArray(args.value)) {
|
|
121
123
|
for (let i = 0; i < args.value.length; i++) {
|
|
122
124
|
const parser = opts.parsers.keys[i] || opts.parsers.any
|
|
125
|
+
const j = i
|
|
123
126
|
q.push(
|
|
124
127
|
(async () => {
|
|
125
128
|
const newArgs = await parser({
|
|
126
129
|
...args,
|
|
127
|
-
value: args.value[
|
|
128
|
-
path: [...args.path,
|
|
130
|
+
value: args.value[j],
|
|
131
|
+
path: [...args.path, j],
|
|
132
|
+
key: j,
|
|
129
133
|
})
|
|
130
134
|
if (newArgs) {
|
|
131
135
|
return parse(newArgs)
|
|
@@ -142,6 +146,7 @@ export const walk = async <T>(
|
|
|
142
146
|
...args,
|
|
143
147
|
value: args.value[key],
|
|
144
148
|
path: [...args.path, key],
|
|
149
|
+
key,
|
|
145
150
|
})
|
|
146
151
|
if (newArgs) {
|
|
147
152
|
return parse(newArgs)
|
|
@@ -151,6 +156,7 @@ export const walk = async <T>(
|
|
|
151
156
|
}
|
|
152
157
|
}
|
|
153
158
|
|
|
159
|
+
await Promise.all(q)
|
|
154
160
|
if (fromBackTrack.length) {
|
|
155
161
|
args.backtrack(args, fromBackTrack)
|
|
156
162
|
} else if (collectedCommands.length) {
|
|
@@ -158,23 +164,28 @@ export const walk = async <T>(
|
|
|
158
164
|
}
|
|
159
165
|
}
|
|
160
166
|
}
|
|
161
|
-
|
|
162
|
-
const args: Args<T> = {
|
|
167
|
+
const args: Args<T> = await opts.init(<Args<T>>{
|
|
163
168
|
schema: opts.schema,
|
|
164
169
|
path: [],
|
|
165
170
|
value,
|
|
166
|
-
target,
|
|
167
171
|
parse,
|
|
168
172
|
collect: opts.collect,
|
|
169
173
|
backtrack: opts.backtrack,
|
|
170
174
|
error: errorsCollector,
|
|
171
175
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
if (!args) {
|
|
179
|
+
return {
|
|
180
|
+
// TODO: temp
|
|
181
|
+
// @ts-ignore // for now
|
|
182
|
+
target: {},
|
|
183
|
+
errors,
|
|
184
|
+
}
|
|
172
185
|
}
|
|
173
|
-
|
|
174
|
-
parse(args)
|
|
175
|
-
|
|
186
|
+
await parse(args)
|
|
176
187
|
return {
|
|
177
|
-
target,
|
|
188
|
+
target: args.target,
|
|
178
189
|
errors,
|
|
179
190
|
}
|
|
180
191
|
}
|
package/test/walker.ts
CHANGED
|
@@ -36,9 +36,9 @@ 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
|
+
console.log('init!\n', args)
|
|
41
|
+
return { ...args, target: { lullz: true } }
|
|
42
42
|
},
|
|
43
43
|
parsers: {
|
|
44
44
|
keys: {
|