datasquirel/package-shared/functions/dsql/sql/sql-insert-generator.ts
2026-02-11 06:56:43 +01:00

92 lines
2.6 KiB
TypeScript

interface SQLInsertGenReturn {
query: string;
values: string[];
}
type DataFn = () => {
placeholder: string;
value: string | number | Float32Array<ArrayBuffer>;
};
type DataType = { [k: string]: string | number | DataFn | undefined | null };
type Params = {
data: DataType[];
tableName: string;
dbFullName?: string;
};
/**
* # SQL Insert Generator
*/
export default function sqlInsertGenerator({
tableName,
data,
dbFullName,
}: Params): SQLInsertGenReturn | undefined {
const finalDbName = dbFullName ? `${dbFullName}.` : "";
try {
if (Array.isArray(data) && data?.[0]) {
let insertKeys: string[] = [];
data.forEach((dt) => {
const kys = Object.keys(dt);
kys.forEach((ky) => {
if (!insertKeys.includes(ky)) {
insertKeys.push(ky);
}
});
});
let queryBatches: string[] = [];
let queryValues: string[] = [];
data.forEach((item) => {
queryBatches.push(
`(${insertKeys
.map((ky) => {
const value = item[ky];
const finalValue =
typeof value == "string" ||
typeof value == "number"
? String(value)
: value
? String(value().value)
: null;
if (!finalValue) {
return undefined;
}
queryValues.push(finalValue);
const placeholder =
typeof value == "function"
? value().placeholder
: "?";
return placeholder;
})
.filter((k) => Boolean(k))
.join(",")})`,
);
});
let query = `INSERT INTO ${finalDbName}${tableName} (${insertKeys.join(
",",
)}) VALUES ${queryBatches.join(",")}`;
return {
query: query,
values: queryValues,
};
} else {
return undefined;
}
} catch (/** @type {any} */ error: any) {
console.log(`SQL insert gen ERROR: ${error.message}`);
return undefined;
}
}