From 6e32bbb4e0f494615aa76e85ebf156f7abd5a07d Mon Sep 17 00:00:00 2001 From: Benjamin Toby <benoti.san@gmail.com> Date: Thu, 17 Apr 2025 10:49:34 +0100 Subject: [PATCH] Updates --- bun.lockb | Bin 45396 -> 59934 bytes dist/engine/schema-to-typedef.d.ts | 2 + dist/engine/schema-to-typedef.js | 71 ++++++++++++++ .../functions/dsql/db-schema-to-type.d.ts | 6 ++ .../functions/dsql/db-schema-to-type.js | 51 ++++++++++ .../functions/dsql/default-fields-regexp.d.ts | 7 ++ .../functions/dsql/default-fields-regexp.js | 13 +++ .../dsql/generate-type-definitions.d.ts | 11 +++ .../dsql/generate-type-definitions.js | 53 +++++++++++ engine/schema-to-typedef.ts | 71 ++++++++++++++ .../functions/dsql/db-schema-to-type.ts | 76 +++++++++++++++ .../functions/dsql/default-fields-regexp.ts | 16 ++++ .../dsql/generate-type-definitions.ts | 87 ++++++++++++++++++ package.json | 6 +- 14 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 dist/engine/schema-to-typedef.d.ts create mode 100644 dist/engine/schema-to-typedef.js create mode 100644 dist/package-shared/functions/dsql/db-schema-to-type.d.ts create mode 100644 dist/package-shared/functions/dsql/db-schema-to-type.js create mode 100644 dist/package-shared/functions/dsql/default-fields-regexp.d.ts create mode 100644 dist/package-shared/functions/dsql/default-fields-regexp.js create mode 100644 dist/package-shared/functions/dsql/generate-type-definitions.d.ts create mode 100644 dist/package-shared/functions/dsql/generate-type-definitions.js create mode 100644 engine/schema-to-typedef.ts create mode 100644 package-shared/functions/dsql/db-schema-to-type.ts create mode 100644 package-shared/functions/dsql/default-fields-regexp.ts create mode 100644 package-shared/functions/dsql/generate-type-definitions.ts diff --git a/bun.lockb b/bun.lockb index 4e361e78c44b7a55e65f96195b1882366309da81..ab9b56b167e3fa7f1e4e513845415a61afa51506 100755 GIT binary patch delta 15443 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 QnzPECMip~+{=@M909=rcO8@`> delta 6257 zcmb_g3s_WT8b0U1hzA(~8DLxiL9h~JfI*oM9F@G`0A2tOhzf!r_ltnnXhw54&04c> zZPhJNGcVMt<EV?;_C#B5Ubb>K+uU-un{8^Qxjn60o4fCK=8Vv@x@q-4y#M>Z-+#Y+ zhkyP}Z+gA?f%KSZNdD2H&{y8gGpy)3_vKrs&uvd`D>?srpRGHyy}Q0?FL~Jc@?Jp= z3)U(FrHEGNqI<+aCt(Q^1V{D4W;L&R;T)B(`nv6PedsGGqIAEXAi(0V=-u1~?g!m6 ze^?5ae-`;N^hR(Xcy4)V>pa-&+^q_0`nv0tFKQ{TpDPHuK7xRvjvfAjfTZKRFD>zk zi2XP~5YVzC0c|ipg(hHftOaxNvgYQN#f{~{7lHJW*IjmJh#(kXei9rEUJd5np9vKN zH0)?;uB|FX)n?d@(C1Jn5?l!V6Y%e#2Z6^yb2~er!@vp9_;aj+jsW-9bd9EU?(%lW zWUYc39FBrP;DO-lXbnln-@zD*qq)3pLHT?^co&+dTh>t904bEBb)Huz7%SxPMP<(4 z4b97)59W1Pi+VhPg<u|dv8wHYV<HmVfl12<2KR>+!T57r#NP5un!()Q7EG5rXl!V1 z!D0&YVCMmpwl<eGEEa@g(Qcii*)udw1@rz+#h`gW6TrT%Y+bbI+Ub)h_8#AUwqtAP zk!$pJ@4W%13Oe4%{G$C_X;aL|(S7{yb*+@Q$@FPhx-JlXo2V`@O&-N5G$c_|phfo( z)MUC8oF>18)J)h#`rOYVn=!UwP(IWYV38{Ps5-(bpMWtDMp-TLHB`FVP*Rvh9)rQL z(s8r$8mKHNFSX=5P+U(Sr{1FLgY_Ok@y2wqFU3Y$<qgng<a$$*pG7*+mpWklCyd;j z4>>WKWSl7;jTbdR&4U^Z)r-d_?}M^JiQKVt#h)%jS>;%q-AQg^ghg(F8V(ge&OR1t zR{(VkvP%C5pbMb%K#GmF>K5YkX3(X;bTN=RqOGzHK9+(iUgV6lNNN2jHpVJB`cZX^ zRel+H7Uaq5RC{BClA!#lNsq=26g$|edj(scMe&2vbb&Y|IclmHsqvhW_ao&VGLPqK zD0Ku`bul<*d203|q{`4DW`yN>2dY4|C*yp<wKe-jD76duW2B01*vH_QPEpIRMXLCQ z{mKpd=m9<L?NIJ^E+XY_Cn?e*j}H@sS)SVR(@^+6X?=Uc<=m5+hSW6fO>%})b*xoB z2LsPdQujI<Ze*tT&@`z&f@0&W($NU2j<d?aa5pX`P?NzT<qo83qgA&CM(lxKntTeW zTx6?jD#t_$f^tJGh3d|G4GONIl^ht=v*ZG({2O^Eplml(2;6b9M@i*_=t8_zJ_DnB zRB!<)G@7bSRw*Z%Iza29>4M2BpN5<A*~8wzFM?yJI>9PWjS+-27;(O_aF0OoX>%Wl zt{93<v`W`eGI4|*XN5odf&}0*C5Qlyipn??YGC#Tup4UV$v&`PkZNG&`WTTKZiDSY zFBBaDcmYGzYPZKcAh@s^n7Mv3zypA1s)3p97PtHs^Mq3cyE`XUD{wRB0geK=!We)X z91Czq;{XoKoX_7v9e^*58kpIhqwy5g3U~0Z*1u}tg3|zQ80Se1%&ha=Qe`eTU9;m9 zs^MnL^$GyyLba5eS<e8t9s5izqbG9#IGS2<Hki*ti^dOwIrL;MzZzhE1mM8T`cW1L z%&dRT0)ZLYF04_dpfVSDOw-J)*J_%X_2Zhp8FM~q<$j@+>&ZOhCjjR4fXMs50SOL0 znH$=uT7MXGM^9?)F!R}I*EF-p`@dN;FmuOSG<_@P>>v%?!4Gj;?qBs^?l_tS!tL;n z<hJ(j>9_8I-ppM&hwZoLwwOOJ;T`)e_kzHF%=N#w+p6o2273B0Z^d`{ZBKVaalR+1 zXXj4c*8V;H_Q!HtyXwz8<2&=)Z@Vk60J|@@b7yW_cJm6~>9^=;Gr(apz#VS^IQ$R0 zQb*kHN8x!kaWGZoDO4~)Pk(^AoBHP~)O(_y+VXAU5IP3c2^BxxCdSd?=?Yb5>gg<0 zJPlD4GEUOdql!&TpfgafLX9l2iAl7oK%qr8JzauIrqn`(?#a^AQ-wBhIGu-j8!CH- zO|;O4849h;*3&mosgzly(7ic&`gM^_Orw86eF8OWrcE44yJjl1ezKnQvuxrhDx9Uz z#3_3EEz}s2XDf6Ks&2MTypIk+?VPHo@M4=dj;e|kaXfV)o<RLe6mcRoA<m>@B~xi% zZV;7E80RDO4!|<mC~A%(X3=8A*>nnV4h<<)#L2V_@f13Pcq%28DdIF*g*cbqN1R8g za}_b4)*_xx=MgJ3rd$yVXanLx`W*2L%B)btBHB`c85QbDH_s-{qN(#RqZxWS098z4 zC1zBlr}D~iKG*%PWB=yR``MTmZ0oXlj1G*kjGUE<IG5xqMJ%T|h%4w2;&~KUt%#LW zg}92k5LZ+G8bz$3rW)*8v7S!X*u*-Ds#U~#T8y}XPSs-1O7t|m&L%d|vN}baPiGJ} zQ&PPmw$LiXt*-a$pY@^_8@;6${9Kz_uZq&w{lG^>)wV4h>CcdEEnw}cU0NFAThfYw zBCKqs=hvs3uK&j!*u?*{`DF4(frCePYE>RtNH6?q5M^zcV&@|KZ=UZ3xN)oBBmRnx z0C17yUp~S}0GCnzk;%V6`Nt*y0#$ES{4WEyOkpr^7jQRl4^RWt0(C$=&;T?7O~8Dh z8Ne08&OZx;5?~Hc3d{xgBgkLoi9jZR-%osD<}0*%BjbB$7!VFb0FgixFcgRfOh5v_ z*UMNS4p;~*0u}>HfTh6wd<|$r;sJoa$PQo`upD?0SONSL_!;mJuo74W@PhJME&w(I z?Z8HW|1ID*fO-ua15O0^!o+uxbpZdn$N_NQSHD}o3`Sx-fX|W8$wNd)U&6aHgxlwS z_>*)W;00s=qX6Cw-W}ehRMJ0r#C|VQy!JfZ6o9Ah*%Ke6c~3Z>(+n=h`NM%EfJe&9 z$4kXa$cKrSke6~8U<Q&k=DHTZAJEQ+NgWnXc{IR79SiU#^Jep=HvoJP_(0UqsZ9gy z)kswVmB2ip0w@Rg1n_!{1NeCIzqle`22cp_=}>^_Kpw!0$_vj6n+4<pxd3kjFLXA* zr-x6|1YkUn$z4oBf-7)EZh#x&2DxGGfIBJ$a8A|ZSqv`G(zW17zyJgR{eVV*+ic|X zg>d{~I^KR4FNW)Kd#dQl*z&lygjcTTb{nOuzI1fAS<>NYZMQ?h3)}sBRO1tSHimf~ z(6-GjZrhsGkSmF^Ev7^hw&__v%Gzs`_WM!AUbAG;)5g77VV-xmZLxn{-I_UM5{f6I zICgYRUy_^-X@@_paGJwB4{LKjj5_d_%VU;FB5x#zgh2YE(=6ddt=GN^DK&`d_Zh=7 zFfBj0#Q2W?><V*c_)8*&U`j^uoFLk|&us9#8znzpwxsK+&25r6BZxlP7n$ODXp**H zIbKoO87GOuQIk()8`{K5Ig0l7E-0^BQEL!qCn1Z68bnr?QECsO0#|I<VU)vk9p_O; z1}`<HeO2{PUPXX-IEXg6BBhH#^rFj{B4YXR=UA3>y2TJj1>R!Pa7=v|?#3|VJLTA8 zw|~-4zP!FW$7G<s`;94{SF=Aa4{^$W8tUC$!2Pf$I3ByQ^W^viC!@P_78+>gextP3 zKnwO~N$(oy<^ARq&->o4BPAD}US6@l8|##uY=UEXUI1UZHuTz_S1)bt&It;pH-2Lb z^E??&_8t&k*XN}<=*c~LVRA5)95AMM9vdgtZyS5P#`|n{0nfAK!LF_QQu>{HraNax zFzrTF&%0(x-ZbN<c}H@(3wT~YqrCk$|1Hn?L3fTWg#LZN80LBET>5G06~6~}^%!?T z2qhjgrg+{;m%T3Co%^8F);%%LtLo)~v+Md!IuP2O(;Pw%psMG2_Pws)>nq-_{HVKt z=K;5IyR~!q(u?igInEF|dC(|56G|T+G^gBp__v<2wkEe;v|BH<dnf+SR=M|5%8#I& z4r7?-HTSS?%Qo+0JDhOFBvUG%@ZAv<(P^CGdFJ&o6dRVF&)9<ki6*njjJMQ*?swTQ z>z`O|@ZBD*<|MP*d!B+lkE)XR0J{y2`IbRc+Zii8H;C4E=1Iq*>9bC=uW>cp2BBaz z#U2_<jfY12uGCD=?{ytM^p3CVwbu*uWP8O-XU_(^($4zy@+oVm$MbXxrGJ>^t3FM~ g*Uzadr<ETbq|qnRfnN00@hFOWVSvl}(R;f80!M;fs{jB1 diff --git a/dist/engine/schema-to-typedef.d.ts b/dist/engine/schema-to-typedef.d.ts new file mode 100644 index 0000000..237deca --- /dev/null +++ b/dist/engine/schema-to-typedef.d.ts @@ -0,0 +1,2 @@ +#! /usr/bin/env node +export {}; diff --git a/dist/engine/schema-to-typedef.js b/dist/engine/schema-to-typedef.js new file mode 100644 index 0000000..3f26a02 --- /dev/null +++ b/dist/engine/schema-to-typedef.js @@ -0,0 +1,71 @@ +#! /usr/bin/env node +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs_1 = __importDefault(require("fs")); +const __1 = __importDefault(require("..")); +const util_1 = require("util"); +const db_schema_to_type_1 = __importDefault(require("../package-shared/functions/dsql/db-schema-to-type")); +const path_1 = __importDefault(require("path")); +const args = (0, util_1.parseArgs)({ + args: process.argv, + options: { + apiKey: { + type: "string", + default: process.env.DSQL_FULL_ACCESS_API_KEY, + short: "k", + }, + database: { + type: "string", + default: process.env.DSQL_DB_NAME, + short: "d", + }, + outfile: { + type: "string", + default: process.env.DSQL_DB_NAME, + short: "o", + }, + }, + strict: false, +}); +(() => __awaiter(void 0, void 0, void 0, function* () { + try { + const { apiKey: key, database, outfile } = args.values; + if (!database || typeof database !== "string") + throw new Error("Database name is required"); + if (!key || typeof key !== "string") + throw new Error("API key is required"); + if (!outfile || typeof outfile !== "string") + throw new Error("Outfile are required"); + const schema = yield __1.default.getSchema({ + key, + database, + user_id: 1, + }); + const dbSchema = schema.payload; + if (!dbSchema) + throw new Error("No schema found"); + const definitions = (0, db_schema_to_type_1.default)({ dbSchema }); + const finalOutfile = path_1.default.resolve(process.cwd(), outfile); + const ourfileDir = path_1.default.dirname(finalOutfile); + if (!fs_1.default.existsSync(ourfileDir)) { + fs_1.default.mkdirSync(ourfileDir, { recursive: true }); + } + fs_1.default.writeFileSync(finalOutfile, (definitions === null || definitions === void 0 ? void 0 : definitions.join("\n\n")) || "", "utf-8"); + } + catch (error) { + console.log("Error:", error.message); + process.exit(1); + } +}))(); diff --git a/dist/package-shared/functions/dsql/db-schema-to-type.d.ts b/dist/package-shared/functions/dsql/db-schema-to-type.d.ts new file mode 100644 index 0000000..ed0cc73 --- /dev/null +++ b/dist/package-shared/functions/dsql/db-schema-to-type.d.ts @@ -0,0 +1,6 @@ +import { DSQL_DatabaseSchemaType } from "../../types"; +type Params = { + dbSchema?: DSQL_DatabaseSchemaType; +}; +export default function dbSchemaToType(params?: Params): string[] | undefined; +export {}; diff --git a/dist/package-shared/functions/dsql/db-schema-to-type.js b/dist/package-shared/functions/dsql/db-schema-to-type.js new file mode 100644 index 0000000..9e69590 --- /dev/null +++ b/dist/package-shared/functions/dsql/db-schema-to-type.js @@ -0,0 +1,51 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = dbSchemaToType; +const fs_1 = __importDefault(require("fs")); +const grab_dir_names_1 = __importDefault(require("../../utils/backend/names/grab-dir-names")); +const lodash_1 = __importDefault(require("lodash")); +const ejson_1 = __importDefault(require("../../utils/ejson")); +const generate_type_definitions_1 = __importDefault(require("./generate-type-definitions")); +const path_1 = __importDefault(require("path")); +function dbSchemaToType(params) { + let datasquirelSchema; + const defaultTableFieldsJSONFilePath = path_1.default.resolve(__dirname, "../../data/defaultFields.json"); + if (params === null || params === void 0 ? void 0 : params.dbSchema) { + datasquirelSchema = params.dbSchema; + } + else { + const { mainShemaJSONFilePath } = (0, grab_dir_names_1.default)(); + const mainSchema = ejson_1.default.parse(fs_1.default.readFileSync(mainShemaJSONFilePath, "utf-8")); + datasquirelSchema = mainSchema.find((sch) => sch.dbFullName == "datasquirel"); + } + if (!datasquirelSchema) + return; + let tableNames = `export const DsqlTables = [\n${datasquirelSchema.tables + .map((tbl) => ` "${tbl.tableName}",`) + .join("\n")}\n] as const`; + const defaultFields = ejson_1.default.parse(fs_1.default.readFileSync(defaultTableFieldsJSONFilePath, "utf-8")); + const dbTablesSchemas = datasquirelSchema.tables.map((tblSchm) => { + let newDefaultFields = lodash_1.default.cloneDeep(defaultFields); + return Object.assign(Object.assign({}, tblSchm), { fields: (params === null || params === void 0 ? void 0 : params.dbSchema) + ? tblSchm.fields + : [ + newDefaultFields.shift(), + newDefaultFields.shift(), + ...tblSchm.fields, + ...newDefaultFields, + ] }); + }); + const schemas = dbTablesSchemas + .map((table) => (0, generate_type_definitions_1.default)({ + paradigm: "TypeScript", + table, + typeDefName: `DSQL_DATASQUIREL_${table.tableName.toUpperCase()}`, + allValuesOptional: true, + addExport: true, + })) + .filter((schm) => typeof schm == "string"); + return [tableNames, ...schemas]; +} diff --git a/dist/package-shared/functions/dsql/default-fields-regexp.d.ts b/dist/package-shared/functions/dsql/default-fields-regexp.d.ts new file mode 100644 index 0000000..9a1f5b4 --- /dev/null +++ b/dist/package-shared/functions/dsql/default-fields-regexp.d.ts @@ -0,0 +1,7 @@ +/** + * Check for user in local storage + * + * @description Preventdefault, declare variables + */ +declare const defaultFieldsRegexp: RegExp; +export default defaultFieldsRegexp; diff --git a/dist/package-shared/functions/dsql/default-fields-regexp.js b/dist/package-shared/functions/dsql/default-fields-regexp.js new file mode 100644 index 0000000..239e5bd --- /dev/null +++ b/dist/package-shared/functions/dsql/default-fields-regexp.js @@ -0,0 +1,13 @@ +"use strict"; +// @ts-check +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Check for user in local storage + * + * @description Preventdefault, declare variables + */ +const defaultFieldsRegexp = /^id$|^uuid$|^date_created$|^date_created_code$|^date_created_timestamp$|^date_updated$|^date_updated_code$|^date_updated_timestamp$/; +//////////////////////////////////////// +//////////////////////////////////////// +//////////////////////////////////////// +exports.default = defaultFieldsRegexp; diff --git a/dist/package-shared/functions/dsql/generate-type-definitions.d.ts b/dist/package-shared/functions/dsql/generate-type-definitions.d.ts new file mode 100644 index 0000000..5560cb9 --- /dev/null +++ b/dist/package-shared/functions/dsql/generate-type-definitions.d.ts @@ -0,0 +1,11 @@ +import { DSQL_TableSchemaType } from "../../types"; +type Param = { + paradigm: "JavaScript" | "TypeScript" | undefined; + table: DSQL_TableSchemaType; + query?: any; + typeDefName?: string; + allValuesOptional?: boolean; + addExport?: boolean; +}; +export default function generateTypeDefinition({ paradigm, table, query, typeDefName, allValuesOptional, addExport, }: Param): string | null; +export {}; diff --git a/dist/package-shared/functions/dsql/generate-type-definitions.js b/dist/package-shared/functions/dsql/generate-type-definitions.js new file mode 100644 index 0000000..18d2438 --- /dev/null +++ b/dist/package-shared/functions/dsql/generate-type-definitions.js @@ -0,0 +1,53 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = generateTypeDefinition; +const default_fields_regexp_1 = __importDefault(require("./default-fields-regexp")); +function generateTypeDefinition({ paradigm, table, query, typeDefName, allValuesOptional, addExport, }) { + let typeDefinition = ``; + try { + const tdName = typeDefName || + `DSQL_${query.single}_${query.single_table}`.toUpperCase(); + const fields = table.fields; + function typeMap(type) { + if (type === null || type === void 0 ? void 0 : type.match(/int/i)) { + return "number"; + } + if (type === null || type === void 0 ? void 0 : type.match(/text|varchar|timestamp/i)) { + return "string"; + } + return "string"; + } + const typesArrayTypeScript = []; + const typesArrayJavascript = []; + typesArrayTypeScript.push(`${addExport ? "export " : ""}type ${tdName} = {`); + typesArrayJavascript.push(`/**\n * @typedef {object} ${tdName}`); + fields.forEach((field) => { + var _a; + const nullValue = allValuesOptional + ? "?" + : field.nullValue + ? "?" + : ((_a = field.fieldName) === null || _a === void 0 ? void 0 : _a.match(default_fields_regexp_1.default)) + ? "?" + : ""; + typesArrayTypeScript.push(` ${field.fieldName}${nullValue}: ${typeMap(field.dataType || "")};`); + typesArrayJavascript.push(` * @property {${typeMap(field.dataType || "")}${nullValue}} ${field.fieldName}`); + }); + typesArrayTypeScript.push(`}`); + typesArrayJavascript.push(` */`); + if (paradigm === null || paradigm === void 0 ? void 0 : paradigm.match(/javascript/i)) { + typeDefinition = typesArrayJavascript.join("\n"); + } + if (paradigm === null || paradigm === void 0 ? void 0 : paradigm.match(/typescript/i)) { + typeDefinition = typesArrayTypeScript.join("\n"); + } + } + catch (error) { + console.log(error.message); + typeDefinition = null; + } + return typeDefinition; +} diff --git a/engine/schema-to-typedef.ts b/engine/schema-to-typedef.ts new file mode 100644 index 0000000..ee5ef22 --- /dev/null +++ b/engine/schema-to-typedef.ts @@ -0,0 +1,71 @@ +#! /usr/bin/env node + +import inquirer from "inquirer"; +import fs from "fs"; +import datasquirel from ".."; +import { parseArgs } from "util"; +import { DSQL_DatabaseSchemaType } from "../package-shared/types"; +import dbSchemaToType from "../package-shared/functions/dsql/db-schema-to-type"; +import path from "path"; + +const args = parseArgs({ + args: process.argv, + options: { + apiKey: { + type: "string", + default: process.env.DSQL_FULL_ACCESS_API_KEY, + short: "k", + }, + database: { + type: "string", + default: process.env.DSQL_DB_NAME, + short: "d", + }, + outfile: { + type: "string", + default: process.env.DSQL_DB_NAME, + short: "o", + }, + }, + strict: false, +}); + +(async () => { + try { + const { apiKey: key, database, outfile } = args.values; + + if (!database || typeof database !== "string") + throw new Error("Database name is required"); + if (!key || typeof key !== "string") + throw new Error("API key is required"); + if (!outfile || typeof outfile !== "string") + throw new Error("Outfile are required"); + + const schema = await datasquirel.getSchema({ + key, + database, + user_id: 1, + }); + + const dbSchema = schema.payload as DSQL_DatabaseSchemaType | undefined; + + if (!dbSchema) throw new Error("No schema found"); + + const definitions = dbSchemaToType({ dbSchema }); + + const finalOutfile = path.resolve(process.cwd(), outfile); + const ourfileDir = path.dirname(finalOutfile); + if (!fs.existsSync(ourfileDir)) { + fs.mkdirSync(ourfileDir, { recursive: true }); + } + + fs.writeFileSync( + finalOutfile, + definitions?.join("\n\n") || "", + "utf-8" + ); + } catch (error: any) { + console.log("Error:", error.message); + process.exit(1); + } +})(); diff --git a/package-shared/functions/dsql/db-schema-to-type.ts b/package-shared/functions/dsql/db-schema-to-type.ts new file mode 100644 index 0000000..81ad7e8 --- /dev/null +++ b/package-shared/functions/dsql/db-schema-to-type.ts @@ -0,0 +1,76 @@ +import fs from "fs"; +import grabDirNames from "../../utils/backend/names/grab-dir-names"; +import { + DSQL_DatabaseSchemaType, + DSQL_FieldSchemaType, + DSQL_TableSchemaType, +} from "../../types"; +import _ from "lodash"; +import EJSON from "../../utils/ejson"; +import generateTypeDefinition from "./generate-type-definitions"; +import path from "path"; + +type Params = { + dbSchema?: DSQL_DatabaseSchemaType; +}; + +export default function dbSchemaToType(params?: Params): string[] | undefined { + let datasquirelSchema; + const defaultTableFieldsJSONFilePath = path.resolve( + __dirname, + "../../data/defaultFields.json" + ); + + if (params?.dbSchema) { + datasquirelSchema = params.dbSchema; + } else { + const { mainShemaJSONFilePath } = grabDirNames(); + + const mainSchema = EJSON.parse( + fs.readFileSync(mainShemaJSONFilePath, "utf-8") + ) as DSQL_DatabaseSchemaType[]; + + datasquirelSchema = mainSchema.find( + (sch) => sch.dbFullName == "datasquirel" + ); + } + + if (!datasquirelSchema) return; + + let tableNames = `export const DsqlTables = [\n${datasquirelSchema.tables + .map((tbl) => ` "${tbl.tableName}",`) + .join("\n")}\n] as const`; + + const defaultFields = EJSON.parse( + fs.readFileSync(defaultTableFieldsJSONFilePath, "utf-8") + ) as DSQL_FieldSchemaType[]; + + const dbTablesSchemas = datasquirelSchema.tables.map((tblSchm) => { + let newDefaultFields = _.cloneDeep(defaultFields); + return { + ...tblSchm, + fields: params?.dbSchema + ? tblSchm.fields + : [ + newDefaultFields.shift(), + newDefaultFields.shift(), + ...tblSchm.fields, + ...newDefaultFields, + ], + } as DSQL_TableSchemaType; + }); + + const schemas = dbTablesSchemas + .map((table) => + generateTypeDefinition({ + paradigm: "TypeScript", + table, + typeDefName: `DSQL_DATASQUIREL_${table.tableName.toUpperCase()}`, + allValuesOptional: true, + addExport: true, + }) + ) + .filter((schm) => typeof schm == "string"); + + return [tableNames, ...schemas]; +} diff --git a/package-shared/functions/dsql/default-fields-regexp.ts b/package-shared/functions/dsql/default-fields-regexp.ts new file mode 100644 index 0000000..aa5c987 --- /dev/null +++ b/package-shared/functions/dsql/default-fields-regexp.ts @@ -0,0 +1,16 @@ +// @ts-check + +/** + * Check for user in local storage + * + * @description Preventdefault, declare variables + */ + +const defaultFieldsRegexp = + /^id$|^uuid$|^date_created$|^date_created_code$|^date_created_timestamp$|^date_updated$|^date_updated_code$|^date_updated_timestamp$/; + +//////////////////////////////////////// +//////////////////////////////////////// +//////////////////////////////////////// + +export default defaultFieldsRegexp; diff --git a/package-shared/functions/dsql/generate-type-definitions.ts b/package-shared/functions/dsql/generate-type-definitions.ts new file mode 100644 index 0000000..7d426e9 --- /dev/null +++ b/package-shared/functions/dsql/generate-type-definitions.ts @@ -0,0 +1,87 @@ +import { DSQL_TableSchemaType } from "../../types"; +import defaultFieldsRegexp from "./default-fields-regexp"; + +type Param = { + paradigm: "JavaScript" | "TypeScript" | undefined; + table: DSQL_TableSchemaType; + query?: any; + typeDefName?: string; + allValuesOptional?: boolean; + addExport?: boolean; +}; + +export default function generateTypeDefinition({ + paradigm, + table, + query, + typeDefName, + allValuesOptional, + addExport, +}: Param): string | null { + let typeDefinition: string | null = ``; + + try { + const tdName = + typeDefName || + `DSQL_${query.single}_${query.single_table}`.toUpperCase(); + + const fields = table.fields; + + function typeMap(type: string) { + if (type?.match(/int/i)) { + return "number"; + } + if (type?.match(/text|varchar|timestamp/i)) { + return "string"; + } + + return "string"; + } + + const typesArrayTypeScript = []; + const typesArrayJavascript = []; + + typesArrayTypeScript.push( + `${addExport ? "export " : ""}type ${tdName} = {` + ); + typesArrayJavascript.push(`/**\n * @typedef {object} ${tdName}`); + + fields.forEach((field) => { + const nullValue = allValuesOptional + ? "?" + : field.nullValue + ? "?" + : field.fieldName?.match(defaultFieldsRegexp) + ? "?" + : ""; + + typesArrayTypeScript.push( + ` ${field.fieldName}${nullValue}: ${typeMap( + field.dataType || "" + )};` + ); + + typesArrayJavascript.push( + ` * @property {${typeMap(field.dataType || "")}${nullValue}} ${ + field.fieldName + }` + ); + }); + + typesArrayTypeScript.push(`}`); + typesArrayJavascript.push(` */`); + + if (paradigm?.match(/javascript/i)) { + typeDefinition = typesArrayJavascript.join("\n"); + } + + if (paradigm?.match(/typescript/i)) { + typeDefinition = typesArrayTypeScript.join("\n"); + } + } catch (error: any) { + console.log(error.message); + typeDefinition = null; + } + + return typeDefinition; +} diff --git a/package.json b/package.json index 0756444..4444014 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "@moduletrace/datasquirel", - "version": "4.2.9", + "version": "4.3.0", "description": "Cloud-based SQL data management tool", "main": "dist/index.js", "bin": { "dsql-watch": "dist/engine/dsql.js", - "dsql-dump": "dist/engine/dump.js" + "dsql-dump": "dist/engine/dump.js", + "dsql-schema-to-typedef": "dist/engine/schema-to-typedef.js" }, "scripts": { "dev": "tsc --watch" @@ -41,6 +42,7 @@ "dotenv": "^16.3.1", "generate-password": "^1.7.1", "google-auth-library": "^9.15.0", + "inquirer": "^12.5.2", "lodash": "^4.17.21", "mysql": "^2.18.1", "nodemailer": "^6.9.14",