tinybase 9.4.0 → 9.5.0-beta.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 (126) hide show
  1. package/@types/_internal/store/with-schemas/index.d.ts +43 -8
  2. package/@types/mergeable-store/with-schemas/index.d.ts +30 -11
  3. package/@types/queries/index.d.ts +11 -11
  4. package/@types/queries/with-schemas/index.d.ts +17 -3
  5. package/@types/schematizers/index.d.ts +6 -4
  6. package/@types/schematizers/schematizer-arktype/index.d.ts +6 -6
  7. package/@types/schematizers/schematizer-arktype/with-schemas/index.d.ts +112 -1
  8. package/@types/schematizers/schematizer-effect/index.d.ts +9 -11
  9. package/@types/schematizers/schematizer-effect/with-schemas/index.d.ts +114 -1
  10. package/@types/schematizers/schematizer-typebox/index.d.ts +7 -7
  11. package/@types/schematizers/schematizer-typebox/with-schemas/index.d.ts +114 -1
  12. package/@types/schematizers/schematizer-valibot/index.d.ts +6 -6
  13. package/@types/schematizers/schematizer-valibot/with-schemas/index.d.ts +112 -1
  14. package/@types/schematizers/schematizer-yup/index.d.ts +5 -4
  15. package/@types/schematizers/schematizer-yup/with-schemas/index.d.ts +112 -1
  16. package/@types/schematizers/schematizer-zod/index.d.ts +6 -6
  17. package/@types/schematizers/schematizer-zod/with-schemas/index.d.ts +112 -1
  18. package/@types/schematizers/with-schemas/index.d.ts +113 -4
  19. package/@types/store/index.d.ts +175 -16
  20. package/@types/store/with-schemas/index.d.ts +238 -55
  21. package/@types/synchronizers/with-schemas/index.d.ts +12 -2
  22. package/@types/ui-react/with-schemas/index.d.ts +576 -7
  23. package/@types/ui-react-dom/index.d.ts +10 -10
  24. package/@types/ui-react-dom/with-schemas/index.d.ts +94 -10
  25. package/@types/ui-react-dom-charts/index.d.ts +7 -7
  26. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -7
  27. package/@types/ui-react-inspector/index.d.ts +1 -1
  28. package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -1
  29. package/@types/ui-solid/with-schemas/index.d.ts +340 -7
  30. package/@types/ui-solid-dom/index.d.ts +10 -10
  31. package/@types/ui-solid-dom/with-schemas/index.d.ts +94 -10
  32. package/@types/ui-solid-inspector/index.d.ts +1 -1
  33. package/@types/ui-solid-inspector/with-schemas/index.d.ts +1 -1
  34. package/@types/ui-svelte/with-schemas/index.d.ts +30 -0
  35. package/@types/ui-svelte-dom/index.d.ts +10 -10
  36. package/@types/ui-svelte-dom/with-schemas/index.d.ts +94 -10
  37. package/@types/ui-svelte-inspector/index.d.ts +1 -1
  38. package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -1
  39. package/agents.md +4 -0
  40. package/index.js +76 -22
  41. package/mergeable-store/index.js +76 -22
  42. package/mergeable-store/with-schemas/index.js +76 -22
  43. package/min/index.js +1 -1
  44. package/min/index.js.gz +0 -0
  45. package/min/mergeable-store/index.js +1 -1
  46. package/min/mergeable-store/index.js.gz +0 -0
  47. package/min/mergeable-store/with-schemas/index.js +1 -1
  48. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  49. package/min/omni/index.js +1 -1
  50. package/min/omni/index.js.gz +0 -0
  51. package/min/omni/with-schemas/index.js +1 -1
  52. package/min/omni/with-schemas/index.js.gz +0 -0
  53. package/min/schematizers/index.js +1 -1
  54. package/min/schematizers/index.js.gz +0 -0
  55. package/min/schematizers/schematizer-arktype/index.js +1 -1
  56. package/min/schematizers/schematizer-arktype/index.js.gz +0 -0
  57. package/min/schematizers/schematizer-arktype/with-schemas/index.js +1 -1
  58. package/min/schematizers/schematizer-arktype/with-schemas/index.js.gz +0 -0
  59. package/min/schematizers/schematizer-effect/index.js +1 -1
  60. package/min/schematizers/schematizer-effect/index.js.gz +0 -0
  61. package/min/schematizers/schematizer-effect/with-schemas/index.js +1 -1
  62. package/min/schematizers/schematizer-effect/with-schemas/index.js.gz +0 -0
  63. package/min/schematizers/schematizer-typebox/index.js +1 -1
  64. package/min/schematizers/schematizer-typebox/index.js.gz +0 -0
  65. package/min/schematizers/schematizer-typebox/with-schemas/index.js +1 -1
  66. package/min/schematizers/schematizer-typebox/with-schemas/index.js.gz +0 -0
  67. package/min/schematizers/schematizer-valibot/index.js +1 -1
  68. package/min/schematizers/schematizer-valibot/index.js.gz +0 -0
  69. package/min/schematizers/schematizer-valibot/with-schemas/index.js +1 -1
  70. package/min/schematizers/schematizer-valibot/with-schemas/index.js.gz +0 -0
  71. package/min/schematizers/schematizer-yup/index.js +1 -1
  72. package/min/schematizers/schematizer-yup/index.js.gz +0 -0
  73. package/min/schematizers/schematizer-yup/with-schemas/index.js +1 -1
  74. package/min/schematizers/schematizer-yup/with-schemas/index.js.gz +0 -0
  75. package/min/schematizers/schematizer-zod/index.js +1 -1
  76. package/min/schematizers/schematizer-zod/index.js.gz +0 -0
  77. package/min/schematizers/schematizer-zod/with-schemas/index.js +1 -1
  78. package/min/schematizers/schematizer-zod/with-schemas/index.js.gz +0 -0
  79. package/min/schematizers/with-schemas/index.js +1 -1
  80. package/min/schematizers/with-schemas/index.js.gz +0 -0
  81. package/min/store/index.js +1 -1
  82. package/min/store/index.js.gz +0 -0
  83. package/min/store/with-schemas/index.js +1 -1
  84. package/min/store/with-schemas/index.js.gz +0 -0
  85. package/min/ui-react-inspector/index.js +1 -1
  86. package/min/ui-react-inspector/index.js.gz +0 -0
  87. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  88. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  89. package/min/ui-solid-inspector/index.js +1 -1
  90. package/min/ui-solid-inspector/index.js.gz +0 -0
  91. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  92. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  93. package/min/ui-svelte-inspector/index.js +1 -1
  94. package/min/ui-svelte-inspector/index.js.gz +0 -0
  95. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  96. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  97. package/min/with-schemas/index.js +1 -1
  98. package/min/with-schemas/index.js.gz +0 -0
  99. package/omni/index.js +76 -22
  100. package/omni/with-schemas/index.js +76 -22
  101. package/package.json +2 -2
  102. package/readme.md +14 -14
  103. package/releases.md +95 -65
  104. package/schematizers/index.js +54 -6
  105. package/schematizers/schematizer-arktype/index.js +99 -19
  106. package/schematizers/schematizer-arktype/with-schemas/index.js +99 -19
  107. package/schematizers/schematizer-effect/index.js +101 -11
  108. package/schematizers/schematizer-effect/with-schemas/index.js +101 -11
  109. package/schematizers/schematizer-typebox/index.js +87 -11
  110. package/schematizers/schematizer-typebox/with-schemas/index.js +87 -11
  111. package/schematizers/schematizer-valibot/index.js +125 -21
  112. package/schematizers/schematizer-valibot/with-schemas/index.js +125 -21
  113. package/schematizers/schematizer-yup/index.js +58 -14
  114. package/schematizers/schematizer-yup/with-schemas/index.js +58 -14
  115. package/schematizers/schematizer-zod/index.js +131 -12
  116. package/schematizers/schematizer-zod/with-schemas/index.js +131 -12
  117. package/schematizers/with-schemas/index.js +54 -6
  118. package/store/index.js +76 -22
  119. package/store/with-schemas/index.js +76 -22
  120. package/ui-react-inspector/index.js +76 -22
  121. package/ui-react-inspector/with-schemas/index.js +76 -22
  122. package/ui-solid-inspector/index.js +76 -22
  123. package/ui-solid-inspector/with-schemas/index.js +76 -22
  124. package/ui-svelte-inspector/index.js +76 -22
  125. package/ui-svelte-inspector/with-schemas/index.js +76 -22
  126. package/with-schemas/index.js +76 -22
