@based/schema 2.7.0 → 3.0.0
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/display/index.d.ts +2 -0
- package/dist/display/index.js +26 -0
- package/dist/display/number.d.ts +3 -0
- package/dist/display/number.js +89 -0
- package/dist/display/string.d.ts +3 -0
- package/dist/display/string.js +23 -0
- package/dist/display/timestamp.d.ts +3 -0
- package/dist/display/timestamp.js +127 -0
- package/dist/error.d.ts +19 -0
- package/dist/error.js +24 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +22 -0
- package/dist/languages.d.ts +187 -0
- package/dist/languages.js +190 -0
- package/dist/set/fields/array.d.ts +2 -0
- package/dist/set/fields/array.js +123 -0
- package/dist/set/fields/index.d.ts +3 -0
- package/dist/set/fields/index.js +74 -0
- package/dist/set/fields/number.d.ts +4 -0
- package/dist/set/fields/number.js +129 -0
- package/dist/set/fields/object.d.ts +3 -0
- package/dist/set/fields/object.js +33 -0
- package/dist/set/fields/references.d.ts +3 -0
- package/dist/set/fields/references.js +128 -0
- package/dist/set/fields/set.d.ts +2 -0
- package/dist/set/fields/set.js +63 -0
- package/dist/set/fields/string.d.ts +3 -0
- package/dist/set/fields/string.js +284 -0
- package/dist/set/index.d.ts +3 -0
- package/dist/set/index.js +183 -0
- package/dist/set/isValidId.d.ts +2 -0
- package/dist/set/isValidId.js +21 -0
- package/dist/set/types.d.ts +0 -0
- package/dist/set/types.js +1 -0
- package/dist/src/compat/index.d.ts +6 -2
- package/dist/src/compat/index.js +202 -2
- package/dist/src/compat/newToOld.d.ts +2 -2
- package/dist/src/compat/newToOld.js +14 -9
- package/dist/src/compat/oldSchemaType.d.ts +28 -4
- package/dist/src/compat/oldToNew.d.ts +1 -1
- package/dist/src/set/fields/array.js +4 -4
- package/dist/src/types.d.ts +1 -1
- package/dist/src/validateSchema/fieldValidators.js +12 -4
- package/dist/src/validateSchema/utils.d.ts +4 -0
- package/dist/src/validateSchema/utils.js +8 -0
- package/dist/test/array.js +4 -4
- package/dist/test/compat.js +38 -2
- package/dist/test/data/newSchemas.d.ts +2 -2
- package/dist/test/data/newSchemas.js +244 -7
- package/dist/test/rest.js +1 -1
- package/dist/test/validateSchema/fields.js +75 -5
- package/dist/test/validateSchema/realWorld.d.ts +1 -0
- package/dist/test/validateSchema/realWorld.js +13 -0
- package/dist/test/walker.js +2 -2
- package/dist/types.d.ts +205 -0
- package/dist/types.js +27 -0
- package/dist/updateSchema.d.ts +2 -0
- package/dist/updateSchema.js +16 -0
- package/dist/validateSchema.d.ts +4 -0
- package/dist/validateSchema.js +41 -0
- package/dist/walker/args.d.ts +36 -0
- package/dist/walker/args.js +162 -0
- package/dist/walker/index.d.ts +6 -0
- package/dist/walker/index.js +49 -0
- package/dist/walker/parse.d.ts +3 -0
- package/dist/walker/parse.js +186 -0
- package/dist/walker/types.d.ts +45 -0
- package/dist/walker/types.js +10 -0
- package/package.json +4 -3
- package/dist/src/compat/Untitled-1.d.ts +0 -3
- package/dist/src/compat/Untitled-1.js +0 -205
package/dist/src/compat/index.js
CHANGED
|
@@ -1,3 +1,203 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const oldToNewType = {
|
|
2
|
+
id: { type: 'string', format: 'basedId' },
|
|
3
|
+
int: { type: 'integer' },
|
|
4
|
+
url: { type: 'string', format: 'URL' },
|
|
5
|
+
email: { type: 'string', format: 'email' },
|
|
6
|
+
float: { type: 'number' },
|
|
7
|
+
phone: { type: 'string', format: 'mobilePhone' },
|
|
8
|
+
digest: { type: 'string', format: 'strongPassword' },
|
|
9
|
+
};
|
|
10
|
+
const newToOldType = {
|
|
11
|
+
mobilePhone: { type: 'phone' },
|
|
12
|
+
basedId: { type: 'id' },
|
|
13
|
+
integer: { type: 'int' },
|
|
14
|
+
URL: { type: 'url' },
|
|
15
|
+
email: { type: 'email' },
|
|
16
|
+
strongPassword: { type: 'digest' },
|
|
17
|
+
};
|
|
18
|
+
const convertNewToOldMeta = (props) => {
|
|
19
|
+
let meta;
|
|
20
|
+
for (const i in props) {
|
|
21
|
+
if (i[0] !== '$') {
|
|
22
|
+
const v = props[i];
|
|
23
|
+
meta ??= {};
|
|
24
|
+
if (i === 'display' && v === 'bytes') {
|
|
25
|
+
meta.format = v;
|
|
26
|
+
}
|
|
27
|
+
else if (i === 'title') {
|
|
28
|
+
meta.name = v;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
meta[i] = v;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return meta;
|
|
36
|
+
};
|
|
37
|
+
const convertOldToNewMeta = (props) => {
|
|
38
|
+
const meta = {};
|
|
39
|
+
for (const i in props) {
|
|
40
|
+
const v = props[i];
|
|
41
|
+
if (i === 'format' && v === 'bytes') {
|
|
42
|
+
meta.display = 'bytes';
|
|
43
|
+
}
|
|
44
|
+
else if (i === 'name') {
|
|
45
|
+
meta.title = v;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
meta[i] = v;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return meta;
|
|
52
|
+
};
|
|
53
|
+
const convertNewFieldToOldField = (newField) => {
|
|
54
|
+
// @ts-ignore
|
|
55
|
+
const { type, properties, values, items, ...props } = newField;
|
|
56
|
+
const meta = convertNewToOldMeta(props);
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
const overwrite = newToOldType[type] || newToOldType[props.format];
|
|
59
|
+
const oldField = overwrite
|
|
60
|
+
? { ...overwrite }
|
|
61
|
+
: {
|
|
62
|
+
type,
|
|
63
|
+
};
|
|
64
|
+
if (meta) {
|
|
65
|
+
oldField.meta = meta;
|
|
66
|
+
}
|
|
67
|
+
if (properties) {
|
|
68
|
+
// @ts-ignore
|
|
69
|
+
oldField.properties = {};
|
|
70
|
+
for (const key in properties) {
|
|
71
|
+
// @ts-ignore
|
|
72
|
+
oldField.properties[key] = convertNewFieldToOldField(properties[key]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (values) {
|
|
76
|
+
// @ts-ignore
|
|
77
|
+
oldField.values = convertNewFieldToOldField(values);
|
|
78
|
+
}
|
|
79
|
+
if (items) {
|
|
80
|
+
// @ts-ignore
|
|
81
|
+
oldField.items = convertNewFieldToOldField(items);
|
|
82
|
+
}
|
|
83
|
+
return oldField;
|
|
84
|
+
};
|
|
85
|
+
const convertNewTypeToOldType = (newType) => {
|
|
86
|
+
const { prefix, fields, ...props } = newType;
|
|
87
|
+
const oldType = {};
|
|
88
|
+
const meta = convertNewToOldMeta(props);
|
|
89
|
+
if (prefix) {
|
|
90
|
+
oldType.prefix = prefix;
|
|
91
|
+
}
|
|
92
|
+
if (meta) {
|
|
93
|
+
oldType.meta = meta;
|
|
94
|
+
}
|
|
95
|
+
if (fields) {
|
|
96
|
+
oldType.fields = {};
|
|
97
|
+
for (const key in fields) {
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
oldType.fields[key] = convertNewFieldToOldField(fields[key]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return oldType;
|
|
103
|
+
};
|
|
104
|
+
export const convertNewToOld = (newSchema) => {
|
|
105
|
+
const { root, types, language, translations, prefixToTypeMapping } = newSchema;
|
|
106
|
+
const oldSchema = {};
|
|
107
|
+
if (prefixToTypeMapping) {
|
|
108
|
+
oldSchema.prefixToTypeMapping = prefixToTypeMapping;
|
|
109
|
+
}
|
|
110
|
+
if (language) {
|
|
111
|
+
oldSchema.languages = [language];
|
|
112
|
+
}
|
|
113
|
+
if (translations) {
|
|
114
|
+
oldSchema.languages ??= [];
|
|
115
|
+
oldSchema.languages.push(...translations);
|
|
116
|
+
}
|
|
117
|
+
if (root) {
|
|
118
|
+
oldSchema.rootType = convertNewTypeToOldType(root);
|
|
119
|
+
}
|
|
120
|
+
if (types) {
|
|
121
|
+
oldSchema.types = {};
|
|
122
|
+
for (const key in types) {
|
|
123
|
+
oldSchema.types[key] = convertNewTypeToOldType(types[key]);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return oldSchema;
|
|
127
|
+
};
|
|
128
|
+
const convertOldFieldToNewField = (oldField) => {
|
|
129
|
+
// @ts-ignore
|
|
130
|
+
const { type, properties, values, items, meta = {} } = oldField;
|
|
131
|
+
const overwrite = oldToNewType[type] || oldToNewType[meta.format];
|
|
132
|
+
const newField = overwrite
|
|
133
|
+
? {
|
|
134
|
+
...overwrite,
|
|
135
|
+
...convertOldToNewMeta(meta),
|
|
136
|
+
}
|
|
137
|
+
: {
|
|
138
|
+
type,
|
|
139
|
+
...convertOldToNewMeta(meta),
|
|
140
|
+
};
|
|
141
|
+
if (properties) {
|
|
142
|
+
// @ts-ignore
|
|
143
|
+
newField.properties = {};
|
|
144
|
+
for (const key in properties) {
|
|
145
|
+
// @ts-ignore
|
|
146
|
+
newField.properties[key] = convertOldFieldToNewField(properties[key]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (values) {
|
|
150
|
+
// @ts-ignore
|
|
151
|
+
newField.values = convertOldFieldToNewField(values);
|
|
152
|
+
}
|
|
153
|
+
if (items) {
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
newField.items = convertOldFieldToNewField(items);
|
|
156
|
+
}
|
|
157
|
+
return newField;
|
|
158
|
+
};
|
|
159
|
+
const convertOldTypeToNewType = (oldType) => {
|
|
160
|
+
const { prefix, fields, meta } = oldType;
|
|
161
|
+
const newType = {
|
|
162
|
+
fields: {},
|
|
163
|
+
};
|
|
164
|
+
if (prefix) {
|
|
165
|
+
newType.prefix = prefix;
|
|
166
|
+
}
|
|
167
|
+
if (meta) {
|
|
168
|
+
Object.assign(newType, convertOldToNewMeta(meta));
|
|
169
|
+
}
|
|
170
|
+
if (fields) {
|
|
171
|
+
for (const key in fields) {
|
|
172
|
+
newType.fields[key] = convertOldFieldToNewField(fields[key]);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return newType;
|
|
176
|
+
};
|
|
177
|
+
export const convertOldToNew = (oldSchema) => {
|
|
178
|
+
const { rootType, types, languages, prefixToTypeMapping } = oldSchema;
|
|
179
|
+
const newSchema = {};
|
|
180
|
+
if (prefixToTypeMapping) {
|
|
181
|
+
newSchema.prefixToTypeMapping = prefixToTypeMapping;
|
|
182
|
+
}
|
|
183
|
+
if (languages?.length) {
|
|
184
|
+
// @ts-ignore
|
|
185
|
+
newSchema.language = languages[0];
|
|
186
|
+
const translations = languages.slice(1);
|
|
187
|
+
if (translations.length) {
|
|
188
|
+
// @ts-ignore
|
|
189
|
+
newSchema.translations = translations;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (rootType) {
|
|
193
|
+
newSchema.root = convertOldTypeToNewType(rootType);
|
|
194
|
+
}
|
|
195
|
+
if (types) {
|
|
196
|
+
newSchema.types = {};
|
|
197
|
+
for (const key in types) {
|
|
198
|
+
newSchema.types[key] = convertOldTypeToNewType(types[key]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return newSchema;
|
|
202
|
+
};
|
|
3
203
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { BasedSchema } from '../types.js';
|
|
2
1
|
import { BasedOldSchema } from './oldSchemaType.js';
|
|
3
|
-
|
|
2
|
+
import { BasedSchemaPartial } from '../types.js';
|
|
3
|
+
export declare const convertNewToOld: (schema: BasedSchemaPartial) => Partial<BasedOldSchema>;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// import { BasedSchema } from '../types.js'
|
|
2
|
-
// import { BasedOldSchema } from './oldSchemaType.js'
|
|
3
1
|
const metaChecker = (field) => {
|
|
4
2
|
return (field === 'validation' ||
|
|
5
3
|
// field === 'format' ||
|
|
@@ -35,9 +33,6 @@ const metaChecker = (field) => {
|
|
|
35
33
|
field === '$delete' ||
|
|
36
34
|
field === 'display');
|
|
37
35
|
};
|
|
38
|
-
const excludedFields = (field) => {
|
|
39
|
-
return field === 'language' || field === 'translations' || field === '$defs';
|
|
40
|
-
};
|
|
41
36
|
const DEFAULT_FIELDS = {
|
|
42
37
|
// id: { type: 'string' },
|
|
43
38
|
// createdAt: { type: 'timestamp' },
|
|
@@ -67,7 +62,7 @@ const metaParser = (obj) => {
|
|
|
67
62
|
}
|
|
68
63
|
}
|
|
69
64
|
}
|
|
70
|
-
return Object.keys(
|
|
65
|
+
return Object.keys(tmp).length > 0 ? { meta: tmp } : null;
|
|
71
66
|
};
|
|
72
67
|
const migrateField = (field) => {
|
|
73
68
|
if (field?.type === 'object') {
|
|
@@ -180,9 +175,11 @@ const migrateTypes = (oldSchema) => {
|
|
|
180
175
|
const type = oldSchema.types[key];
|
|
181
176
|
result.types[key] = {
|
|
182
177
|
...metaParser(type),
|
|
183
|
-
prefix: type.prefix,
|
|
184
178
|
fields: migrateFields(type.fields),
|
|
185
179
|
};
|
|
180
|
+
if (type.prefix) {
|
|
181
|
+
result.types[key].prefix = type.prefix;
|
|
182
|
+
}
|
|
186
183
|
}
|
|
187
184
|
}
|
|
188
185
|
return result;
|
|
@@ -204,8 +201,16 @@ const convertRoot = (schema) => {
|
|
|
204
201
|
};
|
|
205
202
|
export const convertNewToOld = (schema) => {
|
|
206
203
|
const tmpSchema = migrateTypes(schema);
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
if (schema.prefixToTypeMapping) {
|
|
205
|
+
tmpSchema.prefixToTypeMapping = schema.prefixToTypeMapping;
|
|
206
|
+
}
|
|
207
|
+
tmpSchema.languages = [];
|
|
208
|
+
if (schema.language) {
|
|
209
|
+
tmpSchema.languages.push(schema.language);
|
|
210
|
+
}
|
|
211
|
+
if (schema.translations) {
|
|
212
|
+
tmpSchema.languages.push(...schema.translations);
|
|
213
|
+
}
|
|
209
214
|
tmpSchema.rootType = convertRoot(schema);
|
|
210
215
|
delete tmpSchema.root;
|
|
211
216
|
return tmpSchema;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type FieldType = 'float' | 'boolean' | 'number' | 'int' | 'string' | 'text' | 'id' | 'digest' | 'url' | 'email' | 'phone' | 'geo' | 'type' | 'timestamp';
|
|
2
|
-
type FieldSchemaObject = {
|
|
2
|
+
export type FieldSchemaObject = {
|
|
3
3
|
type: 'object';
|
|
4
4
|
properties: {
|
|
5
5
|
[key: string]: FieldSchema;
|
|
@@ -34,13 +34,37 @@ type FieldSchemaOther = {
|
|
|
34
34
|
meta?: any;
|
|
35
35
|
timeseries?: boolean;
|
|
36
36
|
};
|
|
37
|
-
type FieldSchemaArrayLike = {
|
|
37
|
+
export type FieldSchemaArrayLike = {
|
|
38
38
|
type: 'set' | 'array';
|
|
39
39
|
items: FieldSchema;
|
|
40
40
|
meta?: any;
|
|
41
41
|
timeseries?: boolean;
|
|
42
42
|
};
|
|
43
|
-
type FieldSchema = FieldSchemaObject | FieldSchemaRecord | FieldSchemaArrayLike | FieldSchemaJson | FieldSchemaReferences | FieldSchemaOther;
|
|
43
|
+
export type FieldSchema = FieldSchemaObject | FieldSchemaRecord | FieldSchemaArrayLike | FieldSchemaJson | FieldSchemaReferences | FieldSchemaOther;
|
|
44
|
+
type FieldInputSchemaArrayLike = {
|
|
45
|
+
type: 'set' | 'array';
|
|
46
|
+
items: FieldInputSchema;
|
|
47
|
+
meta?: any;
|
|
48
|
+
timeseries?: boolean;
|
|
49
|
+
};
|
|
50
|
+
type FieldInputSchemaRecord = {
|
|
51
|
+
type: 'record';
|
|
52
|
+
values: FieldInputSchema;
|
|
53
|
+
meta?: any;
|
|
54
|
+
timeseries?: boolean;
|
|
55
|
+
};
|
|
56
|
+
export type FieldInputSchemaObject = {
|
|
57
|
+
type: 'object';
|
|
58
|
+
properties: {
|
|
59
|
+
[key: string]: FieldInputSchema;
|
|
60
|
+
};
|
|
61
|
+
meta?: any;
|
|
62
|
+
timeseries?: boolean;
|
|
63
|
+
};
|
|
64
|
+
type FieldInputSchema = FieldSchema | FieldInputSchemaArrayLike | FieldInputSchemaRecord | FieldInputSchemaObject | DeleteField;
|
|
65
|
+
type DeleteField = {
|
|
66
|
+
$delete: boolean;
|
|
67
|
+
};
|
|
44
68
|
type Fields = Record<string, FieldSchema>;
|
|
45
69
|
type HierarchySchema = false | {
|
|
46
70
|
[key: string]: false | {
|
|
@@ -49,7 +73,7 @@ type HierarchySchema = false | {
|
|
|
49
73
|
includeAncestryWith: string[];
|
|
50
74
|
};
|
|
51
75
|
};
|
|
52
|
-
type TypeSchema = {
|
|
76
|
+
export type TypeSchema = {
|
|
53
77
|
prefix?: string;
|
|
54
78
|
hierarchy?: HierarchySchema;
|
|
55
79
|
fields?: Fields;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { BasedSchema } from '../types.js';
|
|
2
2
|
import { BasedOldSchema } from './oldSchemaType.js';
|
|
3
|
-
export declare const convertOldToNew: (oldSchema: BasedOldSchema) => BasedSchema;
|
|
3
|
+
export declare const convertOldToNew: (oldSchema: Partial<BasedOldSchema>) => BasedSchema;
|
|
@@ -20,13 +20,13 @@ const parseArray = async (args, value, idx = 0) => {
|
|
|
20
20
|
const fromValue = Array.isArray(value) ? value : [value];
|
|
21
21
|
const q = [];
|
|
22
22
|
const arr = new Array(fromValue.length);
|
|
23
|
-
const collectNested = ['object', 'record', 'text'].includes(args.fieldSchema.
|
|
23
|
+
const collectNested = ['object', 'record', 'text'].includes(args.fieldSchema.items.type);
|
|
24
24
|
const collected = [];
|
|
25
25
|
for (let i = 0; i < fromValue.length; i++) {
|
|
26
26
|
q.push(args.parse({
|
|
27
27
|
key: i + idx,
|
|
28
28
|
value: fromValue[i],
|
|
29
|
-
fieldSchema: args.fieldSchema.
|
|
29
|
+
fieldSchema: args.fieldSchema.items,
|
|
30
30
|
collect: (nArgs) => {
|
|
31
31
|
const p = nArgs.path.slice(args.path.length);
|
|
32
32
|
// @ts-ignore
|
|
@@ -77,7 +77,7 @@ const operations = {
|
|
|
77
77
|
await args.parse({
|
|
78
78
|
key: value.$assign.$idx,
|
|
79
79
|
value: value.$assign.$value,
|
|
80
|
-
fieldSchema: args.fieldSchema.
|
|
80
|
+
fieldSchema: args.fieldSchema.items,
|
|
81
81
|
});
|
|
82
82
|
},
|
|
83
83
|
};
|
|
@@ -95,7 +95,7 @@ export const array = async (args) => {
|
|
|
95
95
|
q.push(args.parse({
|
|
96
96
|
key: i,
|
|
97
97
|
value: args.value[i],
|
|
98
|
-
fieldSchema: args.fieldSchema.
|
|
98
|
+
fieldSchema: args.fieldSchema.items,
|
|
99
99
|
}));
|
|
100
100
|
}
|
|
101
101
|
await Promise.all(q);
|
package/dist/src/types.d.ts
CHANGED
|
@@ -114,7 +114,7 @@ export type BasedSchemaFieldRecord = {
|
|
|
114
114
|
} & BasedSchemaFieldShared;
|
|
115
115
|
export type BasedSchemaFieldArray = {
|
|
116
116
|
type: 'array';
|
|
117
|
-
|
|
117
|
+
items: BasedSchemaField;
|
|
118
118
|
} & BasedSchemaFieldShared;
|
|
119
119
|
export type BasedSchemaFieldSet = {
|
|
120
120
|
type: 'set';
|
|
@@ -4,7 +4,7 @@ import { basedSchemaDateFormats } from '../display/timestamp.js';
|
|
|
4
4
|
import { ParseError } from '../error.js';
|
|
5
5
|
import { basedSchemaFieldTypes, basedSchemaStringFormatValues, languages, } from '../types.js';
|
|
6
6
|
import { validate } from './index.js';
|
|
7
|
-
import { mustBeBidirectional, mustBeBoolean, mustBeNumber, mustBeString, mustBeStringArray, } from './utils.js';
|
|
7
|
+
import { mustBeArray, mustBeBidirectional, mustBeBoolean, mustBeNumber, mustBeString, mustBeStringArray, } from './utils.js';
|
|
8
8
|
export const mustBeField = (value, path, newSchema, oldSchema, options) => {
|
|
9
9
|
if (!(typeof value === 'object' && !Array.isArray(value))) {
|
|
10
10
|
return [
|
|
@@ -14,7 +14,7 @@ export const mustBeField = (value, path, newSchema, oldSchema, options) => {
|
|
|
14
14
|
},
|
|
15
15
|
];
|
|
16
16
|
}
|
|
17
|
-
const type = value.type;
|
|
17
|
+
const type = value.hasOwnProperty('enum') ? 'enum' : value.type;
|
|
18
18
|
if ((options?.limitTo === 'primitives' &&
|
|
19
19
|
![
|
|
20
20
|
'string',
|
|
@@ -75,6 +75,12 @@ export const mustBeField = (value, path, newSchema, oldSchema, options) => {
|
|
|
75
75
|
case 'set':
|
|
76
76
|
validator = basedSchemaFieldSetValidator;
|
|
77
77
|
break;
|
|
78
|
+
case 'reference':
|
|
79
|
+
validator = basedSchemaFieldReferenceValidator;
|
|
80
|
+
break;
|
|
81
|
+
case 'references':
|
|
82
|
+
validator = basedSchemaFieldReferencesValidator;
|
|
83
|
+
break;
|
|
78
84
|
default:
|
|
79
85
|
validator = basedSchemaFieldSharedValidator;
|
|
80
86
|
break;
|
|
@@ -214,7 +220,9 @@ export const basedSchemaStringValidator = {
|
|
|
214
220
|
};
|
|
215
221
|
export const basedSchemaFieldEnumValidator = {
|
|
216
222
|
...basedSchemaFieldSharedValidator,
|
|
217
|
-
enum: {
|
|
223
|
+
enum: {
|
|
224
|
+
validator: mustBeArray,
|
|
225
|
+
},
|
|
218
226
|
};
|
|
219
227
|
export const basedSchemaFieldCardinalityValidator = {
|
|
220
228
|
...basedSchemaFieldSharedValidator,
|
|
@@ -313,7 +321,7 @@ export const basedSchemaFieldRecordValidator = {
|
|
|
313
321
|
};
|
|
314
322
|
export const basedSchemaFieldArrayValidator = {
|
|
315
323
|
...basedSchemaFieldSharedValidator,
|
|
316
|
-
|
|
324
|
+
items: {
|
|
317
325
|
validator: mustBeField,
|
|
318
326
|
},
|
|
319
327
|
};
|
|
@@ -3,6 +3,10 @@ export declare const mustBeString: (value: string, path: string[]) => {
|
|
|
3
3
|
code: ParseError;
|
|
4
4
|
path: string[];
|
|
5
5
|
}[];
|
|
6
|
+
export declare const mustBeArray: (value: string[], path: string[]) => {
|
|
7
|
+
code: ParseError;
|
|
8
|
+
path: string[];
|
|
9
|
+
}[];
|
|
6
10
|
export declare const mustBeStringArray: (value: string[], path: string[]) => {
|
|
7
11
|
code: ParseError;
|
|
8
12
|
path: string[];
|
|
@@ -7,6 +7,14 @@ export const mustBeString = (value, path) => typeof value === 'string'
|
|
|
7
7
|
path,
|
|
8
8
|
},
|
|
9
9
|
];
|
|
10
|
+
export const mustBeArray = (value, path) => Array.isArray(value)
|
|
11
|
+
? []
|
|
12
|
+
: [
|
|
13
|
+
{
|
|
14
|
+
code: ParseError.incorrectFormat,
|
|
15
|
+
path,
|
|
16
|
+
},
|
|
17
|
+
];
|
|
10
18
|
export const mustBeStringArray = (value, path) => Array.isArray(value) && value.every((i) => typeof i === 'string')
|
|
11
19
|
? []
|
|
12
20
|
: [
|
package/dist/test/array.js
CHANGED
|
@@ -8,13 +8,13 @@ const schema = {
|
|
|
8
8
|
fields: {
|
|
9
9
|
arrNum: {
|
|
10
10
|
type: 'array',
|
|
11
|
-
|
|
11
|
+
items: {
|
|
12
12
|
type: 'number',
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
15
|
objArray: {
|
|
16
16
|
type: 'array',
|
|
17
|
-
|
|
17
|
+
items: {
|
|
18
18
|
type: 'object',
|
|
19
19
|
properties: {
|
|
20
20
|
snurp: {
|
|
@@ -25,13 +25,13 @@ const schema = {
|
|
|
25
25
|
},
|
|
26
26
|
arrStr: {
|
|
27
27
|
type: 'array',
|
|
28
|
-
|
|
28
|
+
items: {
|
|
29
29
|
type: 'string',
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
intarray: {
|
|
33
33
|
type: 'array',
|
|
34
|
-
|
|
34
|
+
items: {
|
|
35
35
|
type: 'integer',
|
|
36
36
|
},
|
|
37
37
|
},
|
package/dist/test/compat.js
CHANGED
|
@@ -1,15 +1,51 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
|
-
|
|
2
|
+
import { newSchemas } from './data/newSchemas.js';
|
|
3
3
|
import { oldSchemas } from './data/oldSchemas.js';
|
|
4
4
|
import { convertNewToOld, convertOldToNew, validateSchema, } from '../src/index.js';
|
|
5
|
+
const addStandardMetaToOld = (obj) => {
|
|
6
|
+
if (obj && typeof obj === 'object') {
|
|
7
|
+
if (obj.type === 'id') {
|
|
8
|
+
obj.meta ??= {};
|
|
9
|
+
obj.meta.format = 'basedId';
|
|
10
|
+
}
|
|
11
|
+
else if (obj.type === 'email') {
|
|
12
|
+
obj.meta ??= {};
|
|
13
|
+
obj.meta.format = 'email';
|
|
14
|
+
}
|
|
15
|
+
else if (obj.type === 'digest') {
|
|
16
|
+
obj.meta ??= {};
|
|
17
|
+
obj.meta.format = 'strongPassword';
|
|
18
|
+
}
|
|
19
|
+
else if (obj.type === 'url') {
|
|
20
|
+
obj.meta ??= {};
|
|
21
|
+
obj.meta.format = 'URL';
|
|
22
|
+
}
|
|
23
|
+
else if (obj.type === 'phone') {
|
|
24
|
+
obj.meta ??= {};
|
|
25
|
+
obj.meta.format = 'mobilePhone';
|
|
26
|
+
}
|
|
27
|
+
for (const i in obj) {
|
|
28
|
+
addStandardMetaToOld(obj[i]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
5
32
|
test('old schema compat mode', async (t) => {
|
|
6
33
|
for (let i = 0; i < oldSchemas.length - 1; i++) {
|
|
7
|
-
// for (let i = 0; i < 1; i++) {
|
|
8
34
|
const oldSchema = oldSchemas[i];
|
|
9
35
|
const newSchema = convertOldToNew(oldSchema);
|
|
10
36
|
const validation = await validateSchema(newSchema);
|
|
11
37
|
t.true(validation.valid);
|
|
38
|
+
addStandardMetaToOld(oldSchema);
|
|
12
39
|
t.deepEqual(oldSchema, convertNewToOld(newSchema), `Schema conversion oldSchemas index ${i}`);
|
|
13
40
|
}
|
|
14
41
|
});
|
|
42
|
+
test('new schema compat mode', async (t) => {
|
|
43
|
+
for (let i = 0; i < newSchemas.length - 1; i++) {
|
|
44
|
+
const newSchema = newSchemas[i];
|
|
45
|
+
const validation = await validateSchema(newSchema);
|
|
46
|
+
const oldSchema = convertNewToOld(newSchema);
|
|
47
|
+
t.true(validation.valid);
|
|
48
|
+
t.deepEqual(newSchema, convertOldToNew(oldSchema), `Schema conversion newSchemas index ${i}`);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
15
51
|
//# sourceMappingURL=compat.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const newSchemas:
|
|
1
|
+
import { BasedSchemaPartial } from '../../src/types.js';
|
|
2
|
+
export declare const newSchemas: BasedSchemaPartial[];
|