@firecms/schema_inference 3.0.0-canary.49 → 3.0.0-canary.50

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,10 +1,10 @@
1
1
  import { unslugify as O, resolveEnumValues as T, mergeDeep as j } from "@firecms/core";
2
- import { DocumentReference as P } from "@firebase/firestore";
3
- function y(r) {
2
+ import { DocumentReference as C } from "@firebase/firestore";
3
+ function b(r) {
4
4
  if (!r)
5
5
  return;
6
6
  function e(n) {
7
- return typeof n == "string" ? n : n instanceof P ? n.path : void 0;
7
+ return typeof n == "string" ? n : n instanceof C ? n.path : void 0;
8
8
  }
9
9
  const s = r.values.map((n) => e(n)).filter((n) => !!n).find((n) => n.includes("/"));
10
10
  if (!s)
@@ -15,13 +15,13 @@ function y(r) {
15
15
  return a ? a.startsWith(i) : !1;
16
16
  }).length > r.values.length / 3 * 2 ? i : void 0;
17
17
  }
18
- function b(r) {
18
+ function d(r) {
19
19
  if (!Array.isArray(r))
20
20
  return [];
21
21
  const e = r.map((t) => typeof t == "string" ? { id: t, label: O(t) } : null).filter(Boolean);
22
22
  return e.sort((t, s) => t.label.localeCompare(s.label)), e;
23
23
  }
24
- const C = [".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
+ 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])?)*$/;
25
25
  function w({
26
26
  totalDocsCount: r,
27
27
  valuesResult: e
@@ -36,14 +36,14 @@ function w({
36
36
  a && (o.email = !0);
37
37
  const c = e.values.filter((f) => typeof f == "string" && f.length === 28 && !f.includes(" ")).length > r / 3 * 2;
38
38
  if (c && (o.readOnly = !0), !a && !n && !c && !n && i < s / 3) {
39
- const f = b(Array.from(e.valuesCount.keys()));
39
+ const f = d(Array.from(e.valuesCount.keys()));
40
40
  Object.keys(f).length > 1 && (o.enumValues = f);
41
41
  }
42
42
  if (!a && !n && !c && !n && !o.enumValues) {
43
43
  const f = z(e, r);
44
44
  f && (o.storage = {
45
45
  acceptedFiles: [f],
46
- storagePath: y(e) ?? "/"
46
+ storagePath: b(e) ?? "/"
47
47
  });
48
48
  }
49
49
  Object.keys(o).length > 0 && (t = {
@@ -55,7 +55,7 @@ function w({
55
55
  return t;
56
56
  }
57
57
  function z(r, e) {
58
- const t = r.values.filter((n) => typeof n == "string" && C.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
+ 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;
59
59
  return t ? "image/*" : s ? "audio/*" : i ? "video/*" : !1;
60
60
  }
61
61
  function F({
@@ -70,13 +70,13 @@ function F({
70
70
  };
71
71
  }
72
72
  }
73
- function V({
73
+ function _({
74
74
  totalDocsCount: r,
75
75
  valuesResult: e
76
76
  }) {
77
77
  return {
78
78
  dataType: "reference",
79
- path: y(e) ?? "!!!FIX_ME!!!",
79
+ path: b(e) ?? "!!!FIX_ME!!!",
80
80
  editable: !0
81
81
  };
82
82
  }
@@ -84,60 +84,74 @@ async function k(r, e) {
84
84
  const t = {}, s = {};
85
85
  return r && r.forEach((i) => {
86
86
  i && Object.entries(i).forEach(([o, n]) => {
87
- d(t, o, n, e), p(s, o, n, e);
87
+ u(t, o, n, e), m(s, o, n, e);
88
88
  });
89
89
  }), A(r.length, t, s);
90
90
  }
91
91
  function L(r, e, t) {
92
92
  const s = {}, i = {};
93
93
  r && r.forEach((a) => {
94
- l(e.dataType, s, a, t), p(i, "inferred_prop", a, t);
94
+ p(e.dataType, s, a, t), m(i, "inferred_prop", a, t);
95
95
  });
96
96
  const o = "enumValues" in e ? T(e.enumValues) : void 0;
97
97
  if (o) {
98
- const a = b(Array.from(i.inferred_prop.valuesCount.keys()));
98
+ const a = d(Array.from(i.inferred_prop.valuesCount.keys()));
99
99
  return {
100
100
  ...e,
101
101
  enumValues: [...a, ...o]
102
102
  };
103
103
  }
104
- const n = h("inferred_prop", r.length, e.dataType, s, i.inferred_prop);
104
+ const n = y(
105
+ "inferred_prop",
106
+ r.length,
107
+ e.dataType,
108
+ s,
109
+ i.inferred_prop
110
+ );
105
111
  return j(n, e);
106
112
  }
107
113
  function U(r, e) {
108
114
  const t = (e ?? []).map((o) => o.toLowerCase());
109
115
  function s(o) {
110
116
  const n = o.toLowerCase();
111
- return t.includes(n) ? 4 : n === "title" || n === "name" || n === "title" || n === "name" ? 3 : n.includes("title") || n.includes("name") ? 2 : n.includes("image") || n.includes("picture") ? 1 : 0;
117
+ return t.includes(n) ? 4 : n === "title" || n === "name" ? 3 : n.includes("title") || n.includes("name") ? 2 : n.includes("image") || n.includes("picture") ? 1 : 0;
112
118
  }
113
119
  const i = Object.keys(r);
114
120
  return i.sort(), i.sort((o, n) => s(n) - s(o)), i;
115
121
  }
116
- function l(r, e, t, s) {
122
+ function p(r, e, t, s) {
117
123
  if (r === "map") {
118
124
  if (t) {
119
125
  let i = e[r];
120
126
  i || (i = {}, e[r] = i), Object.entries(t).forEach(([o, n]) => {
121
- d(i, o, n, s);
127
+ u(i, o, n, s);
122
128
  });
123
129
  }
124
130
  } else if (r === "array") {
125
131
  let i = e[r];
126
132
  if (i || (i = {}, e[r] = i), t && Array.isArray(t) && t.length > 0) {
127
- const o = _(t, s);
128
- i[o] ? i[o]++ : i[o] = 1;
133
+ const o = x(t, s);
134
+ if (o === "map") {
135
+ let n = i[o];
136
+ n || (n = {}), t.forEach((a) => {
137
+ Object.entries(a).forEach(
138
+ ([c, f]) => u(n, c, f, s)
139
+ );
140
+ }), i[o] = n;
141
+ } else
142
+ i[o] ? i[o]++ : i[o] = 1;
129
143
  }
130
144
  } else
131
145
  e[r] ? e[r]++ : e[r] = 1;
132
146
  }
133
- function d(r, e, t, s) {
147
+ function u(r, e, t, s) {
134
148
  let i = r[e];
135
149
  if (i || (i = {}, r[e] = i), t != null) {
136
150
  const o = s(t);
137
- l(o, i, t, s);
151
+ p(o, i, t, s);
138
152
  }
139
153
  }
140
- function p(r, e, t, s) {
154
+ function m(r, e, t, s) {
141
155
  const i = s(t);
142
156
  let o = r[e];
143
157
  if (o || (o = {
@@ -145,48 +159,60 @@ function p(r, e, t, s) {
145
159
  valuesCount: /* @__PURE__ */ new Map()
146
160
  }, r[e] = o), i === "map") {
147
161
  let n = o.map;
148
- n || (n = {}, o.map = n), t && Object.entries(t).forEach(([a, c]) => p(n, a, c, s));
162
+ n || (n = {}, o.map = n), t && Object.entries(t).forEach(
163
+ ([a, c]) => m(n, a, c, s)
164
+ );
149
165
  } else
150
166
  i === "array" ? Array.isArray(t) && t.forEach((n) => {
151
167
  o.values.push(n), o.valuesCount.set(n, (o.valuesCount.get(n) ?? 0) + 1);
152
168
  }) : t && (o.values.push(t), o.valuesCount.set(t, (o.valuesCount.get(t) ?? 0) + 1));
153
169
  }
154
- function m(r) {
170
+ function h(r) {
155
171
  let e = 0;
156
172
  return Object.entries(r).forEach(([t, s]) => {
157
173
  let i = 0;
158
- t === "map" ? i = E(s) : t === "array" ? i = m(s) : i = s, i > e && (e = i);
174
+ t === "map" ? i = E(s) : t === "array" ? i = h(s) : i = s, i > e && (e = i);
159
175
  }), e;
160
176
  }
161
177
  function E(r) {
162
- return Object.entries(r).map(([e, t]) => m(t)).reduce((e, t) => Math.max(e, t), 0);
178
+ return Object.entries(r).map(([e, t]) => h(t)).reduce((e, t) => Math.max(e, t), 0);
163
179
  }
164
180
  function g(r) {
165
181
  let e = -1, t = "string";
166
182
  return Object.entries(r).forEach(([s, i]) => {
167
183
  let o;
168
- s === "map" ? o = E(i) : s === "array" ? o = m(i) : o = i, o > e && (e = o, t = s);
184
+ s === "map" ? o = E(i) : s === "array" ? o = h(i) : o = i, o > e && (e = o, t = s);
169
185
  }), t;
170
186
  }
171
- function h(r, e, t, s, i) {
187
+ function y(r, e, t, s, i) {
172
188
  let o;
173
189
  r && (o = Z(r.toLowerCase()));
174
190
  let n;
175
191
  if (t === "map") {
176
- x(s) && (n = {
192
+ V(s) && (n = {
177
193
  dataType: "map",
178
194
  name: o,
179
195
  keyValue: !0,
180
196
  properties: {}
181
197
  });
182
- const c = A(e, s.map, i ? i.mapValues : void 0);
198
+ const c = A(
199
+ e,
200
+ s.map,
201
+ i ? i.mapValues : void 0
202
+ );
183
203
  n = {
184
204
  dataType: "map",
185
205
  name: o,
186
206
  properties: c
187
207
  };
188
208
  } else if (t === "array") {
189
- const a = s.array, c = g(a), f = h(r, e, c, a, i);
209
+ const a = s.array, c = g(a), f = y(
210
+ r,
211
+ e,
212
+ c,
213
+ a,
214
+ i
215
+ );
190
216
  n = {
191
217
  dataType: "array",
192
218
  name: o,
@@ -199,7 +225,7 @@ function h(r, e, t, s, i) {
199
225
  totalDocsCount: e,
200
226
  valuesResult: i
201
227
  };
202
- t === "string" ? n = w(a) : t === "reference" ? n = V(a) : n = {
228
+ t === "string" ? n = w(a) : t === "reference" ? n = _(a) : n = {
203
229
  dataType: t
204
230
  }, o && (n.name = o);
205
231
  const c = F(a);
@@ -214,26 +240,32 @@ function A(r, e, t) {
214
240
  const s = {};
215
241
  return Object.entries(e).forEach(([i, o]) => {
216
242
  const n = g(o);
217
- s[i] = h(i, r, n, o, t ? t[i] : void 0);
243
+ s[i] = y(
244
+ i,
245
+ r,
246
+ n,
247
+ o,
248
+ t ? t[i] : void 0
249
+ );
218
250
  }), s;
219
251
  }
220
- function u(r) {
252
+ function l(r) {
221
253
  let e = 0;
222
254
  return Object.entries(r).forEach(([t, s]) => {
223
- typeof s == "object" ? e = Math.max(e, u(s)) : e = Math.max(e, s);
255
+ typeof s == "object" ? e = Math.max(e, l(s)) : e = Math.max(e, s);
224
256
  }), e;
225
257
  }
226
- function _(r, e) {
258
+ function x(r, e) {
227
259
  let t = {};
228
260
  return r.forEach((s) => {
229
- l(e(s), t, s, e);
261
+ p(e(s), t, s, e);
230
262
  }), g(t);
231
263
  }
232
- function x(r) {
233
- const e = u(r);
264
+ function V(r) {
265
+ const e = l(r);
234
266
  let t = 0;
235
267
  return Object.entries(r.map ?? {}).forEach(([s, i]) => {
236
- u(i) < e / 3 && t++;
268
+ l(i) < e / 3 && t++;
237
269
  }), t / Object.entries(r.map ?? {}).length > 0.5;
238
270
  }
239
271
  function Z(r) {
@@ -246,7 +278,7 @@ export {
246
278
  k as buildEntityPropertiesFromData,
247
279
  U as buildPropertiesOrder,
248
280
  L as buildPropertyFromData,
249
- b as extractEnumFromValues,
281
+ d as extractEnumFromValues,
250
282
  X as inferTypeFromValue
251
283
  };
252
284
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/strings.ts","../src/util.ts","../src/builders/string_property_builder.ts","../src/builders/validation_builder.ts","../src/builders/reference_property_builder.ts","../src/collection_builder.ts"],"sourcesContent":["import { ValuesCountEntry } from \"./types\";\nimport { DocumentReference } from \"@firebase/firestore\";\n\nexport function findCommonInitialStringInPath(valuesCount?: ValuesCountEntry) {\n\n if (!valuesCount) return undefined;\n\n function getPath(value: any) {\n if (typeof value === \"string\") return value;\n else if (value instanceof DocumentReference) return value.path;\n else return undefined;\n }\n\n const strings: string[] = valuesCount.values.map((v) => getPath(v)).filter(v => !!v) as string[];\n const pathWithSlash = strings.find((s) => s.includes(\"/\"));\n if (!pathWithSlash)\n return undefined;\n\n const searchedPath = pathWithSlash.substr(0, pathWithSlash.lastIndexOf(\"/\"));\n\n const yep = valuesCount.values\n .filter((value) => {\n const path = getPath(value);\n if (!path) return false;\n return path.startsWith(searchedPath)\n }).length > valuesCount.values.length / 3 * 2;\n\n return yep ? searchedPath : undefined;\n\n}\n\nexport function removeInitialAndTrailingSlashes(s: string): string {\n return removeInitialSlash(removeTrailingSlash(s));\n}\n\nexport function removeInitialSlash(s: string) {\n if (s.startsWith(\"/\"))\n return s.slice(1);\n else return s;\n}\n\nexport function removeTrailingSlash(s: string) {\n if (s.endsWith(\"/\"))\n return s.slice(0, -1);\n else return s;\n}\n","import { unslugify } from \"@firecms/core\";\n\nexport function extractEnumFromValues(values: unknown[]) {\n if (!Array.isArray(values)) {\n return [];\n }\n const enumValues = values\n .map((value) => {\n if (typeof value === \"string\") {\n return ({ id: value, label: unslugify(value) });\n } else\n return null;\n }).filter(Boolean) as Array<{ id: string, label: string }>;\n enumValues.sort((a, b) => a.label.localeCompare(b.label));\n return enumValues;\n}\n","import { FileType, Property, StringProperty } from \"@firecms/core\";\nimport { InferencePropertyBuilderProps, ValuesCountEntry } from \"../types\";\nimport { findCommonInitialStringInPath } from \"../strings\";\nimport { extractEnumFromValues } from \"../util\";\n\nconst IMAGE_EXTENSIONS = [\".jpg\", \".jpeg\", \".png\", \".webp\", \".gif\", \".avif\"];\nconst AUDIO_EXTENSIONS = [\".mp3\", \".ogg\", \".opus\", \".aac\"];\nconst VIDEO_EXTENSIONS = [\".avi\", \".mp4\"];\n\nconst 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])?)*$/;\n\nexport function buildStringProperty({\n totalDocsCount,\n valuesResult\n }: InferencePropertyBuilderProps): Property {\n\n let stringProperty: Property = {\n dataType: \"string\",\n\n };\n\n if (valuesResult) {\n\n const totalEntriesCount = valuesResult.values.length;\n const totalValues = Array.from(valuesResult.valuesCount.keys()).length;\n\n const config: Partial<StringProperty> = {};\n\n const probablyAURL = valuesResult.values\n .filter((value) => typeof value === \"string\" &&\n value.toString().startsWith(\"http\")).length > totalDocsCount / 3 * 2;\n if (probablyAURL) {\n config.url = true;\n }\n\n const probablyAnEmail = valuesResult.values\n .filter((value) => typeof value === \"string\" &&\n emailRegEx.test(value)).length > totalDocsCount / 3 * 2;\n if (probablyAnEmail) {\n config.email = true;\n }\n\n const probablyUserIds = valuesResult.values\n .filter((value) => typeof value === \"string\" && value.length === 28 && !value.includes(\" \"))\n .length > totalDocsCount / 3 * 2;\n if (probablyUserIds)\n config.readOnly = true;\n\n if (!probablyAnEmail &&\n !probablyAURL &&\n !probablyUserIds &&\n !probablyAURL &&\n totalValues < totalEntriesCount / 3\n ) {\n const enumValues = extractEnumFromValues(Array.from(valuesResult.valuesCount.keys()));\n\n if (Object.keys(enumValues).length > 1)\n config.enumValues = enumValues;\n }\n\n // regular string\n if (!probablyAnEmail &&\n !probablyAURL &&\n !probablyUserIds &&\n !probablyAURL &&\n !config.enumValues) {\n const fileType = probableFileType(valuesResult, totalDocsCount);\n if (fileType) {\n config.storage = {\n acceptedFiles: [fileType as FileType],\n storagePath: findCommonInitialStringInPath(valuesResult) ?? \"/\"\n };\n }\n }\n\n if (Object.keys(config).length > 0)\n stringProperty = {\n ...stringProperty,\n ...config,\n editable: true\n };\n }\n\n return stringProperty;\n}\n\n// TODO: support returning multiple types\nfunction probableFileType(valuesCount: ValuesCountEntry, totalDocsCount: number): boolean | FileType {\n const probablyAnImage = valuesCount.values\n .filter((value) => typeof value === \"string\" &&\n IMAGE_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;\n\n const probablyAudio = valuesCount.values\n .filter((value) => typeof value === \"string\" &&\n AUDIO_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;\n\n const probablyVideo = valuesCount.values\n .filter((value) => typeof value === \"string\" &&\n VIDEO_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;\n\n const fileType: boolean | FileType = probablyAnImage\n ? \"image/*\"\n : probablyAudio\n ? \"audio/*\"\n : probablyVideo ? \"video/*\" : false;\n return fileType;\n}\n","import { PropertyValidationSchema } from \"@firecms/core\";\nimport { InferencePropertyBuilderProps } from \"../types\";\n\nexport function buildValidation({\n totalDocsCount,\n valuesResult\n }: InferencePropertyBuilderProps): PropertyValidationSchema | undefined {\n\n if (valuesResult) {\n const totalEntriesCount = valuesResult.values.length;\n if (totalDocsCount === totalEntriesCount)\n return {\n required: true\n }\n }\n\n return undefined;\n}\n","import { InferencePropertyBuilderProps } from \"../types\";\nimport { findCommonInitialStringInPath } from \"../strings\";\nimport { Property } from \"@firecms/core\";\n\nexport function buildReferenceProperty({\n totalDocsCount,\n valuesResult\n }: InferencePropertyBuilderProps): Property {\n\n const property: Property = {\n dataType: \"reference\",\n path: findCommonInitialStringInPath(valuesResult) ?? \"!!!FIX_ME!!!\",\n editable: true\n };\n\n return property;\n}\n","import {\n DataType,\n EnumValues,\n mergeDeep,\n Properties,\n Property,\n resolveEnumValues,\n StringProperty\n} from \"@firecms/core\";\nimport {\n InferencePropertyBuilderProps,\n TypesCount,\n TypesCountRecord,\n ValuesCountEntry,\n ValuesCountRecord\n} from \"./types\";\nimport { buildStringProperty } from \"./builders/string_property_builder\";\nimport { buildValidation } from \"./builders/validation_builder\";\nimport { buildReferenceProperty } from \"./builders/reference_property_builder\";\nimport { extractEnumFromValues } from \"./util\";\n\nexport type InferenceTypeBuilder = (value: any) => DataType;\n\nexport async function buildEntityPropertiesFromData(data: object[], getType: InferenceTypeBuilder): Promise<Properties> {\n const typesCount: TypesCountRecord = {};\n const valuesCount: ValuesCountRecord = {};\n if (data) {\n data.forEach((entry) => {\n if (entry) {\n Object.entries(entry).forEach(([key, value]) => {\n increaseMapTypeCount(typesCount, key, value, getType);\n increaseValuesCount(valuesCount, key, value, getType);\n })\n }\n });\n }\n // console.log(util.inspect({ typesCount }, { showHidden: false, depth: null, colors: true }));\n return buildPropertiesFromCount(data.length, typesCount, valuesCount);\n}\n\nexport function buildPropertyFromData(data: any[], property: Property, getType: InferenceTypeBuilder): Property {\n const typesCount = {};\n const valuesCount: ValuesCountRecord = {};\n if (data) {\n data.forEach((entry) => {\n increaseTypeCount(property.dataType, typesCount, entry, getType);\n increaseValuesCount(valuesCount, \"inferred_prop\", entry, getType);\n });\n }\n const enumValues = \"enumValues\" in property ? resolveEnumValues(property[\"enumValues\"] as EnumValues) : undefined;\n if (enumValues) {\n const newEnumValues = extractEnumFromValues(Array.from(valuesCount[\"inferred_prop\"].valuesCount.keys()));\n return {\n ...property,\n enumValues: [...newEnumValues, ...enumValues]\n } as StringProperty;\n }\n const generatedProperty = buildPropertyFromCount(\"inferred_prop\", data.length, property.dataType, typesCount, valuesCount[\"inferred_prop\"]);\n return mergeDeep(generatedProperty, property);\n}\n\nexport function buildPropertiesOrder(properties: Properties<any>, priorityKeys?: string[]): string [] {\n const lowerCasePriorityKeys = (priorityKeys ?? []).map((key) => key.toLowerCase());\n\n function propOrder(s: string) {\n const k = s.toLowerCase();\n if (lowerCasePriorityKeys.includes(k)) return 4;\n if (k === \"title\" || k === \"name\") return 3;\n if (k === \"title\" || k === \"name\") return 3;\n if (k.includes(\"title\") || k.includes(\"name\")) return 2;\n if (k.includes(\"image\") || k.includes(\"picture\")) return 1;\n return 0;\n }\n\n const keys = Object.keys(properties);\n keys.sort(); // alphabetically\n keys.sort((a, b) => {\n return propOrder(b) - propOrder(a);\n });\n return keys;\n}\n\n/**\n * @param type\n * @param typesCount\n * @param fieldValue\n * @param getType\n */\nfunction increaseTypeCount(type: DataType, typesCount: TypesCount, fieldValue: any, getType: InferenceTypeBuilder) {\n if (type === \"map\") {\n if (fieldValue) {\n let mapTypesCount = typesCount[type];\n if (!mapTypesCount) {\n mapTypesCount = {};\n typesCount[type] = mapTypesCount;\n }\n Object.entries(fieldValue).forEach(([key, value]) => {\n increaseMapTypeCount(mapTypesCount as TypesCountRecord, key, value, getType);\n })\n }\n } else if (type === \"array\") {\n let arrayTypesCount = typesCount[type];\n if (!arrayTypesCount) {\n arrayTypesCount = {};\n typesCount[type] = arrayTypesCount;\n }\n if (fieldValue && Array.isArray(fieldValue) && fieldValue.length > 0) {\n const arrayType = getMostProbableTypeInArray(fieldValue, getType); // get type of first element\n if (!arrayTypesCount[arrayType]) (arrayTypesCount[arrayType] as number) = 1;\n else (arrayTypesCount[arrayType] as number)++;\n }\n } else {\n if (!typesCount[type]) typesCount[type] = 1;\n else (typesCount[type] as number)++;\n }\n}\n\nfunction increaseMapTypeCount(\n typesCountRecord: TypesCountRecord,\n key: string,\n fieldValue: any,\n getType: InferenceTypeBuilder\n) {\n let typesCount: TypesCount = typesCountRecord[key];\n if (!typesCount) {\n typesCount = {};\n typesCountRecord[key] = typesCount;\n }\n\n if (fieldValue != null) { // Check that fieldValue is not null or undefined before proceeding\n const type = getType(fieldValue);\n increaseTypeCount(type, typesCount, fieldValue, getType);\n }\n}\n\nfunction increaseValuesCount(\n typeValuesRecord: ValuesCountRecord,\n key: string,\n fieldValue: any,\n getType: InferenceTypeBuilder\n) {\n\n const dataType = getType(fieldValue);\n\n let valuesRecord: {\n values: any[];\n valuesCount: Map<any, number>;\n map?: ValuesCountRecord;\n } = typeValuesRecord[key];\n\n if (!valuesRecord) {\n valuesRecord = {\n values: [],\n valuesCount: new Map()\n };\n typeValuesRecord[key] = valuesRecord;\n }\n\n if (dataType === \"map\") {\n let mapValuesRecord: ValuesCountRecord | undefined = valuesRecord.map;\n if (!mapValuesRecord) {\n mapValuesRecord = {};\n valuesRecord.map = mapValuesRecord;\n }\n if (fieldValue)\n Object.entries(fieldValue).forEach(([key, value]) => increaseValuesCount(mapValuesRecord as ValuesCountRecord, key, value, getType))\n } else if (dataType === \"array\") {\n if (Array.isArray(fieldValue)) {\n fieldValue.forEach((value) => {\n valuesRecord.values.push(value);\n valuesRecord.valuesCount.set(value, (valuesRecord.valuesCount.get(value) ?? 0) + 1);\n })\n }\n } else {\n if (fieldValue) {\n valuesRecord.values.push(fieldValue);\n valuesRecord.valuesCount.set(fieldValue, (valuesRecord.valuesCount.get(fieldValue) ?? 0) + 1);\n }\n }\n\n}\n\nfunction getHighestTypesCount(typesCount: TypesCount): number {\n let highestCount = 0;\n Object.entries(typesCount).forEach(([type, count]) => {\n let countValue = 0;\n if (type === \"map\") {\n countValue = getHighestRecordCount(count as TypesCountRecord);\n } else if (type === \"array\") {\n countValue = getHighestTypesCount(count as TypesCount);\n } else {\n countValue = count as number;\n }\n if (countValue > highestCount) {\n highestCount = countValue;\n }\n });\n\n return highestCount;\n}\n\nfunction getHighestRecordCount(record: TypesCountRecord): number {\n return Object.entries(record)\n .map(([key, typesCount]) => getHighestTypesCount(typesCount))\n .reduce((a, b) => Math.max(a, b), 0);\n}\n\nfunction getMostProbableType(typesCount: TypesCount): DataType {\n let highestCount = -1;\n let probableType: DataType = \"string\"; //default\n Object.entries(typesCount).forEach(([type, count]) => {\n let countValue;\n if (type === \"map\") {\n countValue = getHighestRecordCount(count as TypesCountRecord);\n } else if (type === \"array\") {\n countValue = getHighestTypesCount(count as TypesCount);\n } else {\n countValue = count as number;\n }\n if (countValue > highestCount) {\n highestCount = countValue;\n probableType = type as DataType;\n }\n });\n return probableType;\n}\n\nfunction buildPropertyFromCount(key: string, totalDocsCount: number, mostProbableType: DataType, typesCount: TypesCount, valuesResult?: ValuesCountEntry): Property {\n let title: string | undefined;\n\n if (key) {\n title = formatString(key.toLowerCase());\n }\n\n let result: Property | undefined = undefined;\n if (mostProbableType === \"map\") {\n\n const highVariability = checkTypesCountHighVariability(typesCount);\n if (highVariability) {\n result = {\n dataType: \"map\",\n name: title,\n keyValue: true,\n properties: {}\n };\n }\n const properties = buildPropertiesFromCount(totalDocsCount, typesCount.map as TypesCountRecord, valuesResult ? valuesResult.mapValues : undefined);\n result = {\n dataType: \"map\",\n name: title,\n properties\n };\n } else if (mostProbableType === \"array\") {\n const arrayTypesCount = typesCount.array as TypesCount;\n const arrayMostProbableType = getMostProbableType(arrayTypesCount);\n const of = buildPropertyFromCount(key, totalDocsCount, arrayMostProbableType, arrayTypesCount, valuesResult);\n result = {\n dataType: \"array\",\n name: title,\n of\n };\n }\n if (!result) {\n const propertyProps: InferencePropertyBuilderProps = {\n name: key,\n totalDocsCount,\n valuesResult\n };\n if (mostProbableType === \"string\") {\n result = buildStringProperty(propertyProps);\n } else if (mostProbableType === \"reference\") {\n result = buildReferenceProperty(propertyProps);\n } else {\n result = {\n dataType: mostProbableType\n } as Property;\n }\n\n if (title) {\n result.name = title;\n }\n\n const validation = buildValidation(propertyProps);\n if (validation) {\n result.validation = validation;\n }\n }\n\n return {\n ...result,\n editable: true\n };\n}\n\nfunction buildPropertiesFromCount(totalDocsCount: number, typesCountRecord: TypesCountRecord, valuesCountRecord?: ValuesCountRecord): Properties {\n const res: Properties = {};\n Object.entries(typesCountRecord).forEach(([key, typesCount]) => {\n const mostProbableType = getMostProbableType(typesCount);\n res[key] = buildPropertyFromCount(key, totalDocsCount, mostProbableType, typesCount, valuesCountRecord ? valuesCountRecord[key] : undefined);\n })\n return res;\n}\n\nfunction countMaxDocumentsUnder(typesCount: TypesCount) {\n let count = 0;\n Object.entries(typesCount).forEach(([type, value]) => {\n // console.log(util.inspect({ type, value }, { showHidden: false, depth: null, colors: true }));\n if (typeof value === \"object\") {\n count = Math.max(count, countMaxDocumentsUnder(value as TypesCountRecord));\n } else {\n count = Math.max(count, value as number);\n }\n });\n return count;\n}\n\nfunction getMostProbableTypeInArray(array: any[], getType: InferenceTypeBuilder): DataType {\n let typesCount: TypesCount = {};\n array.forEach((value) => {\n increaseTypeCount(getType(value), typesCount, value, getType);\n });\n return getMostProbableType(typesCount);\n}\n\nfunction checkTypesCountHighVariability(typesCount: TypesCount) {\n const maxCount = countMaxDocumentsUnder(typesCount);\n let keysWithFewValues = 0;\n Object.entries(typesCount.map ?? {})\n .forEach(([key, value]) => {\n const count = countMaxDocumentsUnder(value);\n if (count < maxCount / 3) {\n keysWithFewValues++;\n }\n });\n return keysWithFewValues / Object.entries(typesCount.map ?? {}).length > 0.5;\n}\n\nfunction formatString(input: string): string {\n const normalized = input\n .replace(/[_\\-]+/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .toLowerCase();\n\n // Split the normalized string into words\n const words = normalized.split(\" \");\n\n // Capitalize the first letter of each word and join them with a space\n const formatted = words\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n return formatted;\n}\n\nexport function inferTypeFromValue(value: any): DataType {\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"boolean\") return \"boolean\";\n if (Array.isArray(value)) return \"array\";\n if (typeof value === \"object\") return \"map\";\n return \"string\";\n}\n\n"],"names":["findCommonInitialStringInPath","valuesCount","getPath","value","DocumentReference","pathWithSlash","v","s","searchedPath","path","extractEnumFromValues","values","enumValues","unslugify","a","b","IMAGE_EXTENSIONS","AUDIO_EXTENSIONS","VIDEO_EXTENSIONS","emailRegEx","buildStringProperty","totalDocsCount","valuesResult","stringProperty","totalEntriesCount","totalValues","config","probablyAURL","probablyAnEmail","probablyUserIds","fileType","probableFileType","probablyAnImage","extension","probablyAudio","probablyVideo","buildValidation","buildReferenceProperty","buildEntityPropertiesFromData","data","getType","typesCount","entry","key","increaseMapTypeCount","increaseValuesCount","buildPropertiesFromCount","buildPropertyFromData","property","increaseTypeCount","resolveEnumValues","newEnumValues","generatedProperty","buildPropertyFromCount","mergeDeep","buildPropertiesOrder","properties","priorityKeys","lowerCasePriorityKeys","propOrder","k","keys","type","fieldValue","mapTypesCount","arrayTypesCount","arrayType","getMostProbableTypeInArray","typesCountRecord","typeValuesRecord","dataType","valuesRecord","mapValuesRecord","getHighestTypesCount","highestCount","count","countValue","getHighestRecordCount","record","getMostProbableType","probableType","mostProbableType","title","formatString","result","checkTypesCountHighVariability","arrayMostProbableType","of","propertyProps","validation","valuesCountRecord","res","countMaxDocumentsUnder","array","maxCount","keysWithFewValues","input","word","inferTypeFromValue"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/strings.ts","../src/util.ts","../src/builders/string_property_builder.ts","../src/builders/validation_builder.ts","../src/builders/reference_property_builder.ts","../src/collection_builder.ts"],"sourcesContent":["import { ValuesCountEntry } from \"./types\";\nimport { DocumentReference } from \"@firebase/firestore\";\n\nexport function findCommonInitialStringInPath(valuesCount?: ValuesCountEntry) {\n\n if (!valuesCount) return undefined;\n\n function getPath(value: any) {\n if (typeof value === \"string\") return value;\n else if (value instanceof DocumentReference) return value.path;\n else return undefined;\n }\n\n const strings: string[] = valuesCount.values.map((v) => getPath(v)).filter(v => !!v) as string[];\n const pathWithSlash = strings.find((s) => s.includes(\"/\"));\n if (!pathWithSlash)\n return undefined;\n\n const searchedPath = pathWithSlash.substr(0, pathWithSlash.lastIndexOf(\"/\"));\n\n const yep = valuesCount.values\n .filter((value) => {\n const path = getPath(value);\n if (!path) return false;\n return path.startsWith(searchedPath)\n }).length > valuesCount.values.length / 3 * 2;\n\n return yep ? searchedPath : undefined;\n\n}\n\nexport function removeInitialAndTrailingSlashes(s: string): string {\n return removeInitialSlash(removeTrailingSlash(s));\n}\n\nexport function removeInitialSlash(s: string) {\n if (s.startsWith(\"/\"))\n return s.slice(1);\n else return s;\n}\n\nexport function removeTrailingSlash(s: string) {\n if (s.endsWith(\"/\"))\n return s.slice(0, -1);\n else return s;\n}\n","import { unslugify } from \"@firecms/core\";\n\nexport function extractEnumFromValues(values: unknown[]) {\n if (!Array.isArray(values)) {\n return [];\n }\n const enumValues = values\n .map((value) => {\n if (typeof value === \"string\") {\n return ({ id: value, label: unslugify(value) });\n } else\n return null;\n }).filter(Boolean) as Array<{ id: string, label: string }>;\n enumValues.sort((a, b) => a.label.localeCompare(b.label));\n return enumValues;\n}\n","import { FileType, Property, StringProperty } from \"@firecms/core\";\nimport { InferencePropertyBuilderProps, ValuesCountEntry } from \"../types\";\nimport { findCommonInitialStringInPath } from \"../strings\";\nimport { extractEnumFromValues } from \"../util\";\n\nconst IMAGE_EXTENSIONS = [\".jpg\", \".jpeg\", \".png\", \".webp\", \".gif\", \".avif\"];\nconst AUDIO_EXTENSIONS = [\".mp3\", \".ogg\", \".opus\", \".aac\"];\nconst VIDEO_EXTENSIONS = [\".avi\", \".mp4\"];\n\nconst 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])?)*$/;\n\nexport function buildStringProperty({\n totalDocsCount,\n valuesResult\n }: InferencePropertyBuilderProps): Property {\n\n let stringProperty: Property = {\n dataType: \"string\",\n\n };\n\n if (valuesResult) {\n\n const totalEntriesCount = valuesResult.values.length;\n const totalValues = Array.from(valuesResult.valuesCount.keys()).length;\n\n const config: Partial<StringProperty> = {};\n\n const probablyAURL = valuesResult.values\n .filter((value) => typeof value === \"string\" &&\n value.toString().startsWith(\"http\")).length > totalDocsCount / 3 * 2;\n if (probablyAURL) {\n config.url = true;\n }\n\n const probablyAnEmail = valuesResult.values\n .filter((value) => typeof value === \"string\" &&\n emailRegEx.test(value)).length > totalDocsCount / 3 * 2;\n if (probablyAnEmail) {\n config.email = true;\n }\n\n const probablyUserIds = valuesResult.values\n .filter((value) => typeof value === \"string\" && value.length === 28 && !value.includes(\" \"))\n .length > totalDocsCount / 3 * 2;\n if (probablyUserIds)\n config.readOnly = true;\n\n if (!probablyAnEmail &&\n !probablyAURL &&\n !probablyUserIds &&\n !probablyAURL &&\n totalValues < totalEntriesCount / 3\n ) {\n const enumValues = extractEnumFromValues(Array.from(valuesResult.valuesCount.keys()));\n\n if (Object.keys(enumValues).length > 1)\n config.enumValues = enumValues;\n }\n\n // regular string\n if (!probablyAnEmail &&\n !probablyAURL &&\n !probablyUserIds &&\n !probablyAURL &&\n !config.enumValues) {\n const fileType = probableFileType(valuesResult, totalDocsCount);\n if (fileType) {\n config.storage = {\n acceptedFiles: [fileType as FileType],\n storagePath: findCommonInitialStringInPath(valuesResult) ?? \"/\"\n };\n }\n }\n\n if (Object.keys(config).length > 0)\n stringProperty = {\n ...stringProperty,\n ...config,\n editable: true\n };\n }\n\n return stringProperty;\n}\n\n// TODO: support returning multiple types\nfunction probableFileType(valuesCount: ValuesCountEntry, totalDocsCount: number): boolean | FileType {\n const probablyAnImage = valuesCount.values\n .filter((value) => typeof value === \"string\" &&\n IMAGE_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;\n\n const probablyAudio = valuesCount.values\n .filter((value) => typeof value === \"string\" &&\n AUDIO_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;\n\n const probablyVideo = valuesCount.values\n .filter((value) => typeof value === \"string\" &&\n VIDEO_EXTENSIONS.some((extension) => value.toString().endsWith(extension))).length > totalDocsCount / 3 * 2;\n\n const fileType: boolean | FileType = probablyAnImage\n ? \"image/*\"\n : probablyAudio\n ? \"audio/*\"\n : probablyVideo ? \"video/*\" : false;\n return fileType;\n}\n","import { PropertyValidationSchema } from \"@firecms/core\";\nimport { InferencePropertyBuilderProps } from \"../types\";\n\nexport function buildValidation({\n totalDocsCount,\n valuesResult\n }: InferencePropertyBuilderProps): PropertyValidationSchema | undefined {\n\n if (valuesResult) {\n const totalEntriesCount = valuesResult.values.length;\n if (totalDocsCount === totalEntriesCount)\n return {\n required: true\n }\n }\n\n return undefined;\n}\n","import { InferencePropertyBuilderProps } from \"../types\";\nimport { findCommonInitialStringInPath } from \"../strings\";\nimport { Property } from \"@firecms/core\";\n\nexport function buildReferenceProperty({\n totalDocsCount,\n valuesResult\n }: InferencePropertyBuilderProps): Property {\n\n const property: Property = {\n dataType: \"reference\",\n path: findCommonInitialStringInPath(valuesResult) ?? \"!!!FIX_ME!!!\",\n editable: true\n };\n\n return property;\n}\n","import {\n DataType,\n EnumValues,\n mergeDeep,\n Properties,\n Property,\n resolveEnumValues,\n StringProperty\n} from \"@firecms/core\";\nimport {\n InferencePropertyBuilderProps,\n TypesCount,\n TypesCountRecord,\n ValuesCountEntry,\n ValuesCountRecord\n} from \"./types\";\nimport { buildStringProperty } from \"./builders/string_property_builder\";\nimport { buildValidation } from \"./builders/validation_builder\";\nimport { buildReferenceProperty } from \"./builders/reference_property_builder\";\nimport { extractEnumFromValues } from \"./util\";\n\nexport type InferenceTypeBuilder = (value: any) => DataType;\n\nexport async function buildEntityPropertiesFromData(\n data: object[],\n getType: InferenceTypeBuilder\n): Promise<Properties> {\n const typesCount: TypesCountRecord = {};\n const valuesCount: ValuesCountRecord = {};\n if (data) {\n data.forEach((entry) => {\n if (entry) {\n Object.entries(entry).forEach(([key, value]) => {\n increaseMapTypeCount(typesCount, key, value, getType);\n increaseValuesCount(valuesCount, key, value, getType);\n });\n }\n });\n }\n return buildPropertiesFromCount(data.length, typesCount, valuesCount);\n}\n\nexport function buildPropertyFromData(\n data: any[],\n property: Property,\n getType: InferenceTypeBuilder\n): Property {\n const typesCount = {};\n const valuesCount: ValuesCountRecord = {};\n if (data) {\n data.forEach((entry) => {\n increaseTypeCount(property.dataType, typesCount, entry, getType);\n increaseValuesCount(valuesCount, \"inferred_prop\", entry, getType);\n });\n }\n const enumValues = \"enumValues\" in property ? resolveEnumValues(property[\"enumValues\"] as EnumValues) : undefined;\n if (enumValues) {\n const newEnumValues = extractEnumFromValues(Array.from(valuesCount[\"inferred_prop\"].valuesCount.keys()));\n return {\n ...property,\n enumValues: [...newEnumValues, ...enumValues]\n } as StringProperty;\n }\n const generatedProperty = buildPropertyFromCount(\n \"inferred_prop\",\n data.length,\n property.dataType,\n typesCount,\n valuesCount[\"inferred_prop\"]\n );\n return mergeDeep(generatedProperty, property);\n}\n\nexport function buildPropertiesOrder(\n properties: Properties<any>,\n priorityKeys?: string[]\n): string[] {\n const lowerCasePriorityKeys = (priorityKeys ?? []).map((key) => key.toLowerCase());\n\n function propOrder(s: string) {\n const k = s.toLowerCase();\n if (lowerCasePriorityKeys.includes(k)) return 4;\n if (k === \"title\" || k === \"name\") return 3;\n if (k.includes(\"title\") || k.includes(\"name\")) return 2;\n if (k.includes(\"image\") || k.includes(\"picture\")) return 1;\n return 0;\n }\n\n const keys = Object.keys(properties);\n keys.sort(); // alphabetically\n keys.sort((a, b) => {\n return propOrder(b) - propOrder(a);\n });\n return keys;\n}\n\n/**\n * @param type\n * @param typesCount\n * @param fieldValue\n * @param getType\n */\nfunction increaseTypeCount(\n type: DataType,\n typesCount: TypesCount,\n fieldValue: any,\n getType: InferenceTypeBuilder\n) {\n if (type === \"map\") {\n if (fieldValue) {\n let mapTypesCount = typesCount[type];\n if (!mapTypesCount) {\n mapTypesCount = {};\n typesCount[type] = mapTypesCount;\n }\n Object.entries(fieldValue).forEach(([key, value]) => {\n increaseMapTypeCount(mapTypesCount as TypesCountRecord, key, value, getType);\n });\n }\n } else if (type === \"array\") {\n let arrayTypesCount = typesCount[type];\n if (!arrayTypesCount) {\n arrayTypesCount = {};\n typesCount[type] = arrayTypesCount;\n }\n if (fieldValue && Array.isArray(fieldValue) && fieldValue.length > 0) {\n const arrayType = getMostProbableTypeInArray(fieldValue, getType);\n if (arrayType === \"map\") {\n let mapTypesCount = arrayTypesCount[arrayType];\n if (!mapTypesCount) {\n mapTypesCount = {};\n }\n fieldValue.forEach((value) => {\n Object.entries(value).forEach(([key, v]) =>\n increaseMapTypeCount(mapTypesCount, key, v, getType)\n );\n });\n arrayTypesCount[arrayType] = mapTypesCount;\n } else {\n if (!arrayTypesCount[arrayType]) arrayTypesCount[arrayType] = 1;\n else (arrayTypesCount[arrayType] as number)++;\n }\n }\n } else {\n if (!typesCount[type]) typesCount[type] = 1;\n else (typesCount[type] as number)++;\n }\n}\n\nfunction increaseMapTypeCount(\n typesCountRecord: TypesCountRecord,\n key: string,\n fieldValue: any,\n getType: InferenceTypeBuilder\n) {\n let typesCount: TypesCount = typesCountRecord[key];\n if (!typesCount) {\n typesCount = {};\n typesCountRecord[key] = typesCount;\n }\n\n if (fieldValue != null) {\n // Check that fieldValue is not null or undefined before proceeding\n const type = getType(fieldValue);\n increaseTypeCount(type, typesCount, fieldValue, getType);\n }\n}\n\nfunction increaseValuesCount(\n typeValuesRecord: ValuesCountRecord,\n key: string,\n fieldValue: any,\n getType: InferenceTypeBuilder\n) {\n const dataType = getType(fieldValue);\n\n let valuesRecord: {\n values: any[];\n valuesCount: Map<any, number>;\n map?: ValuesCountRecord;\n } = typeValuesRecord[key];\n\n if (!valuesRecord) {\n valuesRecord = {\n values: [],\n valuesCount: new Map()\n };\n typeValuesRecord[key] = valuesRecord;\n }\n\n if (dataType === \"map\") {\n let mapValuesRecord: ValuesCountRecord | undefined = valuesRecord.map;\n if (!mapValuesRecord) {\n mapValuesRecord = {};\n valuesRecord.map = mapValuesRecord;\n }\n if (fieldValue)\n Object.entries(fieldValue).forEach(([key, value]) =>\n increaseValuesCount(mapValuesRecord as ValuesCountRecord, key, value, getType)\n );\n } else if (dataType === \"array\") {\n if (Array.isArray(fieldValue)) {\n fieldValue.forEach((value) => {\n valuesRecord.values.push(value);\n valuesRecord.valuesCount.set(value, (valuesRecord.valuesCount.get(value) ?? 0) + 1);\n });\n }\n } else {\n if (fieldValue) {\n valuesRecord.values.push(fieldValue);\n valuesRecord.valuesCount.set(fieldValue, (valuesRecord.valuesCount.get(fieldValue) ?? 0) + 1);\n }\n }\n}\n\nfunction getHighestTypesCount(typesCount: TypesCount): number {\n let highestCount = 0;\n Object.entries(typesCount).forEach(([type, count]) => {\n let countValue = 0;\n if (type === \"map\") {\n countValue = getHighestRecordCount(count as TypesCountRecord);\n } else if (type === \"array\") {\n countValue = getHighestTypesCount(count as TypesCount);\n } else {\n countValue = count as number;\n }\n if (countValue > highestCount) {\n highestCount = countValue;\n }\n });\n\n return highestCount;\n}\n\nfunction getHighestRecordCount(record: TypesCountRecord): number {\n return Object.entries(record)\n .map(([key, typesCount]) => getHighestTypesCount(typesCount))\n .reduce((a, b) => Math.max(a, b), 0);\n}\n\nfunction getMostProbableType(typesCount: TypesCount): DataType {\n let highestCount = -1;\n let probableType: DataType = \"string\"; // default\n Object.entries(typesCount).forEach(([type, count]) => {\n let countValue;\n if (type === \"map\") {\n countValue = getHighestRecordCount(count as TypesCountRecord);\n } else if (type === \"array\") {\n countValue = getHighestTypesCount(count as TypesCount);\n } else {\n countValue = count as number;\n }\n if (countValue > highestCount) {\n highestCount = countValue;\n probableType = type as DataType;\n }\n });\n return probableType;\n}\n\nfunction buildPropertyFromCount(\n key: string,\n totalDocsCount: number,\n mostProbableType: DataType,\n typesCount: TypesCount,\n valuesResult?: ValuesCountEntry\n): Property {\n let title: string | undefined;\n\n if (key) {\n title = formatString(key.toLowerCase());\n }\n\n let result: Property | undefined = undefined;\n if (mostProbableType === \"map\") {\n const highVariability = checkTypesCountHighVariability(typesCount);\n if (highVariability) {\n result = {\n dataType: \"map\",\n name: title,\n keyValue: true,\n properties: {}\n };\n }\n const properties = buildPropertiesFromCount(\n totalDocsCount,\n typesCount.map as TypesCountRecord,\n valuesResult ? valuesResult.mapValues : undefined\n );\n result = {\n dataType: \"map\",\n name: title,\n properties\n };\n } else if (mostProbableType === \"array\") {\n const arrayTypesCount = typesCount.array as TypesCount;\n const arrayMostProbableType = getMostProbableType(arrayTypesCount);\n const of = buildPropertyFromCount(\n key,\n totalDocsCount,\n arrayMostProbableType,\n arrayTypesCount,\n valuesResult\n );\n result = {\n dataType: \"array\",\n name: title,\n of\n };\n }\n\n if (!result) {\n const propertyProps: InferencePropertyBuilderProps = {\n name: key,\n totalDocsCount,\n valuesResult\n };\n if (mostProbableType === \"string\") {\n result = buildStringProperty(propertyProps);\n } else if (mostProbableType === \"reference\") {\n result = buildReferenceProperty(propertyProps);\n } else {\n result = {\n dataType: mostProbableType\n } as Property;\n }\n\n if (title) {\n result.name = title;\n }\n\n const validation = buildValidation(propertyProps);\n if (validation) {\n result.validation = validation;\n }\n }\n\n return {\n ...result,\n editable: true\n };\n}\n\nfunction buildPropertiesFromCount(\n totalDocsCount: number,\n typesCountRecord: TypesCountRecord,\n valuesCountRecord?: ValuesCountRecord\n): Properties {\n const res: Properties = {};\n Object.entries(typesCountRecord).forEach(([key, typesCount]) => {\n const mostProbableType = getMostProbableType(typesCount);\n res[key] = buildPropertyFromCount(\n key,\n totalDocsCount,\n mostProbableType,\n typesCount,\n valuesCountRecord ? valuesCountRecord[key] : undefined\n );\n });\n return res;\n}\n\nfunction countMaxDocumentsUnder(typesCount: TypesCount) {\n let count = 0;\n Object.entries(typesCount).forEach(([type, value]) => {\n if (typeof value === \"object\") {\n count = Math.max(count, countMaxDocumentsUnder(value as TypesCountRecord));\n } else {\n count = Math.max(count, value as number);\n }\n });\n return count;\n}\n\nfunction getMostProbableTypeInArray(\n array: any[],\n getType: InferenceTypeBuilder\n): DataType {\n let typesCount: TypesCount = {};\n array.forEach((value) => {\n increaseTypeCount(getType(value), typesCount, value, getType);\n });\n return getMostProbableType(typesCount);\n}\n\nfunction checkTypesCountHighVariability(typesCount: TypesCount) {\n const maxCount = countMaxDocumentsUnder(typesCount);\n let keysWithFewValues = 0;\n Object.entries(typesCount.map ?? {}).forEach(([key, value]) => {\n const count = countMaxDocumentsUnder(value);\n if (count < maxCount / 3) {\n keysWithFewValues++;\n }\n });\n return keysWithFewValues / Object.entries(typesCount.map ?? {}).length > 0.5;\n}\n\nfunction formatString(input: string): string {\n const normalized = input\n .replace(/[_\\-]+/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .toLowerCase();\n\n // Split the normalized string into words\n const words = normalized.split(\" \");\n\n // Capitalize the first letter of each word and join them with a space\n const formatted = words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n return formatted;\n}\n\nexport function inferTypeFromValue(value: any): DataType {\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"boolean\") return \"boolean\";\n if (Array.isArray(value)) return \"array\";\n if (typeof value === \"object\") return \"map\";\n return \"string\";\n}\n"],"names":["findCommonInitialStringInPath","valuesCount","getPath","value","DocumentReference","pathWithSlash","v","s","searchedPath","path","extractEnumFromValues","values","enumValues","unslugify","a","b","IMAGE_EXTENSIONS","AUDIO_EXTENSIONS","VIDEO_EXTENSIONS","emailRegEx","buildStringProperty","totalDocsCount","valuesResult","stringProperty","totalEntriesCount","totalValues","config","probablyAURL","probablyAnEmail","probablyUserIds","fileType","probableFileType","probablyAnImage","extension","probablyAudio","probablyVideo","buildValidation","buildReferenceProperty","buildEntityPropertiesFromData","data","getType","typesCount","entry","key","increaseMapTypeCount","increaseValuesCount","buildPropertiesFromCount","buildPropertyFromData","property","increaseTypeCount","resolveEnumValues","newEnumValues","generatedProperty","buildPropertyFromCount","mergeDeep","buildPropertiesOrder","properties","priorityKeys","lowerCasePriorityKeys","propOrder","k","keys","type","fieldValue","mapTypesCount","arrayTypesCount","arrayType","getMostProbableTypeInArray","typesCountRecord","typeValuesRecord","dataType","valuesRecord","mapValuesRecord","getHighestTypesCount","highestCount","count","countValue","getHighestRecordCount","record","getMostProbableType","probableType","mostProbableType","title","formatString","result","checkTypesCountHighVariability","arrayMostProbableType","of","propertyProps","validation","valuesCountRecord","res","countMaxDocumentsUnder","array","maxCount","keysWithFewValues","input","word","inferTypeFromValue"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(c,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@firecms/core"),require("@firebase/firestore")):typeof define=="function"&&define.amd?define(["exports","@firecms/core","@firebase/firestore"],l):(c=typeof globalThis<"u"?globalThis:c||self,l(c["FireCMS schema inference"]={},c.core,c.firestore))})(this,function(c,l,j){"use strict";function E(r){if(!r)return;function e(n){return typeof n=="string"?n:n instanceof j.DocumentReference?n.path:void 0}const s=r.values.map(n=>e(n)).filter(n=>!!n).find(n=>n.includes("/"));if(!s)return;const i=s.substr(0,s.lastIndexOf("/"));return r.values.filter(n=>{const a=e(n);return a?a.startsWith(i):!1}).length>r.values.length/3*2?i:void 0}function p(r){if(!Array.isArray(r))return[];const e=r.map(t=>typeof t=="string"?{id:t,label:l.unslugify(t)}:null).filter(Boolean);return e.sort((t,s)=>t.label.localeCompare(s.label)),e}const P=[".jpg",".jpeg",".png",".webp",".gif",".avif"],S=[".mp3",".ogg",".opus",".aac"],C=[".avi",".mp4"],F=/^[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])?)*$/;function I({totalDocsCount:r,valuesResult:e}){let t={dataType:"string"};if(e){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;n&&(o.url=!0);const a=e.values.filter(f=>typeof f=="string"&&F.test(f)).length>r/3*2;a&&(o.email=!0);const u=e.values.filter(f=>typeof f=="string"&&f.length===28&&!f.includes(" ")).length>r/3*2;if(u&&(o.readOnly=!0),!a&&!n&&!u&&!n&&i<s/3){const f=p(Array.from(e.valuesCount.keys()));Object.keys(f).length>1&&(o.enumValues=f)}if(!a&&!n&&!u&&!n&&!o.enumValues){const f=M(e,r);f&&(o.storage={acceptedFiles:[f],storagePath:E(e)??"/"})}Object.keys(o).length>0&&(t={...t,...o,editable:!0})}return t}function M(r,e){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"&&C.some(a=>n.toString().endsWith(a))).length>e/3*2;return t?"image/*":s?"audio/*":i?"video/*":!1}function V({totalDocsCount:r,valuesResult:e}){if(e){const t=e.values.length;if(r===t)return{required:!0}}}function w({totalDocsCount:r,valuesResult:e}){return{dataType:"reference",path:E(e)??"!!!FIX_ME!!!",editable:!0}}async function z(r,e){const t={},s={};return r&&r.forEach(i=>{i&&Object.entries(i).forEach(([o,n])=>{A(t,o,n,e),h(s,o,n,e)})}),T(r.length,t,s)}function _(r,e,t){const s={},i={};r&&r.forEach(a=>{m(e.dataType,s,a,t),h(i,"inferred_prop",a,t)});const o="enumValues"in e?l.resolveEnumValues(e.enumValues):void 0;if(o){const a=p(Array.from(i.inferred_prop.valuesCount.keys()));return{...e,enumValues:[...a,...o]}}const n=y("inferred_prop",r.length,e.dataType,s,i.inferred_prop);return l.mergeDeep(n,e)}function Z(r,e){const t=(e??[]).map(o=>o.toLowerCase());function s(o){const n=o.toLowerCase();return t.includes(n)?4:n==="title"||n==="name"||n==="title"||n==="name"?3:n.includes("title")||n.includes("name")?2:n.includes("image")||n.includes("picture")?1:0}const i=Object.keys(r);return i.sort(),i.sort((o,n)=>s(n)-s(o)),i}function m(r,e,t,s){if(r==="map"){if(t){let i=e[r];i||(i={},e[r]=i),Object.entries(t).forEach(([o,n])=>{A(i,o,n,s)})}}else if(r==="array"){let i=e[r];if(i||(i={},e[r]=i),t&&Array.isArray(t)&&t.length>0){const o=x(t,s);i[o]?i[o]++:i[o]=1}}else e[r]?e[r]++:e[r]=1}function A(r,e,t,s){let i=r[e];if(i||(i={},r[e]=i),t!=null){const o=s(t);m(o,i,t,s)}}function h(r,e,t,s){const i=s(t);let o=r[e];if(o||(o={values:[],valuesCount:new Map},r[e]=o),i==="map"){let n=o.map;n||(n={},o.map=n),t&&Object.entries(t).forEach(([a,u])=>h(n,a,u,s))}else i==="array"?Array.isArray(t)&&t.forEach(n=>{o.values.push(n),o.valuesCount.set(n,(o.valuesCount.get(n)??0)+1)}):t&&(o.values.push(t),o.valuesCount.set(t,(o.valuesCount.get(t)??0)+1))}function g(r){let e=0;return Object.entries(r).forEach(([t,s])=>{let i=0;t==="map"?i=O(s):t==="array"?i=g(s):i=s,i>e&&(e=i)}),e}function O(r){return Object.entries(r).map(([e,t])=>g(t)).reduce((e,t)=>Math.max(e,t),0)}function d(r){let e=-1,t="string";return Object.entries(r).forEach(([s,i])=>{let o;s==="map"?o=O(i):s==="array"?o=g(i):o=i,o>e&&(e=o,t=s)}),t}function y(r,e,t,s,i){let o;r&&(o=N(r.toLowerCase()));let n;if(t==="map"){W(s)&&(n={dataType:"map",name:o,keyValue:!0,properties:{}});const u=T(e,s.map,i?i.mapValues:void 0);n={dataType:"map",name:o,properties:u}}else if(t==="array"){const a=s.array,u=d(a),f=y(r,e,u,a,i);n={dataType:"array",name:o,of:f}}if(!n){const a={name:r,totalDocsCount:e,valuesResult:i};t==="string"?n=I(a):t==="reference"?n=w(a):n={dataType:t},o&&(n.name=o);const u=V(a);u&&(n.validation=u)}return{...n,editable:!0}}function T(r,e,t){const s={};return Object.entries(e).forEach(([i,o])=>{const n=d(o);s[i]=y(i,r,n,o,t?t[i]:void 0)}),s}function b(r){let e=0;return Object.entries(r).forEach(([t,s])=>{typeof s=="object"?e=Math.max(e,b(s)):e=Math.max(e,s)}),e}function x(r,e){let t={};return r.forEach(s=>{m(e(s),t,s,e)}),d(t)}function W(r){const e=b(r);let t=0;return Object.entries(r.map??{}).forEach(([s,i])=>{b(i)<e/3&&t++}),t/Object.entries(r.map??{}).length>.5}function N(r){return r.replace(/[_\-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1)).join(" ")}function k(r){return typeof r=="string"?"string":typeof r=="number"?"number":typeof r=="boolean"?"boolean":Array.isArray(r)?"array":typeof r=="object"?"map":"string"}c.buildEntityPropertiesFromData=z,c.buildPropertiesOrder=Z,c.buildPropertyFromData=_,c.extractEnumFromValues=p,c.inferTypeFromValue=k,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
1
+ (function(u,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@firecms/core"),require("@firebase/firestore")):typeof define=="function"&&define.amd?define(["exports","@firecms/core","@firebase/firestore"],l):(u=typeof globalThis<"u"?globalThis:u||self,l(u["FireCMS schema inference"]={},u.core,u.firestore))})(this,function(u,l,j){"use strict";function A(r){if(!r)return;function e(n){return typeof n=="string"?n:n instanceof j.DocumentReference?n.path:void 0}const s=r.values.map(n=>e(n)).filter(n=>!!n).find(n=>n.includes("/"));if(!s)return;const i=s.substr(0,s.lastIndexOf("/"));return r.values.filter(n=>{const a=e(n);return a?a.startsWith(i):!1}).length>r.values.length/3*2?i:void 0}function p(r){if(!Array.isArray(r))return[];const e=r.map(t=>typeof t=="string"?{id:t,label:l.unslugify(t)}:null).filter(Boolean);return e.sort((t,s)=>t.label.localeCompare(s.label)),e}const P=[".jpg",".jpeg",".png",".webp",".gif",".avif"],S=[".mp3",".ogg",".opus",".aac"],C=[".avi",".mp4"],F=/^[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])?)*$/;function I({totalDocsCount:r,valuesResult:e}){let t={dataType:"string"};if(e){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;n&&(o.url=!0);const a=e.values.filter(f=>typeof f=="string"&&F.test(f)).length>r/3*2;a&&(o.email=!0);const c=e.values.filter(f=>typeof f=="string"&&f.length===28&&!f.includes(" ")).length>r/3*2;if(c&&(o.readOnly=!0),!a&&!n&&!c&&!n&&i<s/3){const f=p(Array.from(e.valuesCount.keys()));Object.keys(f).length>1&&(o.enumValues=f)}if(!a&&!n&&!c&&!n&&!o.enumValues){const f=M(e,r);f&&(o.storage={acceptedFiles:[f],storagePath:A(e)??"/"})}Object.keys(o).length>0&&(t={...t,...o,editable:!0})}return t}function M(r,e){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"&&C.some(a=>n.toString().endsWith(a))).length>e/3*2;return t?"image/*":s?"audio/*":i?"video/*":!1}function V({totalDocsCount:r,valuesResult:e}){if(e){const t=e.values.length;if(r===t)return{required:!0}}}function w({totalDocsCount:r,valuesResult:e}){return{dataType:"reference",path:A(e)??"!!!FIX_ME!!!",editable:!0}}async function z(r,e){const t={},s={};return r&&r.forEach(i=>{i&&Object.entries(i).forEach(([o,n])=>{h(t,o,n,e),g(s,o,n,e)})}),T(r.length,t,s)}function _(r,e,t){const s={},i={};r&&r.forEach(a=>{m(e.dataType,s,a,t),g(i,"inferred_prop",a,t)});const o="enumValues"in e?l.resolveEnumValues(e.enumValues):void 0;if(o){const a=p(Array.from(i.inferred_prop.valuesCount.keys()));return{...e,enumValues:[...a,...o]}}const n=b("inferred_prop",r.length,e.dataType,s,i.inferred_prop);return l.mergeDeep(n,e)}function Z(r,e){const t=(e??[]).map(o=>o.toLowerCase());function s(o){const n=o.toLowerCase();return t.includes(n)?4:n==="title"||n==="name"?3:n.includes("title")||n.includes("name")?2:n.includes("image")||n.includes("picture")?1:0}const i=Object.keys(r);return i.sort(),i.sort((o,n)=>s(n)-s(o)),i}function m(r,e,t,s){if(r==="map"){if(t){let i=e[r];i||(i={},e[r]=i),Object.entries(t).forEach(([o,n])=>{h(i,o,n,s)})}}else if(r==="array"){let i=e[r];if(i||(i={},e[r]=i),t&&Array.isArray(t)&&t.length>0){const o=x(t,s);if(o==="map"){let n=i[o];n||(n={}),t.forEach(a=>{Object.entries(a).forEach(([c,f])=>h(n,c,f,s))}),i[o]=n}else i[o]?i[o]++:i[o]=1}}else e[r]?e[r]++:e[r]=1}function h(r,e,t,s){let i=r[e];if(i||(i={},r[e]=i),t!=null){const o=s(t);m(o,i,t,s)}}function g(r,e,t,s){const i=s(t);let o=r[e];if(o||(o={values:[],valuesCount:new Map},r[e]=o),i==="map"){let n=o.map;n||(n={},o.map=n),t&&Object.entries(t).forEach(([a,c])=>g(n,a,c,s))}else i==="array"?Array.isArray(t)&&t.forEach(n=>{o.values.push(n),o.valuesCount.set(n,(o.valuesCount.get(n)??0)+1)}):t&&(o.values.push(t),o.valuesCount.set(t,(o.valuesCount.get(t)??0)+1))}function y(r){let e=0;return Object.entries(r).forEach(([t,s])=>{let i=0;t==="map"?i=O(s):t==="array"?i=y(s):i=s,i>e&&(e=i)}),e}function O(r){return Object.entries(r).map(([e,t])=>y(t)).reduce((e,t)=>Math.max(e,t),0)}function d(r){let e=-1,t="string";return Object.entries(r).forEach(([s,i])=>{let o;s==="map"?o=O(i):s==="array"?o=y(i):o=i,o>e&&(e=o,t=s)}),t}function b(r,e,t,s,i){let o;r&&(o=N(r.toLowerCase()));let n;if(t==="map"){W(s)&&(n={dataType:"map",name:o,keyValue:!0,properties:{}});const c=T(e,s.map,i?i.mapValues:void 0);n={dataType:"map",name:o,properties:c}}else if(t==="array"){const a=s.array,c=d(a),f=b(r,e,c,a,i);n={dataType:"array",name:o,of:f}}if(!n){const a={name:r,totalDocsCount:e,valuesResult:i};t==="string"?n=I(a):t==="reference"?n=w(a):n={dataType:t},o&&(n.name=o);const c=V(a);c&&(n.validation=c)}return{...n,editable:!0}}function T(r,e,t){const s={};return Object.entries(e).forEach(([i,o])=>{const n=d(o);s[i]=b(i,r,n,o,t?t[i]:void 0)}),s}function E(r){let e=0;return Object.entries(r).forEach(([t,s])=>{typeof s=="object"?e=Math.max(e,E(s)):e=Math.max(e,s)}),e}function x(r,e){let t={};return r.forEach(s=>{m(e(s),t,s,e)}),d(t)}function W(r){const e=E(r);let t=0;return Object.entries(r.map??{}).forEach(([s,i])=>{E(i)<e/3&&t++}),t/Object.entries(r.map??{}).length>.5}function N(r){return r.replace(/[_\-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1)).join(" ")}function k(r){return typeof r=="string"?"string":typeof r=="number"?"number":typeof r=="boolean"?"boolean":Array.isArray(r)?"array":typeof r=="object"?"map":"string"}u.buildEntityPropertiesFromData=z,u.buildPropertiesOrder=Z,u.buildPropertyFromData=_,u.extractEnumFromValues=p,u.inferTypeFromValue=k,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.js.map