@@ -6,21 +6,31 @@ const NUMBER = getTypeOf(0);
6
6
  const OBJECT = 'object';
7
7
  const ARRAY = 'array';
8
8
  const TYPE = 'type';
9
+ const ENUM = 'enum';
9
10
  const DEFAULT = 'default';
10
11
  const ALLOW_NULL = 'allowNull';
12
+ const NULL = 'null';
11
13
  const REQUIRED = 'required';
14
+ const UNDEFINED = '\uFFFC';
15
+ const JSON_PREFIX = '\uFFFD';
12
16
 
13
17
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
14
18
  predicate(value)
15
19
  ? /* istanbul ignore next */
16
20
  otherwise?.()
17
21
  : then(value);
22
+ const isFiniteNumber = isFinite;
18
23
  const isNullish = (thing) => thing == null;
19
24
  const isUndefined = (thing) => thing === void 0;
25
+ const isNull = (thing) => thing === null;
20
26
  const ifNotNullish = getIfNotFunction(isNullish);
21
27
  const ifNotUndefined = getIfNotFunction(isUndefined);
28
+ const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
29
+ const isString = (thing) => getTypeOf(thing) == STRING;
30
+ const isArray = (thing) => Array.isArray(thing);
22
31
  const size = (thing) => thing.length;
