@firecms/schema_inference 3.0.0-canary.80 → 3.0.0-canary.82

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/index.es.js CHANGED
@@ -1,282 +1,432 @@
1
- import { unslugify as O, resolveEnumValues as T, mergeDeep as j } from "@firecms/core";
2
- import { DocumentReference as C } from "@firebase/firestore";
3
- function b(r) {
4
- if (!r) return;
5
- function e(n) {
6
- return typeof n == "string" ? n : n instanceof C ? n.path : void 0;
1
+ import { unslugify, resolveEnumValues, mergeDeep } from "@firecms/core";
2
+ import { DocumentReference } from "@firebase/firestore";
3
+ function findCommonInitialStringInPath(valuesCount) {
4
+ if (!valuesCount) return void 0;
5
+ function getPath(value) {
6
+ if (typeof value === "string") return value;
7
+ else if (value instanceof DocumentReference) return value.path;
8
+ else return void 0;
7
9
  }
8
- const s = r.values.map((n) => e(n)).filter((n) => !!n).find((n) => n.includes("/"));
9
- if (!s)
10
- return;
11
- const i = s.substr(0, s.lastIndexOf("/"));
12
- return r.values.filter((n) => {
13
- const a = e(n);
14
- return a ? a.startsWith(i) : !1;
15
- }).length > r.values.length / 3 * 2 ? i : void 0;
10
+ const strings = valuesCount.values.map((v) => getPath(v)).filter((v) => !!v);
11
+ const pathWithSlash = strings.find((s) => s.includes("/"));
12
+ if (!pathWithSlash)
13
+ return void 0;
14
+ const searchedPath = pathWithSlash.substr(0, pathWithSlash.lastIndexOf("/"));
15
+ const yep = valuesCount.values.filter((value) => {
16
+ const path = getPath(value);
17
+ if (!path) return false;
18
+ return path.startsWith(searchedPath);
19
+ }).length > valuesCount.values.length / 3 * 2;
20
+ return yep ? searchedPath : void 0;
16
21
  }
17
- function d(r) {
18
- if (!Array.isArray(r))
22
+ function extractEnumFromValues(values) {
23
+ if (!Array.isArray(values)) {
19
24
  return [];
20
- const e = r.map((t) => typeof t == "string" ? { id: t, label: O(t) } : null).filter(Boolean);
21
- return e.sort((t, s) => t.label.localeCompare(s.label)), e;
25
+ }
26
+ const enumValues = values.map((value) => {
27
+ if (typeof value === "string") {
28
+ return { id: value, label: unslugify(value) };
29
+ } else
30
+ return null;
31
+ }).filter(Boolean);
32
+ enumValues.sort((a, b) => a.label.localeCompare(b.label));
33
+ return enumValues;
22
34
  }
23
- const P = [".jpg", ".jpeg", ".png", ".webp", ".gif", ".avif"], S = [".mp3", ".ogg", ".opus", ".aac"], I = [".avi", ".mp4"], M = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
24
- function w({
25
- totalDocsCount: r,
26
- valuesResult: e
35
+ const IMAGE_EXTENSIONS = [".jpg", ".jpeg", ".png", ".webp", ".gif", ".avif"];
36
+ const AUDIO_EXTENSIONS = [".mp3", ".ogg", ".opus", ".aac"];
37
+ const VIDEO_EXTENSIONS = [".avi", ".mp4"];
38
+ const emailRegEx = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
39
+ function buildStringProperty({
40
+ totalDocsCount,
41
+ valuesResult
27
42
  }) {
28
- let t = {
43
+ let stringProperty = {
29
44
  dataType: "string"
30
45
  };
31
- if (e) {
32
- const s = e.values.length, i = Array.from(e.valuesCount.keys()).length, o = {}, n = e.values.filter((f) => typeof f == "string" && f.toString().startsWith("http")).length > r / 3 * 2;
33
- n && (o.url = !0);
34
- const a = e.values.filter((f) => typeof f == "string" && M.test(f)).length > r / 3 * 2;
35
- a && (o.email = !0);
36
- const c = e.values.filter((f) => typeof f == "string" && f.length === 28 && !f.includes(" ")).length > r / 3 * 2;
37
- if (c && (o.readOnly = !0), !a && !n && !c && !n && i < s / 3) {
38
- const f = d(Array.from(e.valuesCount.keys()));
39
- Object.keys(f).length > 1 && (o.enumValues = f);
46
+ if (valuesResult) {
47
+ const totalEntriesCount = valuesResult.values.length;
48
+ const totalValues = Array.from(valuesResult.valuesCount.keys()).length;
49
+ const config = {};
50
+ const probablyAURL = valuesResult.values.filter((value) => typeof value === "string" && value.toString().startsWith("http")).length > totalDocsCount / 3 * 2;
51
+ if (probablyAURL) {
52
+ config.url = true;
40
53
  }
41
- if (!a && !n && !c && !n && !o.enumValues) {
42
- const f = z(e, r);
43
- f && (o.storage = {
44
- acceptedFiles: [f],
45
- storagePath: b(e) ?? "/"
46
- });
54
+ const probablyAnEmail = valuesResult.values.filter((value) => typeof value === "string" && emailRegEx.test(value)).length > totalDocsCount / 3 * 2;
55
+ if (probablyAnEmail) {
56
+ config.email = true;
47
57
  }
48
- Object.keys(o).length > 0 && (t = {
49
- ...t,
50
- ...o,
51
- editable: !0
52
- });
58
+ const probablyUserIds = valuesResult.values.filter((value) => typeof value === "string" && value.length === 28 && !value.includes(" ")).length > totalDocsCount / 3 * 2;
59
+ if (probablyUserIds)
60
+ config.readOnly = true;
61
+ if (!probablyAnEmail && !probablyAURL && !probablyUserIds && !probablyAURL && totalValues < totalEntriesCount / 3) {
62
+ const enumValues = extractEnumFromValues(Array.from(valuesResult.valuesCount.keys()));
63
+ if (Object.keys(enumValues).length > 1)
64
+ config.enumValues = enumValues;
65
+ }
66
+ if (!probablyAnEmail && !probablyAURL && !probablyUserIds && !probablyAURL && !config.enumValues) {
67
+ const fileType = probableFileType(valuesResult, totalDocsCount);
68
+ if (fileType) {
69
+ config.storage = {
70
+ acceptedFiles: [fileType],
71
+ storagePath: findCommonInitialStringInPath(valuesResult) ?? "/"
72
+ };
73
+ }
74
+ }
75
+ if (Object.keys(config).length > 0)
76
+ stringProperty = {
77
+ ...stringProperty,
78
+ ...config,
79
+ editable: true
80
+ };
53
81
  }
54
- return t;
82
+ return stringProperty;
55
83
  }
56
- function z(r, e) {
57
- const t = r.values.filter((n) => typeof n == "string" && P.some((a) => n.toString().endsWith(a))).length > e / 3 * 2, s = r.values.filter((n) => typeof n == "string" && S.some((a) => n.toString().endsWith(a))).length > e / 3 * 2, i = r.values.filter((n) => typeof n == "string" && I.some((a) => n.toString().endsWith(a))).length > e / 3 * 2;
58
- return t ? "image/*" : s ? "audio/*" : i ? "video/*" : !1;
84
+ function probableFileType(valuesCount, totalDocsCount) {
85
+ const probablyAnImage = valuesCount.values.filter((value) => typeof value === "string" && IMAGE_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;
86
+ const probablyAudio = valuesCount.values.filter((value) => typeof value === "string" && AUDIO_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;
87
+ const probablyVideo = valuesCount.values.filter((value) => typeof value === "string" && VIDEO_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;
88
+ const fileType = probablyAnImage ? "image/*" : probablyAudio ? "audio/*" : probablyVideo ? "video/*" : false;
89
+ return fileType;
59
90
  }
60
- function F({
61
- totalDocsCount: r,
62
- valuesResult: e
91
+ function buildValidation({
92
+ totalDocsCount,
93
+ valuesResult
63
94
  }) {
64
- if (e) {
65
- const t = e.values.length;
66
- if (r === t)
95
+ if (valuesResult) {
96
+ const totalEntriesCount = valuesResult.values.length;
97
+ if (totalDocsCount === totalEntriesCount)
67
98
  return {
68
- required: !0
99
+ required: true
69
100
  };
70
101
  }
102
+ return void 0;
71
103
  }
72
- function _({
73
- totalDocsCount: r,
74
- valuesResult: e
104
+ function buildReferenceProperty({
105
+ totalDocsCount,
106
+ valuesResult
75
107
  }) {
76
- return {
108
+ const property = {
77
109
  dataType: "reference",
78
- path: b(e) ?? "!!!FIX_ME!!!",
79
- editable: !0
110
+ path: findCommonInitialStringInPath(valuesResult) ?? "!!!FIX_ME!!!",
111
+ editable: true
80
112
  };
113
+ return property;
81
114
  }
82
- async function k(r, e) {
83
- const t = {}, s = {};
84
- return r && r.forEach((i) => {
85
- i && Object.entries(i).forEach(([o, n]) => {
86
- u(t, o, n, e), m(s, o, n, e);
115
+ async function buildEntityPropertiesFromData(data, getType) {
116
+ const typesCount = {};
117
+ const valuesCount = {};
118
+ if (data) {
119
+ data.forEach((entry) => {
120
+ if (entry) {
121
+ Object.entries(entry).forEach(([key, value]) => {
122
+ increaseMapTypeCount(typesCount, key, value, getType);
123
+ increaseValuesCount(valuesCount, key, value, getType);
124
+ });
125
+ }
87
126
  });
88
- }), A(r.length, t, s);
127
+ }
128
+ return buildPropertiesFromCount(data.length, typesCount, valuesCount);
89
129
  }
90
- function L(r, e, t) {
91
- const s = {}, i = {};
92
- r && r.forEach((a) => {
93
- p(e.dataType, s, a, t), m(i, "inferred_prop", a, t);
94
- });
95
- const o = "enumValues" in e ? T(e.enumValues) : void 0;
96
- if (o) {
97
- const a = d(Array.from(i.inferred_prop.valuesCount.keys()));
130
+ function buildPropertyFromData(data, property, getType) {
131
+ const typesCount = {};
132
+ const valuesCount = {};
133
+ if (data) {
134
+ data.forEach((entry) => {
135
+ increaseTypeCount(property.dataType, typesCount, entry, getType);
136
+ increaseValuesCount(valuesCount, "inferred_prop", entry, getType);
137
+ });
138
+ }
139
+ const enumValues = "enumValues" in property ? resolveEnumValues(property["enumValues"]) : void 0;
140
+ if (enumValues) {
141
+ const newEnumValues = extractEnumFromValues(Array.from(valuesCount["inferred_prop"].valuesCount.keys()));
98
142
  return {
99
- ...e,
100
- enumValues: [...a, ...o]
143
+ ...property,
144
+ enumValues: [...newEnumValues, ...enumValues]
101
145
  };
102
146
  }
103
- const n = y(
147
+ const generatedProperty = buildPropertyFromCount(
104
148
  "inferred_prop",
105
- r.length,
106
- e.dataType,
107
- s,
108
- i.inferred_prop
149
+ data.length,
150
+ property.dataType,
151
+ typesCount,
152
+ valuesCount["inferred_prop"]
109
153
  );
110
- return j(n, e);
154
+ return mergeDeep(generatedProperty, property);
111
155
  }
112
- function U(r, e, t) {
113
- const s = (t ?? []).map((n) => n.toLowerCase());
114
- function i(n) {
115
- const a = n.toLowerCase();
116
- return s.includes(a) ? 4 : a === "title" || a === "name" ? 3 : a.includes("title") || a.includes("name") ? 2 : a.includes("image") || a.includes("picture") ? 1 : 0;
156
+ function buildPropertiesOrder(properties, propertiesOrder, priorityKeys) {
157
+ const lowerCasePriorityKeys = (priorityKeys ?? []).map((key) => key.toLowerCase());
158
+ function propOrder(s) {
159
+ const k = s.toLowerCase();
160
+ if (lowerCasePriorityKeys.includes(k)) return 4;
161
+ if (k === "title" || k === "name") return 3;
162
+ if (k.includes("title") || k.includes("name")) return 2;
163
+ if (k.includes("image") || k.includes("picture")) return 1;
164
+ return 0;
117
165
  }
118
- const o = e ?? Object.keys(r);
119
- return o.sort(), o.sort((n, a) => i(a) - i(n)), o;
166
+ const keys = propertiesOrder ?? Object.keys(properties);
167
+ keys.sort();
168
+ keys.sort((a, b) => {
169
+ return propOrder(b) - propOrder(a);
170
+ });
171
+ return keys;
120
172
  }
121
- function p(r, e, t, s) {
122
- if (r === "map") {
123
- if (t) {
124
- let i = e[r];
125
- i || (i = {}, e[r] = i), Object.entries(t).forEach(([o, n]) => {
126
- u(i, o, n, s);
173
+ function increaseTypeCount(type, typesCount, fieldValue, getType) {
174
+ if (type === "map") {
175
+ if (fieldValue) {
176
+ let mapTypesCount = typesCount[type];
177
+ if (!mapTypesCount) {
178
+ mapTypesCount = {};
179
+ typesCount[type] = mapTypesCount;
180
+ }
181
+ Object.entries(fieldValue).forEach(([key, value]) => {
182
+ increaseMapTypeCount(mapTypesCount, key, value, getType);
127
183
  });
128
184
  }
129
- } else if (r === "array") {
130
- let i = e[r];
131
- if (i || (i = {}, e[r] = i), t && Array.isArray(t) && t.length > 0) {
132
- const o = x(t, s);
133
- if (o === "map") {
134
- let n = i[o];
135
- n || (n = {}), t.forEach((a) => {
136
- Object.entries(a).forEach(
137
- ([c, f]) => u(n, c, f, s)
185
+ } else if (type === "array") {
186
+ let arrayTypesCount = typesCount[type];
187
+ if (!arrayTypesCount) {
188
+ arrayTypesCount = {};
189
+ typesCount[type] = arrayTypesCount;
190
+ }
191
+ if (fieldValue && Array.isArray(fieldValue) && fieldValue.length > 0) {
192
+ const arrayType = getMostProbableTypeInArray(fieldValue, getType);
193
+ if (arrayType === "map") {
194
+ let mapTypesCount = arrayTypesCount[arrayType];
195
+ if (!mapTypesCount) {
196
+ mapTypesCount = {};
197
+ }
198
+ fieldValue.forEach((value) => {
199
+ Object.entries(value).forEach(
200
+ ([key, v]) => increaseMapTypeCount(mapTypesCount, key, v, getType)
138
201
  );
139
- }), i[o] = n;
140
- } else
141
- i[o] ? i[o]++ : i[o] = 1;
202
+ });
203
+ arrayTypesCount[arrayType] = mapTypesCount;
204
+ } else {
205
+ if (!arrayTypesCount[arrayType]) arrayTypesCount[arrayType] = 1;
206
+ else arrayTypesCount[arrayType]++;
207
+ }
142
208
  }
143
- } else
144
- e[r] ? e[r]++ : e[r] = 1;
209
+ } else {
210
+ if (!typesCount[type]) typesCount[type] = 1;
211
+ else typesCount[type]++;
212
+ }
145
213
  }
146
- function u(r, e, t, s) {
147
- let i = r[e];
148
- if (i || (i = {}, r[e] = i), t != null) {
149
- const o = s(t);
150
- p(o, i, t, s);
214
+ function increaseMapTypeCount(typesCountRecord, key, fieldValue, getType) {
215
+ let typesCount = typesCountRecord[key];
216
+ if (!typesCount) {
217
+ typesCount = {};
218
+ typesCountRecord[key] = typesCount;
219
+ }
220
+ if (fieldValue != null) {
221
+ const type = getType(fieldValue);
222
+ increaseTypeCount(type, typesCount, fieldValue, getType);
151
223
  }
152
224
  }
153
- function m(r, e, t, s) {
154
- const i = s(t);
155
- let o = r[e];
156
- if (o || (o = {
157
- values: [],
158
- valuesCount: /* @__PURE__ */ new Map()
159
- }, r[e] = o), i === "map") {
160
- let n = o.map;
161
- n || (n = {}, o.map = n), t && Object.entries(t).forEach(
162
- ([a, c]) => m(n, a, c, s)
163
- );
164
- } else i === "array" ? Array.isArray(t) && t.forEach((n) => {
165
- o.values.push(n), o.valuesCount.set(n, (o.valuesCount.get(n) ?? 0) + 1);
166
- }) : t && (o.values.push(t), o.valuesCount.set(t, (o.valuesCount.get(t) ?? 0) + 1));
225
+ function increaseValuesCount(typeValuesRecord, key, fieldValue, getType) {
226
+ const dataType = getType(fieldValue);
227
+ let valuesRecord = typeValuesRecord[key];
228
+ if (!valuesRecord) {
229
+ valuesRecord = {
230
+ values: [],
231
+ valuesCount: /* @__PURE__ */ new Map()
232
+ };
233
+ typeValuesRecord[key] = valuesRecord;
234
+ }
235
+ if (dataType === "map") {
236
+ let mapValuesRecord = valuesRecord.map;
237
+ if (!mapValuesRecord) {
238
+ mapValuesRecord = {};
239
+ valuesRecord.map = mapValuesRecord;
240
+ }
241
+ if (fieldValue)
242
+ Object.entries(fieldValue).forEach(
243
+ ([key2, value]) => increaseValuesCount(mapValuesRecord, key2, value, getType)
244
+ );
245
+ } else if (dataType === "array") {
246
+ if (Array.isArray(fieldValue)) {
247
+ fieldValue.forEach((value) => {
248
+ valuesRecord.values.push(value);
249
+ valuesRecord.valuesCount.set(value, (valuesRecord.valuesCount.get(value) ?? 0) + 1);
250
+ });
251
+ }
252
+ } else {
253
+ if (fieldValue) {
254
+ valuesRecord.values.push(fieldValue);
255
+ valuesRecord.valuesCount.set(fieldValue, (valuesRecord.valuesCount.get(fieldValue) ?? 0) + 1);
256
+ }
257
+ }
167
258
  }
168
- function h(r) {
169
- let e = 0;
170
- return Object.entries(r).forEach(([t, s]) => {
171
- let i = 0;
172
- t === "map" ? i = E(s) : t === "array" ? i = h(s) : i = s, i > e && (e = i);
173
- }), e;
259
+ function getHighestTypesCount(typesCount) {
260
+ let highestCount = 0;
261
+ Object.entries(typesCount).forEach(([type, count]) => {
262
+ let countValue = 0;
263
+ if (type === "map") {
264
+ countValue = getHighestRecordCount(count);
265
+ } else if (type === "array") {
266
+ countValue = getHighestTypesCount(count);
267
+ } else {
268
+ countValue = count;
269
+ }
270
+ if (countValue > highestCount) {
271
+ highestCount = countValue;
272
+ }
273
+ });
274
+ return highestCount;
174
275
  }
175
- function E(r) {
176
- return Object.entries(r).map(([e, t]) => h(t)).reduce((e, t) => Math.max(e, t), 0);
276
+ function getHighestRecordCount(record) {
277
+ return Object.entries(record).map(([key, typesCount]) => getHighestTypesCount(typesCount)).reduce((a, b) => Math.max(a, b), 0);
177
278
  }
178
- function g(r) {
179
- let e = -1, t = "string";
180
- return Object.entries(r).forEach(([s, i]) => {
181
- let o;
182
- s === "map" ? o = E(i) : s === "array" ? o = h(i) : o = i, o > e && (e = o, t = s);
183
- }), t;
279
+ function getMostProbableType(typesCount) {
280
+ let highestCount = -1;
281
+ let probableType = "string";
282
+ Object.entries(typesCount).forEach(([type, count]) => {
283
+ let countValue;
284
+ if (type === "map") {
285
+ countValue = getHighestRecordCount(count);
286
+ } else if (type === "array") {
287
+ countValue = getHighestTypesCount(count);
288
+ } else {
289
+ countValue = count;
290
+ }
291
+ if (countValue > highestCount) {
292
+ highestCount = countValue;
293
+ probableType = type;
294
+ }
295
+ });
296
+ return probableType;
184
297
  }
185
- function y(r, e, t, s, i) {
186
- let o;
187
- r && (o = Z(r.toLowerCase()));
188
- let n;
189
- if (t === "map") {
190
- V(s) && (n = {
191
- dataType: "map",
192
- name: o,
193
- keyValue: !0,
194
- properties: {}
195
- });
196
- const c = A(
197
- e,
198
- s.map,
199
- i ? i.mapValues : void 0
298
+ function buildPropertyFromCount(key, totalDocsCount, mostProbableType, typesCount, valuesResult) {
299
+ let title;
300
+ if (key) {
301
+ title = formatString(key.toLowerCase());
302
+ }
303
+ let result = void 0;
304
+ if (mostProbableType === "map") {
305
+ const highVariability = checkTypesCountHighVariability(typesCount);
306
+ if (highVariability) {
307
+ result = {
308
+ dataType: "map",
309
+ name: title,
310
+ keyValue: true,
311
+ properties: {}
312
+ };
313
+ }
314
+ const properties = buildPropertiesFromCount(
315
+ totalDocsCount,
316
+ typesCount.map,
317
+ valuesResult ? valuesResult.mapValues : void 0
200
318
  );
201
- n = {
319
+ result = {
202
320
  dataType: "map",
203
- name: o,
204
- properties: c
321
+ name: title,
322
+ properties
205
323
  };
206
- } else if (t === "array") {
207
- const a = s.array, c = g(a), f = y(
208
- r,
209
- e,
210
- c,
211
- a,
212
- i
324
+ } else if (mostProbableType === "array") {
325
+ const arrayTypesCount = typesCount.array;
326
+ const arrayMostProbableType = getMostProbableType(arrayTypesCount);
327
+ const of = buildPropertyFromCount(
328
+ key,
329
+ totalDocsCount,
330
+ arrayMostProbableType,
331
+ arrayTypesCount,
332
+ valuesResult
213
333
  );
214
- n = {
334
+ result = {
215
335
  dataType: "array",
216
- name: o,
217
- of: f
336
+ name: title,
337
+ of
218
338
  };
219
339
  }
220
- if (!n) {
221
- const a = {
222
- name: r,
223
- totalDocsCount: e,
224
- valuesResult: i
340
+ if (!result) {
341
+ const propertyProps = {
342
+ name: key,
343
+ totalDocsCount,
344
+ valuesResult
225
345
  };
226
- t === "string" ? n = w(a) : t === "reference" ? n = _(a) : n = {
227
- dataType: t
228
- }, o && (n.name = o);
229
- const c = F(a);
230
- c && (n.validation = c);
346
+ if (mostProbableType === "string") {
347
+ result = buildStringProperty(propertyProps);
348
+ } else if (mostProbableType === "reference") {
349
+ result = buildReferenceProperty(propertyProps);
350
+ } else {
351
+ result = {
352
+ dataType: mostProbableType
353
+ };
354
+ }
355
+ if (title) {
356
+ result.name = title;
357
+ }
358
+ const validation = buildValidation(propertyProps);
359
+ if (validation) {
360
+ result.validation = validation;
361
+ }
231
362
  }
232
363
  return {
233
- ...n,
234
- editable: !0
364
+ ...result,
365
+ editable: true
235
366
  };
236
367
  }
237
- function A(r, e, t) {
238
- const s = {};
239
- return Object.entries(e).forEach(([i, o]) => {
240
- const n = g(o);
241
- s[i] = y(
242
- i,
243
- r,
244
- n,
245
- o,
246
- t ? t[i] : void 0
368
+ function buildPropertiesFromCount(totalDocsCount, typesCountRecord, valuesCountRecord) {
369
+ const res = {};
370
+ Object.entries(typesCountRecord).forEach(([key, typesCount]) => {
371
+ const mostProbableType = getMostProbableType(typesCount);
372
+ res[key] = buildPropertyFromCount(
373
+ key,
374
+ totalDocsCount,
375
+ mostProbableType,
376
+ typesCount,
377
+ valuesCountRecord ? valuesCountRecord[key] : void 0
247
378
  );
248
- }), s;
379
+ });
380
+ return res;
249
381
  }
250
- function l(r) {
251
- let e = 0;
252
- return Object.entries(r).forEach(([t, s]) => {
253
- typeof s == "object" ? e = Math.max(e, l(s)) : e = Math.max(e, s);
254
- }), e;
382
+ function countMaxDocumentsUnder(typesCount) {
383
+ let count = 0;
384
+ Object.entries(typesCount).forEach(([type, value]) => {
385
+ if (typeof value === "object") {
386
+ count = Math.max(count, countMaxDocumentsUnder(value));
387
+ } else {
388
+ count = Math.max(count, value);
389
+ }
390
+ });
391
+ return count;
255
392
  }
256
- function x(r, e) {
257
- let t = {};
258
- return r.forEach((s) => {
259
- p(e(s), t, s, e);
260
- }), g(t);
393
+ function getMostProbableTypeInArray(array, getType) {
394
+ let typesCount = {};
395
+ array.forEach((value) => {
396
+ increaseTypeCount(getType(value), typesCount, value, getType);
397
+ });
398
+ return getMostProbableType(typesCount);
261
399
  }
262
- function V(r) {
263
- const e = l(r);
264
- let t = 0;
265
- return Object.entries(r.map ?? {}).forEach(([s, i]) => {
266
- l(i) < e / 3 && t++;
267
- }), t / Object.entries(r.map ?? {}).length > 0.5;
400
+ function checkTypesCountHighVariability(typesCount) {
401
+ const maxCount = countMaxDocumentsUnder(typesCount);
402
+ let keysWithFewValues = 0;
403
+ Object.entries(typesCount.map ?? {}).forEach(([key, value]) => {
404
+ const count = countMaxDocumentsUnder(value);
405
+ if (count < maxCount / 3) {
406
+ keysWithFewValues++;
407
+ }
408
+ });
409
+ return keysWithFewValues / Object.entries(typesCount.map ?? {}).length > 0.5;
268
410
  }
269
- function Z(r) {
270
- return r.replace(/[_\-]+/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase().split(" ").map((i) => i.charAt(0).toUpperCase() + i.slice(1)).join(" ");
411
+ function formatString(input) {
412
+ const normalized = input.replace(/[_\-]+/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase();
413
+ const words = normalized.split(" ");
414
+ const formatted = words.map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
415
+ return formatted;
271
416
  }
272
- function X(r) {
273
- return typeof r == "string" ? "string" : typeof r == "number" ? "number" : typeof r == "boolean" ? "boolean" : Array.isArray(r) ? "array" : typeof r == "object" ? "map" : "string";
417
+ function inferTypeFromValue(value) {
418
+ if (typeof value === "string") return "string";
419
+ if (typeof value === "number") return "number";
420
+ if (typeof value === "boolean") return "boolean";
421
+ if (Array.isArray(value)) return "array";
422
+ if (typeof value === "object") return "map";
423
+ return "string";
274
424
  }
275
425
  export {
276
- k as buildEntityPropertiesFromData,
277
- U as buildPropertiesOrder,
278
- L as buildPropertyFromData,
279
- d as extractEnumFromValues,
280
- X as inferTypeFromValue
426
+ buildEntityPropertiesFromData,
427
+ buildPropertiesOrder,
428
+ buildPropertyFromData,
429
+ extractEnumFromValues,
430
+ inferTypeFromValue
281
431
  };
282
432
  //# sourceMappingURL=index.es.js.map