@firecms/schema_inference 3.0.0-beta.1 → 3.0.0-beta.2-pre.2
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 +35 -33
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/package.json +5 -5
- package/src/collection_builder.ts +16 -12
- package/src/util.ts +10 -2
package/dist/index.es.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { unslugify as b, resolveEnumValues as T, mergeDeep as j } from "@firecms/core";
|
|
2
2
|
import { DocumentReference as P } from "firebase/firestore";
|
|
3
|
-
function
|
|
3
|
+
function y(r) {
|
|
4
4
|
if (!r)
|
|
5
5
|
return;
|
|
6
6
|
function e(i) {
|
|
@@ -15,8 +15,10 @@ function d(r) {
|
|
|
15
15
|
return a ? a.startsWith(n) : !1;
|
|
16
16
|
}).length > r.values.length / 3 * 2 ? n : void 0;
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
18
|
+
function d(r) {
|
|
19
|
+
if (!Array.isArray(r))
|
|
20
|
+
return [];
|
|
21
|
+
const e = r.map((t) => typeof t == "string" ? { id: t, label: b(t) } : null).filter(Boolean);
|
|
20
22
|
return e.sort((t, s) => t.label.localeCompare(s.label)), e;
|
|
21
23
|
}
|
|
22
24
|
const I = [".jpg", ".png", ".webp", ".gif"], S = [".mp3", ".ogg", ".opus", ".aac"], M = [".avi", ".mp4"], x = /^[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])?)*$/;
|
|
@@ -28,20 +30,20 @@ function C({
|
|
|
28
30
|
dataType: "string"
|
|
29
31
|
};
|
|
30
32
|
if (e) {
|
|
31
|
-
const s = e.values.length, n = Array.from(e.valuesCount.keys()).length, o = {}, i = e.values.filter((
|
|
33
|
+
const s = e.values.length, n = Array.from(e.valuesCount.keys()).length, o = {}, i = e.values.filter((f) => typeof f == "string" && f.toString().startsWith("http")).length > r / 3 * 2;
|
|
32
34
|
i && (o.url = !0);
|
|
33
|
-
const a = e.values.filter((
|
|
35
|
+
const a = e.values.filter((f) => typeof f == "string" && x.test(f)).length > r / 3 * 2;
|
|
34
36
|
a && (o.email = !0);
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
const
|
|
38
|
-
Object.keys(
|
|
37
|
+
const c = e.values.filter((f) => typeof f == "string" && f.length === 28 && !f.includes(" ")).length > r / 3 * 2;
|
|
38
|
+
if (c && (o.readOnly = !0), !a && !i && !c && !i && n < s / 3) {
|
|
39
|
+
const f = d(Array.from(e.valuesCount.keys()));
|
|
40
|
+
Object.keys(f).length > 1 && (o.enumValues = f);
|
|
39
41
|
}
|
|
40
|
-
if (!a && !i && !
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
acceptedFiles: [
|
|
44
|
-
storagePath:
|
|
42
|
+
if (!a && !i && !c && !i && !o.enumValues) {
|
|
43
|
+
const f = F(e, r);
|
|
44
|
+
f && (o.storage = {
|
|
45
|
+
acceptedFiles: [f],
|
|
46
|
+
storagePath: y(e) ?? "/"
|
|
45
47
|
});
|
|
46
48
|
}
|
|
47
49
|
Object.keys(o).length > 0 && (t = {
|
|
@@ -74,26 +76,26 @@ function _({
|
|
|
74
76
|
}) {
|
|
75
77
|
return {
|
|
76
78
|
dataType: "reference",
|
|
77
|
-
path:
|
|
79
|
+
path: y(e) ?? "!!!FIX_ME!!!",
|
|
78
80
|
editable: !0
|
|
79
81
|
};
|
|
80
82
|
}
|
|
81
83
|
async function k(r, e) {
|
|
82
84
|
const t = {}, s = {};
|
|
83
|
-
return r.forEach((n) => {
|
|
85
|
+
return r && r.forEach((n) => {
|
|
84
86
|
n && Object.entries(n).forEach(([o, i]) => {
|
|
85
87
|
E(t, o, i, e), p(s, o, i, e);
|
|
86
88
|
});
|
|
87
|
-
}),
|
|
89
|
+
}), O(r.length, t, s);
|
|
88
90
|
}
|
|
89
91
|
function w(r, e, t) {
|
|
90
92
|
const s = {}, n = {};
|
|
91
|
-
r.forEach((a) => {
|
|
93
|
+
r && r.forEach((a) => {
|
|
92
94
|
l(e.dataType, s, a, t), p(n, "inferred_prop", a, t);
|
|
93
95
|
});
|
|
94
96
|
const o = "enumValues" in e ? T(e.enumValues) : void 0;
|
|
95
97
|
if (o) {
|
|
96
|
-
const a =
|
|
98
|
+
const a = d(Array.from(n.inferred_prop.valuesCount.keys()));
|
|
97
99
|
return {
|
|
98
100
|
...e,
|
|
99
101
|
enumValues: [...a, ...o]
|
|
@@ -102,7 +104,7 @@ function w(r, e, t) {
|
|
|
102
104
|
const i = g("inferred_prop", r.length, e.dataType, s, n.inferred_prop);
|
|
103
105
|
return j(i, e);
|
|
104
106
|
}
|
|
105
|
-
function
|
|
107
|
+
function U(r) {
|
|
106
108
|
function e(s) {
|
|
107
109
|
const n = s.toLowerCase();
|
|
108
110
|
return n === "title" || n === "name" ? 3 : n.includes("title") || n.includes("name") ? 2 : n.includes("image") || n.includes("picture") ? 1 : 0;
|
|
@@ -142,7 +144,7 @@ function p(r, e, t, s) {
|
|
|
142
144
|
valuesCount: /* @__PURE__ */ new Map()
|
|
143
145
|
}, r[e] = o), n === "map") {
|
|
144
146
|
let i = o.map;
|
|
145
|
-
i || (i = {}, o.map = i), t && Object.entries(t).forEach(([a,
|
|
147
|
+
i || (i = {}, o.map = i), t && Object.entries(t).forEach(([a, c]) => p(i, a, c, s));
|
|
146
148
|
} else
|
|
147
149
|
n === "array" ? Array.isArray(t) && t.forEach((i) => {
|
|
148
150
|
o.values.push(i), o.valuesCount.set(i, (o.valuesCount.get(i) ?? 0) + 1);
|
|
@@ -152,17 +154,17 @@ function m(r) {
|
|
|
152
154
|
let e = 0;
|
|
153
155
|
return Object.entries(r).forEach(([t, s]) => {
|
|
154
156
|
let n = 0;
|
|
155
|
-
t === "map" ? n =
|
|
157
|
+
t === "map" ? n = A(s) : t === "array" ? n = m(s) : n = s, n > e && (e = n);
|
|
156
158
|
}), e;
|
|
157
159
|
}
|
|
158
|
-
function
|
|
160
|
+
function A(r) {
|
|
159
161
|
return Object.entries(r).map(([e, t]) => m(t)).reduce((e, t) => Math.max(e, t), 0);
|
|
160
162
|
}
|
|
161
163
|
function h(r) {
|
|
162
164
|
let e = -1, t = "string";
|
|
163
165
|
return Object.entries(r).forEach(([s, n]) => {
|
|
164
166
|
let o;
|
|
165
|
-
s === "map" ? o =
|
|
167
|
+
s === "map" ? o = A(n) : s === "array" ? o = m(n) : o = n, o > e && (e = o, t = s);
|
|
166
168
|
}), t;
|
|
167
169
|
}
|
|
168
170
|
function g(r, e, t, s, n) {
|
|
@@ -176,18 +178,18 @@ function g(r, e, t, s, n) {
|
|
|
176
178
|
keyValue: !0,
|
|
177
179
|
properties: {}
|
|
178
180
|
});
|
|
179
|
-
const
|
|
181
|
+
const c = O(e, s.map, n ? n.mapValues : void 0);
|
|
180
182
|
i = {
|
|
181
183
|
dataType: "map",
|
|
182
184
|
name: o,
|
|
183
|
-
properties:
|
|
185
|
+
properties: c
|
|
184
186
|
};
|
|
185
187
|
} else if (t === "array") {
|
|
186
|
-
const a = s.array,
|
|
188
|
+
const a = s.array, c = h(a), f = g(r, e, c, a, n);
|
|
187
189
|
i = {
|
|
188
190
|
dataType: "array",
|
|
189
191
|
name: o,
|
|
190
|
-
of:
|
|
192
|
+
of: f
|
|
191
193
|
};
|
|
192
194
|
}
|
|
193
195
|
if (!i) {
|
|
@@ -199,15 +201,15 @@ function g(r, e, t, s, n) {
|
|
|
199
201
|
t === "string" ? i = C(a) : t === "reference" ? i = _(a) : i = {
|
|
200
202
|
dataType: t
|
|
201
203
|
}, o && (i.name = o);
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
+
const c = V(a);
|
|
205
|
+
c && (i.validation = c);
|
|
204
206
|
}
|
|
205
207
|
return {
|
|
206
208
|
...i,
|
|
207
209
|
editable: !0
|
|
208
210
|
};
|
|
209
211
|
}
|
|
210
|
-
function
|
|
212
|
+
function O(r, e, t) {
|
|
211
213
|
const s = {};
|
|
212
214
|
return Object.entries(e).forEach(([n, o]) => {
|
|
213
215
|
const i = h(o);
|
|
@@ -235,8 +237,8 @@ function W(r) {
|
|
|
235
237
|
}
|
|
236
238
|
export {
|
|
237
239
|
k as buildEntityPropertiesFromData,
|
|
238
|
-
|
|
240
|
+
U as buildPropertiesOrder,
|
|
239
241
|
w as buildPropertyFromData,
|
|
240
|
-
|
|
242
|
+
d as extractEnumFromValues
|
|
241
243
|
};
|
|
242
244
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -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: string[]) {\n const enumValues = values\n .map((value) => ({ id: value, label: unslugify(value) }));\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\", \".png\", \".webp\", \".gif\"];\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\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 unslugify\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 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 // 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 data.forEach((entry) => {\n increaseTypeCount(property.dataType, typesCount, entry, getType);\n increaseValuesCount(valuesCount, \"inferred_prop\", entry, getType);\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>): string [] {\n function propOrder(s: string) {\n const k = s.toLowerCase();\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 = unslugify(key);\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\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","propOrder","k","keys","type","fieldValue","mapTypesCount","arrayTypesCount","arrayType","getMostProbableTypeInArray","typesCountRecord","typeValuesRecord","dataType","valuesRecord","mapValuesRecord","getHighestTypesCount","highestCount","count","countValue","getHighestRecordCount","record","getMostProbableType","probableType","mostProbableType","title","result","checkTypesCountHighVariability","arrayMostProbableType","of","propertyProps","validation","valuesCountRecord","res","countMaxDocumentsUnder","array","maxCount","keysWithFewValues"],"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\", \".png\", \".webp\", \".gif\"];\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\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 unslugify\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>): string [] {\n function propOrder(s: string) {\n const k = s.toLowerCase();\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 = unslugify(key);\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\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","propOrder","k","keys","type","fieldValue","mapTypesCount","arrayTypesCount","arrayType","getMostProbableTypeInArray","typesCountRecord","typeValuesRecord","dataType","valuesRecord","mapValuesRecord","getHighestTypesCount","highestCount","count","countValue","getHighestRecordCount","record","getMostProbableType","probableType","mostProbableType","title","result","checkTypesCountHighVariability","arrayMostProbableType","of","propertyProps","validation","valuesCountRecord","res","countMaxDocumentsUnder","array","maxCount","keysWithFewValues"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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={},u.core,u.firestore))})(this,function(u,l,P){"use strict";function E(r){if(!r)return;function e(i){return typeof i=="string"?i:i instanceof P.DocumentReference?i.path:void 0}const s=r.values.map(i=>e(i)).filter(i=>!!i).find(i=>i.includes("/"));if(!s)return;const n=s.substr(0,s.lastIndexOf("/"));return r.values.filter(i=>{const a=e(i);return a?a.startsWith(n):!1}).length>r.values.length/3*2?n:void 0}function p(r){const e=r.map(t=>
|
|
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={},u.core,u.firestore))})(this,function(u,l,P){"use strict";function E(r){if(!r)return;function e(i){return typeof i=="string"?i:i instanceof P.DocumentReference?i.path:void 0}const s=r.values.map(i=>e(i)).filter(i=>!!i).find(i=>i.includes("/"));if(!s)return;const n=s.substr(0,s.lastIndexOf("/"));return r.values.filter(i=>{const a=e(i);return a?a.startsWith(n):!1}).length>r.values.length/3*2?n: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 j=[".jpg",".png",".webp",".gif"],S=[".mp3",".ogg",".opus",".aac"],F=[".avi",".mp4"],I=/^[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 M({totalDocsCount:r,valuesResult:e}){let t={dataType:"string"};if(e){const s=e.values.length,n=Array.from(e.valuesCount.keys()).length,o={},i=e.values.filter(f=>typeof f=="string"&&f.toString().startsWith("http")).length>r/3*2;i&&(o.url=!0);const a=e.values.filter(f=>typeof f=="string"&&I.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&&!i&&!c&&!i&&n<s/3){const f=p(Array.from(e.valuesCount.keys()));Object.keys(f).length>1&&(o.enumValues=f)}if(!a&&!i&&!c&&!i&&!o.enumValues){const f=C(e,r);f&&(o.storage={acceptedFiles:[f],storagePath:E(e)??"/"})}Object.keys(o).length>0&&(t={...t,...o,editable:!0})}return t}function C(r,e){const t=r.values.filter(i=>typeof i=="string"&&j.some(a=>i.toString().endsWith(a))).length>e/3*2,s=r.values.filter(i=>typeof i=="string"&&S.some(a=>i.toString().endsWith(a))).length>e/3*2,n=r.values.filter(i=>typeof i=="string"&&F.some(a=>i.toString().endsWith(a))).length>e/3*2;return t?"image/*":s?"audio/*":n?"video/*":!1}function V({totalDocsCount:r,valuesResult:e}){if(e){const t=e.values.length;if(r===t)return{required:!0}}}function _({totalDocsCount:r,valuesResult:e}){return{dataType:"reference",path:E(e)??"!!!FIX_ME!!!",editable:!0}}async function x(r,e){const t={},s={};return r&&r.forEach(n=>{n&&Object.entries(n).forEach(([o,i])=>{O(t,o,i,e),h(s,o,i,e)})}),T(r.length,t,s)}function z(r,e,t){const s={},n={};r&&r.forEach(a=>{m(e.dataType,s,a,t),h(n,"inferred_prop",a,t)});const o="enumValues"in e?l.resolveEnumValues(e.enumValues):void 0;if(o){const a=p(Array.from(n.inferred_prop.valuesCount.keys()));return{...e,enumValues:[...a,...o]}}const i=b("inferred_prop",r.length,e.dataType,s,n.inferred_prop);return l.mergeDeep(i,e)}function W(r){function e(s){const n=s.toLowerCase();return n==="title"||n==="name"?3:n.includes("title")||n.includes("name")?2:n.includes("image")||n.includes("picture")?1:0}const t=Object.keys(r);return t.sort(),t.sort((s,n)=>e(n)-e(s)),t}function m(r,e,t,s){if(r==="map"){if(t){let n=e[r];n||(n={},e[r]=n),Object.entries(t).forEach(([o,i])=>{O(n,o,i,s)})}}else if(r==="array"){let n=e[r];if(n||(n={},e[r]=n),t&&Array.isArray(t)&&t.length>0){const o=Z(t,s);n[o]?n[o]++:n[o]=1}}else e[r]?e[r]++:e[r]=1}function O(r,e,t,s){let n=r[e];if(n||(n={},r[e]=n),t!=null){const o=s(t);m(o,n,t,s)}}function h(r,e,t,s){const n=s(t);let o=r[e];if(o||(o={values:[],valuesCount:new Map},r[e]=o),n==="map"){let i=o.map;i||(i={},o.map=i),t&&Object.entries(t).forEach(([a,c])=>h(i,a,c,s))}else n==="array"?Array.isArray(t)&&t.forEach(i=>{o.values.push(i),o.valuesCount.set(i,(o.valuesCount.get(i)??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 n=0;t==="map"?n=A(s):t==="array"?n=g(s):n=s,n>e&&(e=n)}),e}function A(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,n])=>{let o;s==="map"?o=A(n):s==="array"?o=g(n):o=n,o>e&&(e=o,t=s)}),t}function b(r,e,t,s,n){let o;r&&(o=l.unslugify(r));let i;if(t==="map"){N(s)&&(i={dataType:"map",name:o,keyValue:!0,properties:{}});const c=T(e,s.map,n?n.mapValues:void 0);i={dataType:"map",name:o,properties:c}}else if(t==="array"){const a=s.array,c=d(a),f=b(r,e,c,a,n);i={dataType:"array",name:o,of:f}}if(!i){const a={name:r,totalDocsCount:e,valuesResult:n};t==="string"?i=M(a):t==="reference"?i=_(a):i={dataType:t},o&&(i.name=o);const c=V(a);c&&(i.validation=c)}return{...i,editable:!0}}function T(r,e,t){const s={};return Object.entries(e).forEach(([n,o])=>{const i=d(o);s[n]=b(n,r,i,o,t?t[n]:void 0)}),s}function y(r){let e=0;return Object.entries(r).forEach(([t,s])=>{typeof s=="object"?e=Math.max(e,y(s)):e=Math.max(e,s)}),e}function Z(r,e){let t={};return r.forEach(s=>{m(e(s),t,s,e)}),d(t)}function N(r){const e=y(r);let t=0;return Object.entries(r.map??{}).forEach(([s,n])=>{y(n)<e/3&&t++}),t/Object.entries(r.map??{}).length>.5}u.buildEntityPropertiesFromData=x,u.buildPropertiesOrder=W,u.buildPropertyFromData=z,u.extractEnumFromValues=p,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.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: string[]) {\n const enumValues = values\n .map((value) => ({ id: value, label: unslugify(value) }));\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\", \".png\", \".webp\", \".gif\"];\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\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 unslugify\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 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 // 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 data.forEach((entry) => {\n increaseTypeCount(property.dataType, typesCount, entry, getType);\n increaseValuesCount(valuesCount, \"inferred_prop\", entry, getType);\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>): string [] {\n function propOrder(s: string) {\n const k = s.toLowerCase();\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 = unslugify(key);\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\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","propOrder","k","keys","type","fieldValue","mapTypesCount","arrayTypesCount","arrayType","getMostProbableTypeInArray","typesCountRecord","typeValuesRecord","dataType","valuesRecord","mapValuesRecord","getHighestTypesCount","highestCount","count","countValue","getHighestRecordCount","record","getMostProbableType","probableType","mostProbableType","title","result","checkTypesCountHighVariability","arrayMostProbableType","of","propertyProps","validation","valuesCountRecord","res","countMaxDocumentsUnder","array","maxCount","keysWithFewValues"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.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\", \".png\", \".webp\", \".gif\"];\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\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 unslugify\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>): string [] {\n function propOrder(s: string) {\n const k = s.toLowerCase();\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 = unslugify(key);\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\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","propOrder","k","keys","type","fieldValue","mapTypesCount","arrayTypesCount","arrayType","getMostProbableTypeInArray","typesCountRecord","typeValuesRecord","dataType","valuesRecord","mapValuesRecord","getHighestTypesCount","highestCount","count","countValue","getHighestRecordCount","record","getMostProbableType","probableType","mostProbableType","title","result","checkTypesCountHighVariability","arrayMostProbableType","of","propertyProps","validation","valuesCountRecord","res","countMaxDocumentsUnder","array","maxCount","keysWithFewValues"],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.0.0-beta.
|
|
2
|
+
"version": "3.0.0-beta.2-pre.2",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"name": "@firecms/schema_inference",
|
|
5
5
|
"access": "public",
|
|
6
|
-
"packageManager": "yarn@
|
|
6
|
+
"packageManager": "yarn@4.1.0",
|
|
7
7
|
"main": "./dist/index.umd.js",
|
|
8
8
|
"module": "./dist/index.es.js",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
10
10
|
"source": "src/index.ts",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@firecms/core": "^3.0.0-beta.
|
|
13
|
-
"@types/node": "^20.
|
|
12
|
+
"@firecms/core": "^3.0.0-beta.2-pre.2",
|
|
13
|
+
"@types/node": "^20.11.16",
|
|
14
14
|
"typescript": "^5.3.3"
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
@@ -22,5 +22,5 @@
|
|
|
22
22
|
"build": "vite build && tsc --emitDeclarationOnly -p tsconfig.prod.json",
|
|
23
23
|
"clean": "rm -rf dist && find ./src -name '*.js' -type f | xargs rm -f"
|
|
24
24
|
},
|
|
25
|
-
"gitHead": "
|
|
25
|
+
"gitHead": "f3f62fc3cbc4f0d9d1a26817a14cff06393b7c2b"
|
|
26
26
|
}
|
|
@@ -25,14 +25,16 @@ export type InferenceTypeBuilder = (value: any) => DataType;
|
|
|
25
25
|
export async function buildEntityPropertiesFromData(data: object[], getType: InferenceTypeBuilder): Promise<Properties> {
|
|
26
26
|
const typesCount: TypesCountRecord = {};
|
|
27
27
|
const valuesCount: ValuesCountRecord = {};
|
|
28
|
-
data
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
if (data) {
|
|
29
|
+
data.forEach((entry) => {
|
|
30
|
+
if (entry) {
|
|
31
|
+
Object.entries(entry).forEach(([key, value]) => {
|
|
32
|
+
increaseMapTypeCount(typesCount, key, value, getType);
|
|
33
|
+
increaseValuesCount(valuesCount, key, value, getType);
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
36
38
|
// console.log(util.inspect({ typesCount }, { showHidden: false, depth: null, colors: true }));
|
|
37
39
|
return buildPropertiesFromCount(data.length, typesCount, valuesCount);
|
|
38
40
|
}
|
|
@@ -40,10 +42,12 @@ export async function buildEntityPropertiesFromData(data: object[], getType: Inf
|
|
|
40
42
|
export function buildPropertyFromData(data: any[], property: Property, getType: InferenceTypeBuilder): Property {
|
|
41
43
|
const typesCount = {};
|
|
42
44
|
const valuesCount: ValuesCountRecord = {};
|
|
43
|
-
data
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
if (data) {
|
|
46
|
+
data.forEach((entry) => {
|
|
47
|
+
increaseTypeCount(property.dataType, typesCount, entry, getType);
|
|
48
|
+
increaseValuesCount(valuesCount, "inferred_prop", entry, getType);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
47
51
|
const enumValues = "enumValues" in property ? resolveEnumValues(property["enumValues"] as EnumValues) : undefined;
|
|
48
52
|
if (enumValues) {
|
|
49
53
|
const newEnumValues = extractEnumFromValues(Array.from(valuesCount["inferred_prop"].valuesCount.keys()));
|
package/src/util.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { unslugify } from "@firecms/core";
|
|
2
2
|
|
|
3
|
-
export function extractEnumFromValues(values:
|
|
3
|
+
export function extractEnumFromValues(values: unknown[]) {
|
|
4
|
+
if (!Array.isArray(values)) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
4
7
|
const enumValues = values
|
|
5
|
-
.map((value) =>
|
|
8
|
+
.map((value) => {
|
|
9
|
+
if (typeof value === "string") {
|
|
10
|
+
return ({ id: value, label: unslugify(value) });
|
|
11
|
+
} else
|
|
12
|
+
return null;
|
|
13
|
+
}).filter(Boolean) as Array<{ id: string, label: string }>;
|
|
6
14
|
enumValues.sort((a, b) => a.label.localeCompare(b.label));
|
|
7
15
|
return enumValues;
|
|
8
16
|
}
|