@based/schema 0.0.16 → 1.0.1

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 (112) hide show
  1. package/dist/{set/error.d.ts → error.d.ts} +4 -2
  2. package/dist/{set/error.js → error.js} +2 -0
  3. package/dist/error.js.map +1 -0
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/set/fields/array.d.ts +2 -0
  8. package/dist/set/fields/array.js +96 -0
  9. package/dist/set/fields/array.js.map +1 -0
  10. package/dist/set/fields/index.d.ts +3 -0
  11. package/dist/set/fields/index.js +72 -0
  12. package/dist/set/fields/index.js.map +1 -0
  13. package/dist/set/fields/number.d.ts +4 -0
  14. package/dist/set/fields/number.js +121 -0
  15. package/dist/set/fields/number.js.map +1 -0
  16. package/dist/set/fields/object.d.ts +3 -0
  17. package/dist/set/fields/object.js +33 -0
  18. package/dist/set/fields/object.js.map +1 -0
  19. package/dist/set/fields/references.d.ts +3 -0
  20. package/dist/set/fields/references.js +106 -0
  21. package/dist/set/fields/references.js.map +1 -0
  22. package/dist/set/fields/set.d.ts +2 -0
  23. package/dist/set/fields/set.js +63 -0
  24. package/dist/set/fields/set.js.map +1 -0
  25. package/dist/set/fields/string.d.ts +3 -0
  26. package/dist/set/fields/string.js +190 -0
  27. package/dist/set/fields/string.js.map +1 -0
  28. package/dist/set/index.d.ts +2 -5
  29. package/dist/set/index.js +98 -126
  30. package/dist/set/index.js.map +1 -1
  31. package/dist/set/isValidId.d.ts +2 -0
  32. package/dist/set/isValidId.js +21 -0
  33. package/dist/set/isValidId.js.map +1 -0
  34. package/dist/set/types.d.ts +0 -5
  35. package/dist/set/types.js +0 -2
  36. package/dist/types.d.ts +7 -1
  37. package/dist/types.js.map +1 -1
  38. package/dist/walker/args.d.ts +31 -0
  39. package/dist/walker/args.js +120 -0
  40. package/dist/walker/args.js.map +1 -0
  41. package/dist/walker/index.d.ts +6 -0
  42. package/dist/walker/index.js +40 -0
  43. package/dist/walker/index.js.map +1 -0
  44. package/dist/walker/parse.d.ts +2 -0
  45. package/dist/walker/parse.js +157 -0
  46. package/dist/walker/parse.js.map +1 -0
  47. package/dist/walker/types.d.ts +44 -0
  48. package/dist/walker/types.js +9 -0
  49. package/dist/walker/types.js.map +1 -0
  50. package/package.json +2 -2
  51. package/src/{set/error.ts → error.ts} +3 -1
  52. package/src/index.ts +2 -2
  53. package/src/set/fields/array.ts +111 -0
  54. package/src/set/fields/index.ts +69 -0
  55. package/src/set/fields/number.ts +134 -0
  56. package/src/set/fields/object.ts +30 -0
  57. package/src/set/fields/references.ts +114 -0
  58. package/src/set/fields/set.ts +63 -0
  59. package/src/set/fields/string.ts +199 -0
  60. package/src/set/index.ts +103 -188
  61. package/src/set/isValidId.ts +23 -0
  62. package/src/set/types.ts +0 -20
  63. package/src/types.ts +4 -2
  64. package/src/walker/args.ts +159 -0
  65. package/src/walker/index.ts +35 -0
  66. package/src/walker/parse.ts +193 -0
  67. package/src/walker/types.ts +75 -0
  68. package/test/number.ts +289 -543
  69. package/test/reference.ts +150 -198
  70. package/test/rest.ts +227 -0
  71. package/test/string.ts +139 -183
  72. package/test/utils/index.ts +23 -0
  73. package/test/walker.ts +558 -3
  74. package/dist/set/collections.d.ts +0 -5
  75. package/dist/set/collections.js +0 -229
  76. package/dist/set/collections.js.map +0 -1
  77. package/dist/set/error.js.map +0 -1
  78. package/dist/set/number.d.ts +0 -4
  79. package/dist/set/number.js +0 -124
  80. package/dist/set/number.js.map +0 -1
  81. package/dist/set/parseDefaultAndValue.d.ts +0 -3
  82. package/dist/set/parseDefaultAndValue.js +0 -35
  83. package/dist/set/parseDefaultAndValue.js.map +0 -1
  84. package/dist/set/parsers.d.ts +0 -3
  85. package/dist/set/parsers.js +0 -42
  86. package/dist/set/parsers.js.map +0 -1
  87. package/dist/set/references.d.ts +0 -3
  88. package/dist/set/references.js +0 -84
  89. package/dist/set/references.js.map +0 -1
  90. package/dist/set/rest.d.ts +0 -5
  91. package/dist/set/rest.js +0 -76
  92. package/dist/set/rest.js.map +0 -1
  93. package/dist/set/string.d.ts +0 -3
  94. package/dist/set/string.js +0 -173
  95. package/dist/set/string.js.map +0 -1
  96. package/dist/set2/index.d.ts +0 -0
  97. package/dist/set2/index.js +0 -71
  98. package/dist/set2/index.js.map +0 -1
  99. package/dist/walker.d.ts +0 -51
  100. package/dist/walker.js +0 -120
  101. package/dist/walker.js.map +0 -1
  102. package/src/set/collections.ts +0 -338
  103. package/src/set/number.ts +0 -167
  104. package/src/set/parseDefaultAndValue.ts +0 -54
  105. package/src/set/parsers.ts +0 -20
  106. package/src/set/references.ts +0 -113
  107. package/src/set/rest.ts +0 -135
  108. package/src/set/string.ts +0 -254
  109. package/src/set2/index.ts +0 -71
  110. package/src/walker.ts +0 -201
  111. package/test/setWalker.ts +0 -494
  112. package/test/text.ts +0 -171
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArgsClass = void 0;
4
+ const types_1 = require("./types");
5
+ const parse_1 = require("./parse");
6
+ class ArgsClass {
7
+ constructor(opts, prev) {
8
+ this.fromBackTrack = [];
9
+ this.collectedCommands = [];
10
+ if (opts.prev) {
11
+ prev = opts.prev;
12
+ }
13
+ if (opts.parseTopLevel) {
14
+ this.parseTopLevel = opts.parseTopLevel;
15
+ }
16
+ if (prev) {
17
+ this.prev = prev;
18
+ this.root = prev.root;
19
+ this.fieldSchema = prev.fieldSchema;
20
+ }
21
+ if (opts.path) {
22
+ this.path = opts.path;
23
+ }
24
+ else if (prev && opts.key !== undefined) {
25
+ this.path = [...prev.path, opts.key];
26
+ }
27
+ else if (opts && prev) {
28
+ this.path = prev.path;
29
+ }
30
+ else {
31
+ this.path = [];
32
+ }
33
+ this.value = opts.value;
34
+ if (opts.fieldSchema) {
35
+ // @ts-ignore K is too loose
36
+ this.fieldSchema = opts.fieldSchema;
37
+ }
38
+ if (opts.typeSchema) {
39
+ this.typeSchema = opts.typeSchema;
40
+ }
41
+ if (opts.target) {
42
+ this._target = opts.target;
43
+ }
44
+ if (opts.collect) {
45
+ this._collectOverride = opts.collect;
46
+ }
47
+ if (opts.skipCollection) {
48
+ this.skipCollection = opts.skipCollection;
49
+ }
50
+ }
51
+ get schema() {
52
+ if (this._schema) {
53
+ return this.schema;
54
+ }
55
+ return this.root._schema;
56
+ }
57
+ get key() {
58
+ return this.path[this.path.length - 1];
59
+ }
60
+ get target() {
61
+ if (this._target) {
62
+ return this._target;
63
+ }
64
+ let p = this.prev;
65
+ while (p) {
66
+ if (p._target) {
67
+ return p._target;
68
+ }
69
+ p = p.prev;
70
+ }
71
+ }
72
+ stop(onllyStopFieldSchemaParser) {
73
+ const target = this;
74
+ if (onllyStopFieldSchemaParser) {
75
+ target.stopped = types_1.Stopped.onlyStopFieldParser;
76
+ }
77
+ else {
78
+ target.stopped = types_1.Stopped.stopAll;
79
+ }
80
+ }
81
+ create(opts) {
82
+ const newArgs = new ArgsClass(opts, this);
83
+ if (this._collectOverride) {
84
+ newArgs._collectOverride = this._collectOverride;
85
+ }
86
+ if (!('value' in opts)) {
87
+ newArgs.value = this.value;
88
+ }
89
+ return newArgs;
90
+ }
91
+ async parse(opts) {
92
+ if (!opts) {
93
+ return (0, parse_1.parse)(this);
94
+ }
95
+ else {
96
+ const newArgs = new ArgsClass(opts, this);
97
+ if (this._collectOverride) {
98
+ newArgs._collectOverride = this._collectOverride;
99
+ }
100
+ return newArgs.parse();
101
+ }
102
+ }
103
+ collect(value) {
104
+ if (this.skipCollection) {
105
+ return;
106
+ }
107
+ const collectArgs = value !== undefined ? new ArgsClass({ value }, this) : this;
108
+ if (this._collectOverride) {
109
+ this.collectedCommands.push(this._collectOverride(collectArgs));
110
+ }
111
+ else {
112
+ this.collectedCommands.push(this.root._opts.collect(collectArgs));
113
+ }
114
+ }
115
+ error(code) {
116
+ this.root._opts.error(code, this);
117
+ }
118
+ }
119
+ exports.ArgsClass = ArgsClass;
120
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/walker/args.ts"],"names":[],"mappings":";;;AAEA,mCAA8E;AAC9E,mCAA+B;AAG/B,MAAa,SAAS;IAqCpB,YAAY,IAAoB,EAAE,IAAsB;QACtD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QACvB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAA;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;SACjB;QACD,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;SACxC;QACD,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;SACpC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;SACtB;aAAM,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE;YACzC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;SACrC;aAAM,IAAI,IAAI,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;SACtB;aAAM;YACL,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;SACf;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACvB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,4BAA4B;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;SACpC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;SAClC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;SAC3B;QACD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAA;SACrC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;SAC1C;IACH,CAAC;IAED,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,IAAI,CAAC,MAAM,CAAA;SACnB;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAA;IAC1B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,IAAI,CAAC,OAAO,CAAA;SACpB;QACD,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QACjB,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,CAAC,OAAO,EAAE;gBACb,OAAO,CAAC,CAAC,OAAO,CAAA;aACjB;YACD,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;SACX;IACH,CAAC;IAED,IAAI,CAAC,0BAAoC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAA;QACnB,IAAI,0BAA0B,EAAE;YAC9B,MAAM,CAAC,OAAO,GAAG,eAAO,CAAC,mBAAmB,CAAA;SAC7C;aAAM;YACL,MAAM,CAAC,OAAO,GAAG,eAAO,CAAC,OAAO,CAAA;SACjC;IACH,CAAC;IAED,MAAM,CAAC,IAAkB;QACvB,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAA;SACjD;QACD,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE;YACtB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;SAC3B;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAkB;QAC5B,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAA,aAAK,EAAC,IAAI,CAAC,CAAA;SACnB;aAAM;YACL,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACzC,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAA;aACjD;YACD,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;SACvB;IACH,CAAC;IAED,OAAO,CAAC,KAAW;QACjB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,OAAM;SACP;QACD,MAAM,WAAW,GACf,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAE7D,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;SAChE;aAAM;YACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;SAClE;IACH,CAAC;IAED,KAAK,CAAC,IAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;CACF;AAxJD,8BAwJC"}
@@ -0,0 +1,6 @@
1
+ import { BasedSchema } from '../types';
2
+ import { ArgsClass } from './args';
3
+ import { Opts } from './types';
4
+ export declare const walk: <T>(schema: BasedSchema, opts: Opts<T>, value: any) => Promise<T>;
5
+ export { ArgsClass };
6
+ export * from './types';
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ArgsClass = exports.walk = void 0;
18
+ const args_1 = require("./args");
19
+ Object.defineProperty(exports, "ArgsClass", { enumerable: true, get: function () { return args_1.ArgsClass; } });
20
+ const walk = async (schema, opts, value) => {
21
+ if (!('collect' in opts)) {
22
+ opts.collect = () => { };
23
+ }
24
+ if (!('error' in opts)) {
25
+ opts.error = () => { };
26
+ }
27
+ const argsOpts = await opts.init(value, schema, opts.error);
28
+ if (!argsOpts.value) {
29
+ argsOpts.value = value;
30
+ }
31
+ const args = new args_1.ArgsClass(argsOpts);
32
+ args.root = args;
33
+ args._opts = opts;
34
+ args._schema = schema;
35
+ await args.parse();
36
+ return args.target;
37
+ };
38
+ exports.walk = walk;
39
+ __exportStar(require("./types"), exports);
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/walker/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,iCAAkC;AA+BzB,0FA/BA,gBAAS,OA+BA;AA5BX,MAAM,IAAI,GAAG,KAAK,EACvB,MAAmB,EACnB,IAAa,EACb,KAAU,EACE,EAAE;IACd,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE;QACxB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;KACxB;IAED,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE;QACtB,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;KACtB;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAE3D,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;QACnB,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;KACvB;IAED,MAAM,IAAI,GAAG,IAAI,gBAAS,CAAC,QAAQ,CAAC,CAAA;IACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;IAElB,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC,CAAA;AA1BY,QAAA,IAAI,QA0BhB;AAID,0CAAuB"}
@@ -0,0 +1,2 @@
1
+ import { ArgsClass } from './args';
2
+ export declare function parse<T>(args: ArgsClass<T>): Promise<ArgsClass<T> | void>;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parse = void 0;
4
+ const args_1 = require("./args");
5
+ const types_1 = require("./types");
6
+ // TODO needs cleaning
7
+ function createOrUseArgs(from, newArgs) {
8
+ if (!newArgs) {
9
+ return;
10
+ }
11
+ if (newArgs instanceof args_1.ArgsClass) {
12
+ return newArgs;
13
+ }
14
+ return from.create(newArgs);
15
+ }
16
+ async function parseKey(from, key, parser) {
17
+ const keyArgs = new args_1.ArgsClass({
18
+ key,
19
+ value: from.value[key],
20
+ fieldSchema: from.fieldSchema,
21
+ }, from);
22
+ const newArgs = createOrUseArgs(keyArgs, await parser(keyArgs));
23
+ if (newArgs) {
24
+ return newArgs.parse();
25
+ }
26
+ }
27
+ function createFieldArgs(from, key, fieldSchema) {
28
+ return new args_1.ArgsClass({
29
+ key,
30
+ value: from.value[key],
31
+ // @ts-ignore needs key
32
+ fieldSchema,
33
+ }, from);
34
+ }
35
+ function getFieldParser(args) {
36
+ const fieldParser = 'enum' in args.fieldSchema
37
+ ? args.root._opts.parsers.fields.enum
38
+ : args.root._opts.parsers.fields[args.fieldSchema.type];
39
+ return fieldParser;
40
+ }
41
+ async function parse(args) {
42
+ const opts = args.root._opts;
43
+ if (args.parseTopLevel) {
44
+ const parser = opts.parsers.any;
45
+ if (parser) {
46
+ await parser(args);
47
+ }
48
+ }
49
+ if (typeof args.value === 'object' && args.value !== null) {
50
+ const keyQ = [];
51
+ const keysHandled = new Set();
52
+ let allKeysHandled = false;
53
+ for (const key in opts.parsers.keys) {
54
+ if (key in args.value) {
55
+ keysHandled.add(key);
56
+ keyQ.push(parseKey(args, key, opts.parsers.keys[key]));
57
+ }
58
+ }
59
+ await Promise.all(keyQ);
60
+ if (args.stopped === undefined) {
61
+ const fieldQ = [];
62
+ if (args.typeSchema && !args.fieldSchema) {
63
+ for (const key in args.typeSchema.fields) {
64
+ const fieldSchema = args.typeSchema.fields[key];
65
+ if (key in args.value) {
66
+ keysHandled.add(key);
67
+ fieldQ.push(createFieldArgs(args, key, fieldSchema).parse());
68
+ }
69
+ }
70
+ }
71
+ else if (args.fieldSchema && !args.stopped) {
72
+ if (args.fieldSchema.type === 'object') {
73
+ // @ts-ignore should detect from line above
74
+ const objFieldSchema = args.fieldSchema;
75
+ for (const key in objFieldSchema.properties) {
76
+ const fieldSchema = objFieldSchema.properties[key];
77
+ if (key in args.value) {
78
+ keysHandled.add(key);
79
+ fieldQ.push(createFieldArgs(args, key, fieldSchema).parse());
80
+ }
81
+ }
82
+ }
83
+ else if (args.fieldSchema.type === 'record') {
84
+ // @ts-ignore should detect from line above
85
+ const objFieldSchema = args.fieldSchema;
86
+ for (const key in args.value) {
87
+ const fieldSchema = objFieldSchema.values;
88
+ keysHandled.add(key);
89
+ fieldQ.push(createFieldArgs(args, key, fieldSchema).parse());
90
+ }
91
+ }
92
+ else if (args.fieldSchema) {
93
+ const fieldParser = getFieldParser(args);
94
+ if (fieldParser) {
95
+ const newArgs = createOrUseArgs(args, await fieldParser(args));
96
+ if (newArgs) {
97
+ return newArgs.parse();
98
+ }
99
+ }
100
+ }
101
+ }
102
+ await Promise.all(fieldQ);
103
+ }
104
+ if (args.stopped !== types_1.Stopped.stopAll) {
105
+ const parser = opts.parsers.any || opts.parsers.catch;
106
+ if (parser) {
107
+ const q = [];
108
+ if (Array.isArray(args.value)) {
109
+ for (let i = 0; i < args.value.length; i++) {
110
+ if ((!opts.parsers.any && keysHandled.has(i)) || allKeysHandled) {
111
+ continue;
112
+ }
113
+ q.push(parseKey(args, i, parser));
114
+ }
115
+ }
116
+ else {
117
+ for (const key in args.value) {
118
+ if ((!opts.parsers.any && keysHandled.has(key)) || allKeysHandled) {
119
+ continue;
120
+ }
121
+ q.push(parseKey(args, key, parser));
122
+ }
123
+ }
124
+ await Promise.all(q);
125
+ }
126
+ }
127
+ if (opts.backtrack &&
128
+ !args.skipCollection &&
129
+ (args.fromBackTrack.length || args.collectedCommands.length)) {
130
+ const backtracked = opts.backtrack(this, args.fromBackTrack ?? [], args.collectedCommands ?? []);
131
+ if (backtracked && this.prev) {
132
+ if (!this.prev.fromBackTrack) {
133
+ this.prev.fromBackTrack = [];
134
+ }
135
+ this.prev.fromBackTrack.push(backtracked);
136
+ }
137
+ }
138
+ }
139
+ else {
140
+ if (args.fieldSchema) {
141
+ const fieldParser = getFieldParser(args);
142
+ if (fieldParser) {
143
+ const newArgs = createOrUseArgs(args, await fieldParser(args));
144
+ if (newArgs) {
145
+ return newArgs.parse();
146
+ }
147
+ }
148
+ else {
149
+ console.warn('fieldSchema type not implemented yet!', args.fieldSchema);
150
+ const anyParser = opts.parsers.any || opts.parsers.catch;
151
+ anyParser(args);
152
+ }
153
+ }
154
+ }
155
+ }
156
+ exports.parse = parse;
157
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/walker/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { ParseError } from '../error';
2
+ import { BasedSchemaType, BasedSchemaFields, BasedSchemaField, BasedSchema } from '../types';
3
+ import { ArgsClass } from './args';
4
+ export type Path = (string | number)[];
5
+ export type ErrorHandler<T> = (code: ParseError, args: ArgsClass<T> | ArgsOpts<T>) => void;
6
+ export type Collect<T> = (args: ArgsClass<T>) => any;
7
+ export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (args: ArgsClass<T, K>) => Promise<ArgsClass<T> | ArgsOpts<T> | void>;
8
+ export type KeyParser<T = any> = (args: ArgsClass<T, keyof BasedSchemaFields>) => Promise<ArgsOpts<T> | ArgsClass<T> | void>;
9
+ export type FieldParsers<T = any> = {
10
+ [Key in keyof BasedSchemaFields]: FieldParser<Key, T>;
11
+ };
12
+ export type Opts<T> = {
13
+ init: (value: any, schema: BasedSchema, error: ErrorHandler<T>) => Promise<ArgsOpts<T>>;
14
+ parsers: {
15
+ fields: Partial<{
16
+ [Key in keyof BasedSchemaFields]: FieldParser<Key, T>;
17
+ }>;
18
+ keys: {
19
+ [key: string]: KeyParser<T>;
20
+ };
21
+ any?: KeyParser<T>;
22
+ catch?: KeyParser<T>;
23
+ };
24
+ collect?: (args: ArgsClass<T>) => any;
25
+ error?: ErrorHandler<T>;
26
+ backtrack?: (args: ArgsClass<T>, fromBackTrack: any[], collectedCommands: any[]) => any;
27
+ requiresAsyncValidation?: (validationType: any) => Promise<boolean>;
28
+ };
29
+ export declare enum Stopped {
30
+ onlyStopFieldParser = 0,
31
+ stopAll = 1
32
+ }
33
+ export type ArgsOpts<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields> = {
34
+ parseTopLevel?: boolean;
35
+ target?: T;
36
+ key?: string | number;
37
+ path?: Path;
38
+ value?: any;
39
+ prev?: ArgsClass<T, K>;
40
+ fieldSchema?: BasedSchemaField;
41
+ typeSchema?: BasedSchemaType;
42
+ skipCollection?: boolean;
43
+ collect?: (args: ArgsClass<T, K>, value?: any) => any;
44
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Stopped = void 0;
4
+ var Stopped;
5
+ (function (Stopped) {
6
+ Stopped[Stopped["onlyStopFieldParser"] = 0] = "onlyStopFieldParser";
7
+ Stopped[Stopped["stopAll"] = 1] = "stopAll";
8
+ })(Stopped = exports.Stopped || (exports.Stopped = {}));
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/walker/types.ts"],"names":[],"mappings":";;;AAuDA,IAAY,OAGX;AAHD,WAAY,OAAO;IACjB,mEAAmB,CAAA;IACnB,2CAAO,CAAA;AACT,CAAC,EAHW,OAAO,GAAP,eAAO,KAAP,eAAO,QAGlB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@based/schema",
3
- "version": "0.0.16",
3
+ "version": "1.0.1",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -13,7 +13,7 @@
13
13
  "dependencies": {
14
14
  "validator": "^13.9.0",
15
15
  "@saulx/hash": "^2.0.0",
16
- "@saulx/utils": "^3.2.2"
16
+ "@saulx/utils": "^3.5.0"
17
17
  },
18
18
  "ava": {
19
19
  "files": [
@@ -1,4 +1,4 @@
1
- import { BasedSetHandlers } from '../types'
1
+ import { BasedSetHandlers } from './types'
2
2
 
3
3
  export enum ParseError {
4
4
  'incorrectFieldType',
@@ -13,6 +13,8 @@ export enum ParseError {
13
13
  'multipleOperationsNotAllowed',
14
14
  'requiredFieldNotDefined',
15
15
  'languageNotSupported',
16
+ 'invalidJSON',
17
+ 'noLanguageFound',
16
18
  }
17
19
 
18
20
  export const error = (
package/src/index.ts CHANGED
@@ -2,6 +2,6 @@ export * from './types'
2
2
 
3
3
  export * from './validateSchema'
4
4
 
5
- export * from './set'
6
-
7
5
  export * from './walker'
6
+
7
+ export * from './set'
@@ -0,0 +1,111 @@
1
+ import { setByPath } from '@saulx/utils'
2
+ import { ParseError } from '../../error'
3
+ import { FieldParser, ArgsClass } from '../../walker'
4
+ import { BasedSetTarget } from '../../types'
5
+
6
+ const parseArray = async (
7
+ args: ArgsClass<BasedSetTarget, 'array'>,
8
+ value: any
9
+ ): Promise<any[]> => {
10
+ const fromValue = Array.isArray(value) ? value : [value]
11
+ const q: Promise<any>[] = []
12
+ const arr = new Array(fromValue.length)
13
+ for (let i = 0; i < fromValue.length; i++) {
14
+ q.push(
15
+ args.parse({
16
+ path: [i],
17
+ value: fromValue[i],
18
+ fieldSchema: args.fieldSchema.values,
19
+ collect: (args, v) => {
20
+ setByPath(arr, args.path, v)
21
+ },
22
+ })
23
+ )
24
+ }
25
+ await Promise.all(q)
26
+ return arr
27
+ }
28
+
29
+ const operations: {
30
+ [key: string]: (
31
+ args: ArgsClass<BasedSetTarget, 'array'>,
32
+ value: any
33
+ ) => Promise<void>
34
+ } = {
35
+ $insert: async (args, value) => {
36
+ if (
37
+ typeof value.$insert !== 'object' ||
38
+ typeof value.$insert.$idx !== 'number'
39
+ ) {
40
+ args.error(ParseError.incorrectFormat)
41
+ return
42
+ }
43
+ value.$insert.$value = await parseArray(args, value.$insert.$value)
44
+ args.collect(value)
45
+ },
46
+ $push: async (args, value) => {
47
+ value.$push = await parseArray(args, value.$push)
48
+ args.collect(value)
49
+ },
50
+ $unshift: async (args, value) => {
51
+ value.$unshift = await parseArray(args, value.$push)
52
+ args.collect(value)
53
+ },
54
+ $remove: async (args, value) => {
55
+ if (typeof value.$remove.$idx !== 'number') {
56
+ args.error(ParseError.incorrectFormat)
57
+ return
58
+ }
59
+ args.collect(value)
60
+ },
61
+ $assign: async (args, value) => {
62
+ if (
63
+ typeof value.$assign !== 'object' ||
64
+ typeof value.$assign.$idx !== 'number'
65
+ ) {
66
+ args.error(ParseError.incorrectFormat)
67
+ return
68
+ }
69
+ await args.parse({
70
+ key: value.$assign.$idx,
71
+ value: args.fieldSchema.values,
72
+ })
73
+ },
74
+ }
75
+
76
+ export const array: FieldParser<'array'> = async (args) => {
77
+ args.stop()
78
+ if (typeof args.value !== 'object') {
79
+ args.error(ParseError.incorrectFormat)
80
+ return
81
+ }
82
+ let value = '$value' in args.value ? args.value.$value : args.value
83
+ if (Array.isArray(value)) {
84
+ const q: Promise<any>[] = []
85
+ args.collect({ $delete: true })
86
+ for (let i = 0; i < value.length; i++) {
87
+ q.push(
88
+ args.parse({
89
+ key: i,
90
+ value: args.value[i],
91
+ fieldSchema: args.fieldSchema.values,
92
+ })
93
+ )
94
+ }
95
+ await Promise.all(q)
96
+ return
97
+ }
98
+ let hasOperation = false
99
+ for (const key in value) {
100
+ if (operations[key]) {
101
+ if (hasOperation) {
102
+ args.error(ParseError.multipleOperationsNotAllowed)
103
+ return
104
+ }
105
+ await operations[key](args, value)
106
+ hasOperation = true
107
+ } else {
108
+ args.error(ParseError.fieldDoesNotExist)
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,69 @@
1
+ import { FieldParsers } from '../../walker'
2
+ import { ParseError } from '../../error'
3
+ import { BasedSetTarget } from '../../types'
4
+ import { array } from './array'
5
+ import { object, record } from './object'
6
+ import { number, integer, timestamp } from './number'
7
+ import { string, text } from './string'
8
+ import { reference, references } from './references'
9
+ import { set } from './set'
10
+ import { hashObjectIgnoreKeyOrder, hash } from '@saulx/hash'
11
+ import { deepEqual } from '@saulx/utils'
12
+
13
+ export const fields: Partial<FieldParsers<BasedSetTarget>> = {
14
+ array,
15
+ object,
16
+ record,
17
+ number,
18
+ integer,
19
+ timestamp,
20
+ string,
21
+ set,
22
+ text,
23
+ reference,
24
+ references,
25
+ cardinality: async (args) => {
26
+ let hashedValue: string
27
+ if (args.value && typeof args.value === 'object') {
28
+ args.stop()
29
+ if (args.value.$default !== undefined) {
30
+ args.error(ParseError.defaultNotSupported)
31
+ return
32
+ }
33
+ if (args.value.$value !== undefined) {
34
+ hashedValue = hashObjectIgnoreKeyOrder(args.value.$value).toString(16)
35
+ } else {
36
+ hashedValue = hashObjectIgnoreKeyOrder(args.value).toString(16)
37
+ }
38
+ } else {
39
+ hashedValue = hash(args.value).toString(16)
40
+ }
41
+ args.collect(hashedValue)
42
+ },
43
+ boolean: async (args) => {
44
+ if (typeof args.value !== 'boolean') {
45
+ args.error(ParseError.incorrectFormat)
46
+ return
47
+ }
48
+ args.collect()
49
+ },
50
+
51
+ json: async (args) => {
52
+ try {
53
+ const parsedValue = JSON.stringify(args.value)
54
+ args.collect(parsedValue)
55
+ } catch (err) {
56
+ args.error(ParseError.invalidJSON)
57
+ }
58
+ },
59
+ enum: async (args) => {
60
+ const enumValues = args.fieldSchema.enum
61
+ for (let i = 0; i < enumValues.length; i++) {
62
+ if (deepEqual(enumValues[i], args.value)) {
63
+ args.collect(i)
64
+ return
65
+ }
66
+ }
67
+ args.error(ParseError.incorrectFormat)
68
+ },
69
+ }