23
32
 
33
+ const arrayEvery = (array, cb) => array.every(cb);
24
34
  const arrayForEach = (array, cb) => array.forEach(cb);
25
35
 
26
36
  const object = Object;
@@ -57,6 +67,33 @@ const objForEach = (obj, cb) =>
57
67
  const objSize = (obj) => size(objIds(obj));
58
68
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
59
69
 
70
+ const getCellOrValueType = (cellOrValue) => {
71
+ if (isNull(cellOrValue)) {
72
+ return NULL;
73
+ }
74
+ if (isArray(cellOrValue)) {
75
+ return ARRAY;
76
+ }
77
+ if (isObject(cellOrValue)) {
78
+ return OBJECT;
79
+ }
80
+ const type = getTypeOf(cellOrValue);
81
+ return isTypeStringOrBoolean(type) ||
82
+ (type == NUMBER && isFiniteNumber(cellOrValue))
83
+ ? type
84
+ : void 0;
85
+ };
86
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
87
+ const isCellOrValueSchemaType = (type) =>
88
+ isTypeStringOrBoolean(type) || type == NUMBER || isJsonType(type);
89
+ const isCellOrValueSchemaTypes = (types) =>
90
+ isArray(types)
91
+ ? !isUndefined(types[0]) && arrayEvery(types, isCellOrValueSchemaType)
92
+ : isCellOrValueSchemaType(types);
93
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
94
+ const isReservedString = (value, encoded = 0) =>
95
+ value === UNDEFINED || (!encoded && isEncodedJson(value));
96
+
60
97
  const createCustomSchematizer = (
61
98
  unwrapSchema,
62
99
  getProperties,
@@ -66,16 +103,27 @@ const createCustomSchematizer = (
66
103
  const [unwrapped, defaultValue, allowNull, unwrappedRequired = required] =
67
104
  unwrapSchema(schema, void 0, void 0, required);
68
105
  const type = unwrapped?.type;
106
+ const enumValues = unwrapped?.[ENUM];
107
+ const isEnum =
108
+ isUndefined(type) &&
109
+ isArray(enumValues) &&
110
+ !isUndefined(enumValues[0]) &&
111
+ arrayEvery(enumValues, (enumValue) => {
112
+ const enumType = getCellOrValueType(enumValue);
113
+ return (
114
+ !isNull(enumValue) &&
115
+ !isUndefined(enumType) &&
116
+ !isJsonType(enumType) &&
117
+ !isReservedString(enumValue)
118
+ );
119
+ });
69
120
  if (
70
- type !== STRING &&
71
- type !== NUMBER &&
72
- type !== BOOLEAN &&
73
- type !== OBJECT &&
74
- type !== ARRAY
121
+ !isEnum &&
122
+ (!isUndefined(enumValues) || !isCellOrValueSchemaTypes(type))
75
123
  ) {
76
124
  return void 0;
77
125
  }
78
- const cellOrValueSchema = {[TYPE]: type};
126
+ const cellOrValueSchema = isEnum ? {[ENUM]: enumValues} : {[TYPE]: type};
79
127
  ifNotUndefined(defaultValue, (defaultValue2) => {
80
128
  cellOrValueSchema[DEFAULT] = defaultValue2;
81
129
  });
@@ -6,8 +6,10 @@ const NUMBER = getTypeOf(0);
6
6
  const OBJECT = 'object';
7
7
  const ARRAY = 'array';
8
8
  const TYPE = 'type';
9
+ const ENUM = 'enum';
9
10
  const DEFAULT = 'default';
10
11
  const ALLOW_NULL = 'allowNull';
12
+ const NULL = 'null';
11
13
  const _VALUE = 'value';
12
14
  const DOMAIN = 'domain';
13
15
  const KEY = 'key';
@@ -15,12 +17,15 @@ const OPTIONAL = 'optional';
15
17
  const REQUIRED = 'required';
16
18
  const UNIT = 'unit';
17
19
  const SEQUENCE = 'sequence';
20
+ const UNDEFINED = '\uFFFC';
21
+ const JSON_PREFIX = '\uFFFD';
18
22
 
19
23
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
20
24
  predicate(value)
21
25
  ? /* istanbul ignore next */
22
26
  otherwise?.()
23
27
  : then(value);
28
+ const isFiniteNumber = isFinite;
24
29
  const isNullish = (thing) => thing == null;
25
30
  const isUndefined = (thing) => thing === void 0;
26
31
  const isNull = (thing) => thing === null;
@@ -28,12 +33,16 @@ const isTrue = (thing) => thing === true;
28
33
  const isFalse = (thing) => thing === false;
29
34
  const ifNotNullish = getIfNotFunction(isNullish);
30
35
  const ifNotUndefined = getIfNotFunction(isUndefined);
36
+ const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
31
37
  const isString = (thing) => getTypeOf(thing) == STRING;
32
38
  const isArray = (thing) => Array.isArray(thing);
33
39
  const size = (thing) => thing.length;
34
40
 
41
+ const arrayIndexOf = (array, value) => array.indexOf(value);
35
42
  const arrayEvery = (array, cb) => array.every(cb);
36
43
  const arrayForEach = (array, cb) => array.forEach(cb);
44
+ const arrayMap = (array, cb) => array.map(cb);
45
+ const arrayFilter = (array, cb) => array.filter(cb);
37
46
  const arrayFind = (array, cb) => array.find(cb);
38
47
 
39
48
  const object = Object;
@@ -70,6 +79,44 @@ const objForEach = (obj, cb) =>
70
79
  const objSize = (obj) => size(objIds(obj));
71
80
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
72
81
 
82
+ const getCellOrValueType = (cellOrValue) => {
83
+ if (isNull(cellOrValue)) {
84
+ return NULL;
85
+ }
86
+ if (isArray(cellOrValue)) {
87
+ return ARRAY;
88
+ }
89
+ if (isObject(cellOrValue)) {
90
+ return OBJECT;
91
+ }
92
+ const type = getTypeOf(cellOrValue);
93
+ return isTypeStringOrBoolean(type) ||
94
+ (type == NUMBER && isFiniteNumber(cellOrValue))
95
+ ? type
96
+ : void 0;
97
+ };
98
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
99
+ const isCellOrValueSchemaType = (type) =>
100
+ isTypeStringOrBoolean(type) || type == NUMBER || isJsonType(type);
101
+ const isCellOrValueSchemaTypes = (types) =>
102
+ isArray(types)
103
+ ? !isUndefined(types[0]) && arrayEvery(types, isCellOrValueSchemaType)
104
+ : isCellOrValueSchemaType(types);
105
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
106
+ const isReservedString = (value, encoded = 0) =>
107
+ value === UNDEFINED || (!encoded && isEncodedJson(value));
108
+
109
+ const getTypeOrTypeUnion = (types) => {
110
+ if (!arrayEvery(types, isCellOrValueSchemaType)) {
111
+ return;
112
+ }
113
+ const uniqueTypes = arrayFilter(
114
+ types,
115
+ (type, index) => arrayIndexOf(types, type) == index,
116
+ );
117
+ return uniqueTypes[1] ? uniqueTypes : uniqueTypes[0];
118
+ };
119
+
73
120
  const createCustomSchematizer = (
74
121
  unwrapSchema,
75
122
  getProperties,
@@ -79,16 +126,27 @@ const createCustomSchematizer = (
79
126
  const [unwrapped, defaultValue, allowNull, unwrappedRequired = required] =
80
127
  unwrapSchema(schema, void 0, void 0, required);
81
128
  const type = unwrapped?.type;
129
+ const enumValues = unwrapped?.[ENUM];
130
+ const isEnum =
131
+ isUndefined(type) &&
132
+ isArray(enumValues) &&
133
+ !isUndefined(enumValues[0]) &&
134
+ arrayEvery(enumValues, (enumValue) => {
135
+ const enumType = getCellOrValueType(enumValue);
136
+ return (
137
+ !isNull(enumValue) &&
138
+ !isUndefined(enumType) &&
139
+ !isJsonType(enumType) &&
140
+ !isReservedString(enumValue)
141
+ );
142
+ });
82
143
  if (
83
- type !== STRING &&
84
- type !== NUMBER &&
85
- type !== BOOLEAN &&
86
- type !== OBJECT &&
87
- type !== ARRAY
144
+ !isEnum &&
145
+ (!isUndefined(enumValues) || !isCellOrValueSchemaTypes(type))
88
146
  ) {
89
147
  return void 0;
90
148
  }
91
- const cellOrValueSchema = {[TYPE]: type};
149
+ const cellOrValueSchema = isEnum ? {[ENUM]: enumValues} : {[TYPE]: type};
92
150
  ifNotUndefined(defaultValue, (defaultValue2) => {
93
151
  cellOrValueSchema[DEFAULT] = defaultValue2;
94
152
  });
@@ -138,6 +196,12 @@ const createCustomSchematizer = (
138
196
  });
139
197
  };
140
198
 
199
+ const getSimpleType = (schema) =>
200
+ !isUndefined(schema?.[UNIT])
201
+ ? getCellOrValueType(schema[UNIT])
202
+ : !isUndefined(schema?.[SEQUENCE])
203
+ ? ARRAY
204
+ : schema?.[DOMAIN] || schema;
141
205
  const unwrapSchema = (schema, defaultValue, allowNull, required = true) => {
142
206
  const schemaData = schema?.json ?? schema;
143
207
  if (isArray(schemaData)) {
@@ -152,24 +216,40 @@ const unwrapSchema = (schema, defaultValue, allowNull, required = true) => {
152
216
  ) {
153
217
  return [{[TYPE]: BOOLEAN}, defaultValue, allowNull ?? false, required];
154
218
  }
155
- if (arrayEvery(schemaData, (item) => isString(item?.[UNIT] ?? item))) {
156
- return [{[TYPE]: STRING}, defaultValue, allowNull ?? false, required];
157
- }
158
- if (hasNull) {
159
- const nonNullItem = arrayFind(
160
- schemaData,
161
- (item) => !isNull(item?.[UNIT]) && !isNull(item) && item !== '=',
162
- );
163
- if (nonNullItem) {
164
- return unwrapSchema(nonNullItem, defaultValue, true, required);
165
- }
219
+ const enumItems = arrayFilter(
220
+ schemaData,
221
+ (item) => !isNull(item?.[UNIT]) && !isNull(item) && item !== '=',
222
+ );
223
+ if (
224
+ size(enumItems) > 0 &&
225
+ arrayEvery(enumItems, (item) => !isUndefined(item?.[UNIT]))
226
+ ) {
227
+ return [
228
+ {[ENUM]: arrayMap(enumItems, (item) => item[UNIT])},
229
+ defaultValue,
230
+ hasNull || allowNull || false,
231
+ required,
232
+ ];
166
233
  }
234
+ return [
235
+ {
236
+ [TYPE]: getTypeOrTypeUnion(arrayMap(enumItems, getSimpleType)),
237
+ },
238
+ defaultValue,
239
+ hasNull || allowNull || false,
240
+ required,
241
+ ];
167
242
  }
168
243
  if (!isArray(schemaData) && !isUndefined(schemaData?.[SEQUENCE])) {
169
244
  return [{[TYPE]: ARRAY}, defaultValue, allowNull ?? false, required];
170
245
  }
171
- if (!isArray(schemaData) && isString(schemaData?.[UNIT])) {
172
- return [{[TYPE]: STRING}, defaultValue, allowNull ?? false, required];
246
+ if (!isArray(schemaData) && !isUndefined(schemaData?.[UNIT])) {
247
+ return [
248
+ {[ENUM]: [schemaData[UNIT]]},
249
+ defaultValue,
250
+ allowNull ?? false,
251
+ required,
252
+ ];
173
253
  }
174
254
  return [
175
255
  {[TYPE]: schemaData?.[DOMAIN] || schemaData},
@@ -6,8 +6,10 @@ const NUMBER = getTypeOf(0);
6
6
  const OBJECT = 'object';
7
7
  const ARRAY = 'array';
8
8
  const TYPE = 'type';
9
+ const ENUM = 'enum';
9
10
  const DEFAULT = 'default';
10
11
  const ALLOW_NULL = 'allowNull';
12
+ const NULL = 'null';
11
13
  const _VALUE = 'value';
12
14
  const DOMAIN = 'domain';
13
15
  const KEY = 'key';
@@ -15,12 +17,15 @@ const OPTIONAL = 'optional';
15
17
  const REQUIRED = 'required';
16
18
  const UNIT = 'unit';
17
19
  const SEQUENCE = 'sequence';
20
+ const UNDEFINED = '\uFFFC';
21
+ const JSON_PREFIX = '\uFFFD';
18
22
 
19
23
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
20
24
  predicate(value)
21
25
  ? /* istanbul ignore next */
22
26
  otherwise?.()
23
27
  : then(value);
28
+ const isFiniteNumber = isFinite;
24
29
  const isNullish = (thing) => thing == null;
25
30
  const isUndefined = (thing) => thing === void 0;
26
31
  const isNull = (thing) => thing === null;
@@ -28,12 +33,16 @@ const isTrue = (thing) => thing === true;
28
33
  const isFalse = (thing) => thing === false;
29
34
  const ifNotNullish = getIfNotFunction(isNullish);
30
35
  const ifNotUndefined = getIfNotFunction(isUndefined);
36
+ const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
31
37
  const isString = (thing) => getTypeOf(thing) == STRING;
32
38
  const isArray = (thing) => Array.isArray(thing);
33
39
  const size = (thing) => thing.length;
34
40
 
41
+ const arrayIndexOf = (array, value) => array.indexOf(value);
35
42
  const arrayEvery = (array, cb) => array.every(cb);
36
43
  const arrayForEach = (array, cb) => array.forEach(cb);
44
+ const arrayMap = (array, cb) => array.map(cb);
45
+ const arrayFilter = (array, cb) => array.filter(cb);
37
46
  const arrayFind = (array, cb) => array.find(cb);
38
47
 
39
48
  const object = Object;
@@ -70,6 +79,44 @@ const objForEach = (obj, cb) =>
70
79
  const objSize = (obj) => size(objIds(obj));
71
80
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
72
81
 
82
+ const getCellOrValueType = (cellOrValue) => {
83
+ if (isNull(cellOrValue)) {
84
+ return NULL;
85
+ }
86
+ if (isArray(cellOrValue)) {
87
+ return ARRAY;
88
+ }
89
+ if (isObject(cellOrValue)) {
90
+ return OBJECT;
91
+ }
92
+ const type = getTypeOf(cellOrValue);
93
+ return isTypeStringOrBoolean(type) ||
94
+ (type == NUMBER && isFiniteNumber(cellOrValue))
95
+ ? type
96
+ : void 0;
97
+ };
98
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
99
+ const isCellOrValueSchemaType = (type) =>
100
+ isTypeStringOrBoolean(type) || type == NUMBER || isJsonType(type);
101
+ const isCellOrValueSchemaTypes = (types) =>
102
+ isArray(types)
103
+ ? !isUndefined(types[0]) && arrayEvery(types, isCellOrValueSchemaType)
104
+ : isCellOrValueSchemaType(types);
105
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
106
+ const isReservedString = (value, encoded = 0) =>
107
+ value === UNDEFINED || (!encoded && isEncodedJson(value));
108
+
109
+ const getTypeOrTypeUnion = (types) => {
110
+ if (!arrayEvery(types, isCellOrValueSchemaType)) {
111
+ return;
112
+ }
113
+ const uniqueTypes = arrayFilter(
114
+ types,
115
+ (type, index) => arrayIndexOf(types, type) == index,
116
+ );
117
+ return uniqueTypes[1] ? uniqueTypes : uniqueTypes[0];
118
+ };
119
+
73
120
  const createCustomSchematizer = (
74
121
  unwrapSchema,
75
122
  getProperties,
@@ -79,16 +126,27 @@ const createCustomSchematizer = (
79
126
  const [unwrapped, defaultValue, allowNull, unwrappedRequired = required] =
80
127
  unwrapSchema(schema, void 0, void 0, required);
81
128
  const type = unwrapped?.type;
129
+ const enumValues = unwrapped?.[ENUM];
130
+ const isEnum =
131
+ isUndefined(type) &&
132
+ isArray(enumValues) &&
133
+ !isUndefined(enumValues[0]) &&
134
+ arrayEvery(enumValues, (enumValue) => {
135
+ const enumType = getCellOrValueType(enumValue);
136
+ return (
137
+ !isNull(enumValue) &&
138
+ !isUndefined(enumType) &&
139
+ !isJsonType(enumType) &&
140
+ !isReservedString(enumValue)
141
+ );
142
+ });
82
143
  if (
83
- type !== STRING &&
84
- type !== NUMBER &&
85
- type !== BOOLEAN &&
86
- type !== OBJECT &&
87
- type !== ARRAY
144
+ !isEnum &&
145
+ (!isUndefined(enumValues) || !isCellOrValueSchemaTypes(type))
88
146
  ) {
89
147
  return void 0;
90
148
  }
91
- const cellOrValueSchema = {[TYPE]: type};
149
+ const cellOrValueSchema = isEnum ? {[ENUM]: enumValues} : {[TYPE]: type};
92
150
  ifNotUndefined(defaultValue, (defaultValue2) => {
93
151
  cellOrValueSchema[DEFAULT] = defaultValue2;
94
152
  });
@@ -138,6 +196,12 @@ const createCustomSchematizer = (
138
196
  });
139
197
  };
140
198
 
199
+ const getSimpleType = (schema) =>
200
+ !isUndefined(schema?.[UNIT])
201
+ ? getCellOrValueType(schema[UNIT])
202
+ : !isUndefined(schema?.[SEQUENCE])
203
+ ? ARRAY
204
+ : schema?.[DOMAIN] || schema;
141
205
  const unwrapSchema = (schema, defaultValue, allowNull, required = true) => {
142
206
  const schemaData = schema?.json ?? schema;
143
207
  if (isArray(schemaData)) {
@@ -152,24 +216,40 @@ const unwrapSchema = (schema, defaultValue, allowNull, required = true) => {
152
216
  ) {
153
217
  return [{[TYPE]: BOOLEAN}, defaultValue, allowNull ?? false, required];
154
218
  }
155
- if (arrayEvery(schemaData, (item) => isString(item?.[UNIT] ?? item))) {
156
- return [{[TYPE]: STRING}, defaultValue, allowNull ?? false, required];
157
- }
158
- if (hasNull) {
159
- const nonNullItem = arrayFind(
160
- schemaData,
161
- (item) => !isNull(item?.[UNIT]) && !isNull(item) && item !== '=',
162
- );
163
- if (nonNullItem) {
164
- return unwrapSchema(nonNullItem, defaultValue, true, required);
165
- }
219
+ const enumItems = arrayFilter(
220
+ schemaData,
221
+ (item) => !isNull(item?.[UNIT]) && !isNull(item) && item !== '=',
222
+ );
223
+ if (
224
+ size(enumItems) > 0 &&
225
+ arrayEvery(enumItems, (item) => !isUndefined(item?.[UNIT]))
226
+ ) {
227
+ return [
228
+ {[ENUM]: arrayMap(enumItems, (item) => item[UNIT])},
229
+ defaultValue,
230
+ hasNull || allowNull || false,
231
+ required,
232
+ ];
166
233
  }
234
+ return [
235
+ {
236
+ [TYPE]: getTypeOrTypeUnion(arrayMap(enumItems, getSimpleType)),
237
+ },
238
+ defaultValue,
239
+ hasNull || allowNull || false,
240
+ required,
241
+ ];
167
242
  }
168
243
  if (!isArray(schemaData) && !isUndefined(schemaData?.[SEQUENCE])) {
169
244
  return [{[TYPE]: ARRAY}, defaultValue, allowNull ?? false, required];
170
245
  }
171
- if (!isArray(schemaData) && isString(schemaData?.[UNIT])) {
172
- return [{[TYPE]: STRING}, defaultValue, allowNull ?? false, required];
246
+ if (!isArray(schemaData) && !isUndefined(schemaData?.[UNIT])) {
247
+ return [
248
+ {[ENUM]: [schemaData[UNIT]]},
249
+ defaultValue,
250
+ allowNull ?? false,
251
+ required,
252
+ ];
173
253
  }
174
254
  return [
175
255
  {[TYPE]: schemaData?.[DOMAIN] || schemaData},
@@ -6,8 +6,10 @@ const NUMBER = getTypeOf(0);
6
6
  const OBJECT = 'object';
7
7
  const ARRAY = 'array';
8
8
  const TYPE = 'type';
9
+ const ENUM = 'enum';
9
10
  const DEFAULT = 'default';
10
11
  const ALLOW_NULL = 'allowNull';
12
+ const NULL = 'null';
11
13
  const REQUIRED = 'required';
12
14
  const LITERAL = 'Literal';
13
15
  const PROPERTY_SIGNATURES = 'propertySignatures';
@@ -17,20 +19,30 @@ const BOOLEAN_KEYWORD = 'BooleanKeyword';
17
19
  const TUPLE_TYPE = 'TupleType';
18
20
  const TYPE_LITERAL = 'TypeLiteral';
19
21
  const UNION = 'Union';
22
+ const UNDEFINED = '\uFFFC';
23
+ const JSON_PREFIX = '\uFFFD';
20
24
 
21
25
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
22
26
  predicate(value)
23
27
  ? /* istanbul ignore next */
24
28
  otherwise?.()
25
29
  : then(value);
30
+ const isFiniteNumber = isFinite;
26
31
  const isNullish = (thing) => thing == null;
27
32
  const isUndefined = (thing) => thing === void 0;
28
33
  const isNull = (thing) => thing === null;
29
34
  const ifNotNullish = getIfNotFunction(isNullish);
30
35
  const ifNotUndefined = getIfNotFunction(isUndefined);
36
+ const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
37
+ const isString = (thing) => getTypeOf(thing) == STRING;
38
+ const isArray = (thing) => Array.isArray(thing);
31
39
  const size = (thing) => thing.length;
32
40
 
41
+ const arrayIndexOf = (array, value) => array.indexOf(value);
42
+ const arrayEvery = (array, cb) => array.every(cb);
33
43
  const arrayForEach = (array, cb) => array.forEach(cb);
44
+ const arrayMap = (array, cb) => array.map(cb);
45
+ const arrayFilter = (array, cb) => array.filter(cb);
34
46
  const arrayFind = (array, cb) => array.find(cb);
35
47
 
36
48
  const object = Object;
@@ -67,6 +79,44 @@ const objForEach = (obj, cb) =>
67
79
  const objSize = (obj) => size(objIds(obj));
68
80
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
69
81
 
82
+ const getCellOrValueType = (cellOrValue) => {
83
+ if (isNull(cellOrValue)) {
84
+ return NULL;
85
+ }
86
+ if (isArray(cellOrValue)) {
87
+ return ARRAY;
88
+ }
89
+ if (isObject(cellOrValue)) {
90
+ return OBJECT;
91
+ }
92
+ const type = getTypeOf(cellOrValue);
93
+ return isTypeStringOrBoolean(type) ||
94
+ (type == NUMBER && isFiniteNumber(cellOrValue))
95
+ ? type
96
+ : void 0;
97
+ };
98
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
99
+ const isCellOrValueSchemaType = (type) =>
100
+ isTypeStringOrBoolean(type) || type == NUMBER || isJsonType(type);
101
+ const isCellOrValueSchemaTypes = (types) =>
102
+ isArray(types)
103
+ ? !isUndefined(types[0]) && arrayEvery(types, isCellOrValueSchemaType)
104
+ : isCellOrValueSchemaType(types);
105
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
106
+ const isReservedString = (value, encoded = 0) =>
107
+ value === UNDEFINED || (!encoded && isEncodedJson(value));
108
+
109
+ const getTypeOrTypeUnion = (types) => {
110
+ if (!arrayEvery(types, isCellOrValueSchemaType)) {
111
+ return;
112
+ }
113
+ const uniqueTypes = arrayFilter(
114
+ types,
115
+ (type, index) => arrayIndexOf(types, type) == index,
116
+ );
117
+ return uniqueTypes[1] ? uniqueTypes : uniqueTypes[0];
118
+ };
119
+
70
120
  const createCustomSchematizer = (
71
121
  unwrapSchema,
72
122
  getProperties,
@@ -76,16 +126,27 @@ const createCustomSchematizer = (
76
126
  const [unwrapped, defaultValue, allowNull, unwrappedRequired = required] =
77
127
  unwrapSchema(schema, void 0, void 0, required);
78
128
  const type = unwrapped?.type;
129
+ const enumValues = unwrapped?.[ENUM];
130
+ const isEnum =
131
+ isUndefined(type) &&
132
+ isArray(enumValues) &&
133
+ !isUndefined(enumValues[0]) &&
134
+ arrayEvery(enumValues, (enumValue) => {
135
+ const enumType = getCellOrValueType(enumValue);
136
+ return (
137
+ !isNull(enumValue) &&
138
+ !isUndefined(enumType) &&
139
+ !isJsonType(enumType) &&
140
+ !isReservedString(enumValue)
141
+ );
142
+ });
79
143
  if (
80
- type !== STRING &&
81
- type !== NUMBER &&
82
- type !== BOOLEAN &&
83
- type !== OBJECT &&
84
- type !== ARRAY
144
+ !isEnum &&
145
+ (!isUndefined(enumValues) || !isCellOrValueSchemaTypes(type))
85
146
  ) {
86
147
  return void 0;
87
148
  }
88
- const cellOrValueSchema = {[TYPE]: type};
149
+ const cellOrValueSchema = isEnum ? {[ENUM]: enumValues} : {[TYPE]: type};
89
150
  ifNotUndefined(defaultValue, (defaultValue2) => {
90
151
  cellOrValueSchema[DEFAULT] = defaultValue2;
91
152
  });
@@ -135,6 +196,7 @@ const createCustomSchematizer = (
135
196
  });
136
197
  };
137
198
 
199
+ const UNDEFINED_KEYWORD = 'UndefinedKeyword';
138
200
  const unwrapSchema = (schema, defaultValue, allowNull, required = true) => {
139
201
  const ast = schema.ast || schema;
140
202
  const typeAst = ast.type || ast;
@@ -142,15 +204,43 @@ const unwrapSchema = (schema, defaultValue, allowNull, required = true) => {
142
204
  const type = typeAst._tag;
143
205
  if (type === UNION) {
144
206
  const types = typeAst.types;
145
- const nonNullType = arrayFind(
207
+ const nonNullTypes = arrayFilter(
146
208
  types,
147
- (t) => !(t._tag === LITERAL && isNull(t.literal)),
209
+ (t) =>
210
+ !(t._tag === LITERAL && isNull(t.literal)) &&
211
+ t._tag !== UNDEFINED_KEYWORD,
148
212
  );
213
+ const hasNull = !!arrayFind(
214
+ types,
215
+ (t) => t._tag === LITERAL && isNull(t.literal),
216
+ );
217
+ if (
218
+ arrayEvery(
219
+ nonNullTypes,
220
+ (t) => t._tag === LITERAL && getSimpleType(t) !== EMPTY_STRING,
221
+ )
222
+ ) {
223
+ return [
224
+ {[ENUM]: arrayMap(nonNullTypes, (t) => t.literal)},
225
+ defaultValue,
226
+ allowNull || hasNull,
227
+ required,
228
+ ];
229
+ }
230
+ return [
231
+ {
232
+ [TYPE]: getTypeOrTypeUnion(arrayMap(nonNullTypes, getSimpleType)),
233
+ },
234
+ defaultValue,
235
+ allowNull || hasNull,
236
+ required,
237
+ ];
238
+ }
239
+ if (type === LITERAL && getSimpleType(typeAst) !== EMPTY_STRING) {
149
240
  return [
150
- {[TYPE]: getSimpleType(nonNullType)},
241
+ {[ENUM]: [typeAst.literal]},
151
242
  defaultValue,
152
- allowNull ||
153
- !!arrayFind(types, (t) => t._tag === LITERAL && isNull(t.literal)),
243
+ allowNull || false,
154
244
  required,
155
245
  ];
156
246
  }