From 71f57b0e46756d323c0d204f7796102b693c9685 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:36:41 -0500 Subject: [PATCH 01/40] added tedious dependency --- package.json | 2 + pnpm-lock.yaml | 482 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 483 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 7769a22..12f7632 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "mysql2": "^3.11.3", "pg": "^8.13.1", "prettier": "^3.3.3", + "tedious": "^18.6.1", "typescript": "^5.6.3", "unbuild": "^2.0.0", "vitest": "^2.1.4" @@ -78,6 +79,7 @@ "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", + "tedious": "*", "@electric-sql/pglite": "*" }, "peerDependenciesMeta": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e1f788..519ac73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: prettier: specifier: ^3.3.3 version: 3.3.3 + tedious: + specifier: ^18.6.1 + version: 18.6.1 typescript: specifier: ^5.6.3 version: 5.6.3 @@ -96,6 +99,70 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} + + '@azure/core-auth@1.9.0': + resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} + engines: {node: '>=18.0.0'} + + '@azure/core-client@1.9.2': + resolution: {integrity: sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==} + engines: {node: '>=18.0.0'} + + '@azure/core-http-compat@2.1.2': + resolution: {integrity: sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==} + engines: {node: '>=18.0.0'} + + '@azure/core-lro@2.7.2': + resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} + engines: {node: '>=18.0.0'} + + '@azure/core-paging@1.6.2': + resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} + engines: {node: '>=18.0.0'} + + '@azure/core-rest-pipeline@1.17.0': + resolution: {integrity: sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==} + engines: {node: '>=18.0.0'} + + '@azure/core-tracing@1.2.0': + resolution: {integrity: sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==} + engines: {node: '>=18.0.0'} + + '@azure/core-util@1.11.0': + resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} + engines: {node: '>=18.0.0'} + + '@azure/identity@4.5.0': + resolution: {integrity: sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==} + engines: {node: '>=18.0.0'} + + '@azure/keyvault-common@2.0.0': + resolution: {integrity: sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==} + engines: {node: '>=18.0.0'} + + '@azure/keyvault-keys@4.9.0': + resolution: {integrity: sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ==} + engines: {node: '>=18.0.0'} + + '@azure/logger@1.1.4': + resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} + engines: {node: '>=18.0.0'} + + '@azure/msal-browser@3.27.0': + resolution: {integrity: sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@14.16.0': + resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@2.16.0': + resolution: {integrity: sha512-oww0oJTOOvPKTVXqVyxfcFVjExQKYEkKR5KM0cTG3jnzt6u/MRMx8XaK49L/bxV35r9sCHQFjNlEShad9qGSYA==} + engines: {node: '>=16'} + '@babel/code-frame@7.25.7': resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} @@ -832,6 +899,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@js-joda/core@5.6.3': + resolution: {integrity: sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==} + '@libsql/client@0.14.0': resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==} @@ -1151,6 +1221,9 @@ packages: '@types/pg@8.11.10': resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} + '@types/readable-stream@4.0.18': + resolution: {integrity: sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -1255,6 +1328,10 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1270,6 +1347,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1338,6 +1419,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@6.0.16: + resolution: {integrity: sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1356,12 +1440,18 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1638,6 +1728,10 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -1867,6 +1961,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + electron-to-chromium@1.5.33: resolution: {integrity: sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==} @@ -2009,6 +2106,14 @@ packages: event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -2203,6 +2308,14 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -2264,6 +2377,11 @@ packages: is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2313,6 +2431,10 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -2354,6 +2476,9 @@ packages: js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-md4@0.3.2: + resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2391,6 +2516,22 @@ packages: engines: {node: '>=6'} hasBin: true + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2400,7 +2541,6 @@ packages: libsql@0.4.6: resolution: {integrity: sha512-F5M+ltteK6dCcpjMahrkgT96uFJvVI8aQ4r9f2AzHQjC7BkAYtvfMSTWGvRBezRgMUIU2h1Sy0pF9nOGOD5iyA==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lilconfig@3.1.2: @@ -2421,12 +2561,33 @@ packages: lodash.deburr@4.1.0: resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} @@ -2603,6 +2764,9 @@ packages: napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + native-duplexpair@1.0.0: + resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2673,6 +2837,10 @@ packages: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3040,6 +3208,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} @@ -3072,6 +3244,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3130,6 +3306,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3219,6 +3398,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sqlstring@2.3.3: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} @@ -3229,6 +3411,10 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3302,6 +3488,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tedious@18.6.1: + resolution: {integrity: sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw==} + engines: {node: '>=18'} + test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} @@ -3348,6 +3538,9 @@ packages: peerDependencies: typescript: '>=4.2.0' + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3424,6 +3617,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -3561,6 +3758,134 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@azure/abort-controller@2.1.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-auth@1.9.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.11.0 + tslib: 2.8.1 + + '@azure/core-client@1.9.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-rest-pipeline': 1.17.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.1.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-http-compat@2.1.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.17.0 + transitivePeerDependencies: + - supports-color + + '@azure/core-lro@2.7.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.1.4 + tslib: 2.8.1 + + '@azure/core-paging@1.6.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-rest-pipeline@1.17.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.2.0': + dependencies: + tslib: 2.8.1 + + '@azure/core-util@1.11.0': + dependencies: + '@azure/abort-controller': 2.1.2 + tslib: 2.8.1 + + '@azure/identity@4.5.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.17.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.1.4 + '@azure/msal-browser': 3.27.0 + '@azure/msal-node': 2.16.0 + events: 3.3.0 + jws: 4.0.0 + open: 8.4.2 + stoppable: 1.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/keyvault-common@2.0.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.17.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.1.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/keyvault-keys@4.9.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-http-compat': 2.1.2 + '@azure/core-lro': 2.7.2 + '@azure/core-paging': 1.6.2 + '@azure/core-rest-pipeline': 1.17.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/keyvault-common': 2.0.0 + '@azure/logger': 1.1.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/logger@1.1.4': + dependencies: + tslib: 2.8.1 + + '@azure/msal-browser@3.27.0': + dependencies: + '@azure/msal-common': 14.16.0 + + '@azure/msal-common@14.16.0': {} + + '@azure/msal-node@2.16.0': + dependencies: + '@azure/msal-common': 14.16.0 + jsonwebtoken: 9.0.2 + uuid: 8.3.2 + '@babel/code-frame@7.25.7': dependencies: '@babel/highlight': 7.25.7 @@ -4057,6 +4382,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-joda/core@5.6.3': {} + '@libsql/client@0.14.0': dependencies: '@libsql/core': 0.14.0 @@ -4318,6 +4645,11 @@ snapshots: pg-protocol: 1.7.0 pg-types: 4.0.2 + '@types/readable-stream@4.0.18': + dependencies: + '@types/node': 22.7.5 + safe-buffer: 5.1.2 + '@types/resolve@1.20.2': {} '@types/unist@2.0.11': {} @@ -4465,6 +4797,10 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -4473,6 +4809,12 @@ snapshots: acorn@8.14.0: {} + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4559,6 +4901,13 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bl@6.0.16: + dependencies: + '@types/readable-stream': 4.0.18 + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.5.2 + boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -4581,6 +4930,8 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) + buffer-equal-constant-time@1.0.1: {} + buffer-from@1.1.2: {} buffer@5.7.1: @@ -4588,6 +4939,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} bun-types@1.1.34: @@ -4900,6 +5256,8 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} defu@6.1.4: {} @@ -4996,6 +5354,10 @@ snapshots: eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + electron-to-chromium@1.5.33: {} emoji-regex@8.0.0: {} @@ -5274,6 +5636,10 @@ snapshots: d: 1.0.1 es5-ext: 0.10.62 + event-target-shim@5.0.1: {} + + events@3.3.0: {} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -5472,6 +5838,20 @@ snapshots: html-escaper@2.0.2: {} + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + human-signals@5.0.0: {} iconv-lite@0.6.3: @@ -5523,6 +5903,8 @@ snapshots: is-decimal@1.0.4: {} + is-docker@2.2.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -5555,6 +5937,10 @@ snapshots: is-what@4.1.16: {} + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -5596,6 +5982,8 @@ snapshots: js-base64@3.7.7: {} + js-md4@0.3.2: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -5622,6 +6010,41 @@ snapshots: json5@2.2.3: {} + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.3 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwa@2.0.0: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -5658,10 +6081,24 @@ snapshots: lodash.deburr@4.1.0: {} + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash.throttle@4.1.1: {} lodash.uniq@4.5.0: {} @@ -5845,6 +6282,8 @@ snapshots: napi-build-utils@1.0.2: {} + native-duplexpair@1.0.0: {} + natural-compare@1.4.0: {} next-tick@1.1.0: {} @@ -5920,6 +6359,12 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6263,6 +6708,8 @@ snapshots: pretty-bytes@6.1.1: {} + process@0.11.10: {} + promise-limit@2.7.0: {} pump@3.0.2: @@ -6305,6 +6752,14 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -6371,6 +6826,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} @@ -6438,12 +6895,16 @@ snapshots: split2@4.2.0: {} + sprintf-js@1.1.3: {} + sqlstring@2.3.3: {} stackback@0.0.2: {} std-env@3.7.0: {} + stoppable@1.1.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -6532,6 +6993,21 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tedious@18.6.1: + dependencies: + '@azure/core-auth': 1.9.0 + '@azure/identity': 4.5.0 + '@azure/keyvault-keys': 4.9.0 + '@js-joda/core': 5.6.3 + '@types/node': 22.7.5 + bl: 6.0.16 + iconv-lite: 0.6.3 + js-md4: 0.3.2 + native-duplexpair: 1.0.0 + sprintf-js: 1.1.3 + transitivePeerDependencies: + - supports-color + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 @@ -6570,6 +7046,8 @@ snapshots: dependencies: typescript: 5.6.3 + tslib@2.8.1: {} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -6668,6 +7146,8 @@ snapshots: util-deprecate@1.0.2: {} + uuid@8.3.2: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 From f49f82873546c3837bf2fa6fc01519fa88382175 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:38:14 -0500 Subject: [PATCH 02/40] added mssql dialect --- src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types.ts b/src/types.ts index c6670a7..a28099d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,7 +3,7 @@ */ export type Primitive = string | number | boolean | undefined | null; -export type SQLDialect = "mysql" | "postgresql" | "sqlite" | "libsql"; +export type SQLDialect = "mysql" | "postgresql" | "sqlite" | "libsql" | "mssql"; export type Statement = { /** From 7776b33b46c955a1676f699b09daa9ea9550f205 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:38:50 -0500 Subject: [PATCH 03/40] added mssql connector --- src/connectors/mssql.ts | 212 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 src/connectors/mssql.ts diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts new file mode 100644 index 0000000..4644c4b --- /dev/null +++ b/src/connectors/mssql.ts @@ -0,0 +1,212 @@ +import { + Connection, + Request, + Connection as TediousConnection, + type ConnectionConfiguration, + TYPES, +} from "tedious"; +import type { DataType } from "tedious/lib/data-type"; + +import type { Connector, Statement } from "../types"; + +export default function mssqlConnector(opts: ConnectionConfiguration) { + let _client: undefined | TediousConnection; + async function getClient(): Promise { + if (_client && _client.state === _client.STATE.LOGGED_IN) { + return _client; + } + + return new Promise((resolve, reject) => { + const client = new Connection(opts); + client.connect((error) => { + if (error) { + reject(error); + } + + _client = client; + }); + + client.on('connect', () => { + resolve(_client); + }); + + client.on('error', (error) => { + reject(error); + }); + + client.on('end', () => { + client.close(); + }); + }); + }; + + // taken from the `kysely` library: https://github.com/kysely-org/kysely/blob/413a88516c20be42dc8cbebade68c27669a3ac1a/src/dialect/mssql/mssql-driver.ts#L440 + function getTediousDataType(value: unknown): DataType { + if (value === null || value === undefined || typeof value === 'string') { + return TYPES.NVarChar; + } + + if (typeof value === 'bigint' || (typeof value === 'number' && value % 1 === 0)) { + return value < -2_147_483_648 || value > 2_147_483_647 ? TYPES.BigInt : TYPES.Int; + } + + if (typeof value === 'number') { + return TYPES.Float; + } + + if (typeof value === 'boolean') { + return TYPES.Bit; + } + + if (value instanceof Date) { + return TYPES.DateTime; + } + + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + return TYPES.VarBinary; + } + + return TYPES.NVarChar; + } + + function prepareSqlParameters(sql: string, parameters: Record[]) { + const parameterIndexes = []; + const tokens = [...sql]; + + for (let i = 0; i < sql.length; i++) { + const token = tokens[i]; + + if (token === '?') { + parameterIndexes.push(i); + } + }; + + const namedParameters = {}; + + for (const [index, parameterIndex] of parameterIndexes.entries()) { + tokens[parameterIndex] = `@${index + 1}`; + namedParameters[`@${index + 1}`] = { + name: String(index + 1), + type: getTediousDataType(parameters[index]), + value: parameters[index], + }; + } + + return { + sql: tokens.join(''), + parameters: namedParameters, + }; + }; + + async function _run(sql: string, parameters: Record[]) { + const connection = await getClient(); + const { + sql: _sql, + parameters: _parameters, + } = prepareSqlParameters(sql, parameters); + + const query = new Promise<{ rows: unknown[], rowCount: number }>((resolve, reject) => { + const request = new Request(_sql, (error, rowCount = 0) => { + if (error) { + reject(error); + } + }); + + const parameterKeys = Object.keys(_parameters); + for (const key of parameterKeys) { + const parameter = _parameters[key]; + + request.addParameter( + parameter.name, + parameter.type, + parameter.value + ); + } + + const rows: unknown[] = []; + request.on('row', (columns = []) => { + const currentRow = {}; + for (const column of columns) { + const { value, metadata } = column; + const { colName } = metadata; + + currentRow[colName] = value; + } + + rows.push(currentRow); + }); + + request.on('requestCompleted', () => { + connection.close(); + resolve({ rows, rowCount: rows.length }); + }); + + request.on('error', (error) => { + connection.close(); + reject(error); + }); + + request.on('done', () => { + connection.close(); + }); + + return connection.execSql(request); + }); + + try { + const { + rows, + rowCount + } = await query; + + return { + rows, + rowCount, + }; + } catch (error) { + error.sql = _sql; + error.parameters = parameters; + console.error('Query failed:', error); + } + } + + return { + name: "mssql", + dialect: "mssql", + exec(sql: string) { + return _run(sql, []); + }, + prepare(sql: string) { + const stmt = { + _sql: sql, + _params: [], + bind(...params) { + if (params.length > 0) { + this._params = params; + } + return stmt; + }, + async all(...params) { + const { rows } = await _run(this._sql, params || this._params); + return rows; + }, + async run(...params) { + const { + rows, + rowCount, + } = await _run(this._sql, params || this._params); + + return { + success: rowCount > 0, + result: rows, + }; + }, + async get(...params) { + const { rows } = await _run(this._sql, params || this._params); + return rows[0]; + }, + }; + return stmt; + }, + }; +}; From 5c5213a3d07a3d0da1d156f3160a3853fe5f6ba6 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:39:08 -0500 Subject: [PATCH 04/40] added mssql to connectors list --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index b69b588..13c61e4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,6 +26,7 @@ export const connectors = { bun: "db0/connectors/bun-sqlite", "bun-sqlite": "db0/connectors/bun-sqlite", planetscale: "db0/connectors/planetscale", + mssql: "db0/connectors/mssql", } as const; /** From 318881d08795d5a308e60057cb2eaecdd149b60a Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:40:57 -0500 Subject: [PATCH 05/40] added mssql-specific test table creation statement --- test/connectors/_tests.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/connectors/_tests.ts b/test/connectors/_tests.ts index 64dc965..46a0d75 100644 --- a/test/connectors/_tests.ts +++ b/test/connectors/_tests.ts @@ -20,6 +20,15 @@ export function testConnector(opts: { connector: Connector, dialect: SQLDialect await db.sql`CREATE TABLE users (\`id\` VARCHAR(4) PRIMARY KEY, \`firstName\` TEXT, \`lastName\` TEXT, \`email\` TEXT)`; break; } + case "mssql": { + await db.sql`CREATE TABLE users ( + [id] NVARCHAR(4) PRIMARY KEY, + [firstName] NVARCHAR(255), + [lastName] NVARCHAR(255), + [email] NVARCHAR(255) + )`; + break; + } default: { await db.sql`CREATE TABLE users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`; break; From 27af9a7e296900c3a90c596c5c5ffc3ad1243734 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:41:15 -0500 Subject: [PATCH 06/40] added mssql test suite --- test/connectors/mssql.test.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 test/connectors/mssql.test.ts diff --git a/test/connectors/mssql.test.ts b/test/connectors/mssql.test.ts new file mode 100644 index 0000000..b5aa38d --- /dev/null +++ b/test/connectors/mssql.test.ts @@ -0,0 +1,33 @@ +import { describe } from "vitest"; +import connector from "../../src/connectors/mssql"; +import { testConnector } from "./_tests"; + +describe.runIf( + process.env.MSSQL_HOST + && process.env.MSSQL_DB_NAME + && process.env.MSSQL_USERNAME + && process.env.MSSQL_PASSWORD +)( + "connectors: mssql.test", + () => { + testConnector({ + dialect: "mssql", + connector: connector({ + server: process.env.MSSQL_HOST!, + authentication: { + type: 'default', + options: { + userName: process.env.MSSQL_USERNAME!, + password: process.env.MSSQL_PASSWORD!, + }, + }, + options: { + database: process.env.MSSQL_DB_NAME!, + port: Number.parseInt(process.env.MSSQL_PORT || '1433', 10), + trustServerCertificate: true, + encrypt: false, + }, + }), + }); + }, +); From e79283a44ba3bc0feedb7d14825e5607f0047593 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 23:11:48 -0500 Subject: [PATCH 07/40] minor refactors --- src/connectors/mssql.ts | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 4644c4b..60e9daa 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -26,17 +26,9 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { _client = client; }); - client.on('connect', () => { - resolve(_client); - }); - - client.on('error', (error) => { - reject(error); - }); - - client.on('end', () => { - client.close(); - }); + client.on('connect', () => resolve(_client)); + client.on('error', reject); + client.on('end', () =>client.close()); }); }; @@ -146,10 +138,6 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { reject(error); }); - request.on('done', () => { - connection.close(); - }); - return connection.execSql(request); }); From 8cb43bdf1c2535a396f905120a53e9b334ed53eb Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 23:13:08 -0500 Subject: [PATCH 08/40] removed newline --- src/connectors/mssql.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 60e9daa..3445def 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -74,7 +74,6 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { }; const namedParameters = {}; - for (const [index, parameterIndex] of parameterIndexes.entries()) { tokens[parameterIndex] = `@${index + 1}`; namedParameters[`@${index + 1}`] = { From ed7b0750c4687567494f5b0849e2134456276b23 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Fri, 8 Nov 2024 23:30:55 -0500 Subject: [PATCH 09/40] changed success property to be defined by the state of the query rather than rows changed to account for queries that don't return data --- src/connectors/mssql.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 3445def..8185c0f 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -96,10 +96,13 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { parameters: _parameters, } = prepareSqlParameters(sql, parameters); - const query = new Promise<{ rows: unknown[], rowCount: number }>((resolve, reject) => { - const request = new Request(_sql, (error, rowCount = 0) => { + const query = new Promise<{ rows: unknown[], success: boolean }>((resolve, reject) => { + let success = false; + const request = new Request(_sql, (error) => { if (error) { reject(error); + } else { + success = true; } }); @@ -129,7 +132,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { request.on('requestCompleted', () => { connection.close(); - resolve({ rows, rowCount: rows.length }); + resolve({ rows, success }); }); request.on('error', (error) => { @@ -143,12 +146,12 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { try { const { rows, - rowCount + success, } = await query; return { rows, - rowCount, + success, }; } catch (error) { error.sql = _sql; @@ -180,11 +183,11 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { async run(...params) { const { rows, - rowCount, + success, } = await _run(this._sql, params || this._params); return { - success: rowCount > 0, + success, result: rows, }; }, From a0f81946e6a3e6eaf9d1ba9cb8d37d3cf07a9e25 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:18:35 -0500 Subject: [PATCH 10/40] replaced index access with deconstruction --- src/connectors/mssql.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 8185c0f..1f54005 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -192,8 +192,8 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { }; }, async get(...params) { - const { rows } = await _run(this._sql, params || this._params); - return rows[0]; + const { rows: [ row ] } = await _run(this._sql, params || this._params); + return row; }, }; return stmt; From 34d615d13955aff3bdc2ca9e79d0f42663c46067 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:19:01 -0500 Subject: [PATCH 11/40] removed rows from run result --- src/connectors/mssql.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 1f54005..e698715 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -181,14 +181,9 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { return rows; }, async run(...params) { - const { - rows, - success, - } = await _run(this._sql, params || this._params); - + const { success = false } = await _run(this._sql, params || this._params) || {}; return { success, - result: rows, }; }, async get(...params) { From 5d51c5c65f218e8d93681a582297d39900500079 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:19:18 -0500 Subject: [PATCH 12/40] removed error prefix --- src/connectors/mssql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index e698715..cd73256 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -156,7 +156,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { } catch (error) { error.sql = _sql; error.parameters = parameters; - console.error('Query failed:', error); + console.error(error); } } From 9474692e744412062277ba62979559ebbcbebc9d Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:19:35 -0500 Subject: [PATCH 13/40] replaced shortened variable name --- src/connectors/mssql.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index cd73256..fda25bb 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -156,7 +156,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { } catch (error) { error.sql = _sql; error.parameters = parameters; - console.error(error); + console.error('Query failed:', error); } } @@ -167,14 +167,14 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { return _run(sql, []); }, prepare(sql: string) { - const stmt = { + const statement = { _sql: sql, _params: [], bind(...params) { if (params.length > 0) { this._params = params; } - return stmt; + return statement; }, async all(...params) { const { rows } = await _run(this._sql, params || this._params); @@ -191,7 +191,8 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { return row; }, }; - return stmt; + + return statement; }, }; -}; +}; \ No newline at end of file From b37749dcb55a95099f12412a0b0f65c4702b3c39 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:20:40 -0500 Subject: [PATCH 14/40] moved utility functions outside of connector --- src/connectors/mssql.ts | 124 +++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 58 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index fda25bb..72f0dcf 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -9,6 +9,68 @@ import type { DataType } from "tedious/lib/data-type"; import type { Connector, Statement } from "../types"; +// taken from the `kysely` library: https://github.com/kysely-org/kysely/blob/413a88516c20be42dc8cbebade68c27669a3ac1a/src/dialect/mssql/mssql-driver.ts#L440 +function getTediousDataType(value: unknown): DataType { + if (value === null || value === undefined || typeof value === 'string') { + return TYPES.NVarChar; + } + + if (typeof value === 'bigint' || (typeof value === 'number' && value % 1 === 0)) { + return value < -2_147_483_648 || value > 2_147_483_647 ? TYPES.BigInt : TYPES.Int; + } + + if (typeof value === 'number') { + return TYPES.Float; + } + + if (typeof value === 'boolean') { + return TYPES.Bit; + } + + if (value instanceof Date) { + return TYPES.DateTime; + } + + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + return TYPES.VarBinary; + } + + return TYPES.NVarChar; +}; + +// replace `?` placeholders with `@1`, `@2`, etc. +function prepareSqlParameters(sql: string, parameters: Record[]) { + const parameterIndexes = []; + const tokens = [...sql]; + + // find all `?` placeholders in the SQL string + for (let i = 0; i < sql.length; i++) { + const token = tokens[i]; + + if (token === '?') { + parameterIndexes.push(i); + } + }; + + const namedParameters = {}; + for (const [index, parameterIndex] of parameterIndexes.entries()) { + const incrementedIndex = index + 1; + // replace `?` placeholder with index-based parameter name + tokens[parameterIndex] = `@${incrementedIndex}`; + // store the parameter value and type with the index-based parameter name + namedParameters[`@${incrementedIndex}`] = { + name: String(incrementedIndex), + type: getTediousDataType(parameters[index]), + value: parameters[index], + }; + } + + return { + sql: tokens.join(''), + parameters: namedParameters, + }; +}; + export default function mssqlConnector(opts: ConnectionConfiguration) { let _client: undefined | TediousConnection; async function getClient(): Promise { @@ -28,68 +90,14 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { client.on('connect', () => resolve(_client)); client.on('error', reject); - client.on('end', () =>client.close()); }); }; - // taken from the `kysely` library: https://github.com/kysely-org/kysely/blob/413a88516c20be42dc8cbebade68c27669a3ac1a/src/dialect/mssql/mssql-driver.ts#L440 - function getTediousDataType(value: unknown): DataType { - if (value === null || value === undefined || typeof value === 'string') { - return TYPES.NVarChar; + async function _run(sql: string, parameters?: Record[]) { + if (!sql) { + throw new Error('SQL query must be provided'); } - if (typeof value === 'bigint' || (typeof value === 'number' && value % 1 === 0)) { - return value < -2_147_483_648 || value > 2_147_483_647 ? TYPES.BigInt : TYPES.Int; - } - - if (typeof value === 'number') { - return TYPES.Float; - } - - if (typeof value === 'boolean') { - return TYPES.Bit; - } - - if (value instanceof Date) { - return TYPES.DateTime; - } - - if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - return TYPES.VarBinary; - } - - return TYPES.NVarChar; - } - - function prepareSqlParameters(sql: string, parameters: Record[]) { - const parameterIndexes = []; - const tokens = [...sql]; - - for (let i = 0; i < sql.length; i++) { - const token = tokens[i]; - - if (token === '?') { - parameterIndexes.push(i); - } - }; - - const namedParameters = {}; - for (const [index, parameterIndex] of parameterIndexes.entries()) { - tokens[parameterIndex] = `@${index + 1}`; - namedParameters[`@${index + 1}`] = { - name: String(index + 1), - type: getTediousDataType(parameters[index]), - value: parameters[index], - }; - } - - return { - sql: tokens.join(''), - parameters: namedParameters, - }; - }; - - async function _run(sql: string, parameters: Record[]) { const connection = await getClient(); const { sql: _sql, @@ -156,7 +164,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { } catch (error) { error.sql = _sql; error.parameters = parameters; - console.error('Query failed:', error); + console.error(error); } } From 00c3753c5a4666f3aec45c347d304f1e327d95f3 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:29:27 -0500 Subject: [PATCH 15/40] swapped query parameters to be provided via object rather than array --- src/connectors/mssql.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 72f0dcf..e530b50 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -39,7 +39,7 @@ function getTediousDataType(value: unknown): DataType { }; // replace `?` placeholders with `@1`, `@2`, etc. -function prepareSqlParameters(sql: string, parameters: Record[]) { +function prepareSqlParameters(sql: string, parameters: Record) { const parameterIndexes = []; const tokens = [...sql]; @@ -93,7 +93,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { }); }; - async function _run(sql: string, parameters?: Record[]) { + async function _run(sql: string, parameters?: Record) { if (!sql) { throw new Error('SQL query must be provided'); } @@ -172,7 +172,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { name: "mssql", dialect: "mssql", exec(sql: string) { - return _run(sql, []); + return _run(sql, {}); }, prepare(sql: string) { const statement = { From ad45fa7477c2bd18c2e415037c38db6c6acc7f9e Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:33:01 -0500 Subject: [PATCH 16/40] added clarifying comment --- src/connectors/mssql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index e530b50..b3d3017 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -66,7 +66,7 @@ function prepareSqlParameters(sql: string, parameters: Record) } return { - sql: tokens.join(''), + sql: tokens.join(''), // join the tokens back into a SQL string parameters: namedParameters, }; }; From d6d9fb62320fb7e6525cb444eecf9244d52594cf Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:18:13 -0500 Subject: [PATCH 17/40] removed unnecessary return --- src/connectors/mssql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index b3d3017..6541723 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -148,7 +148,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { reject(error); }); - return connection.execSql(request); + connection.execSql(request); }); try { From f9afd4dd0676b342903d0188fdc67b2a133e5b57 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:20:48 -0500 Subject: [PATCH 18/40] added example MSSQL env vars --- .env.example | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.env.example b/.env.example index e68216d..53db2cd 100644 --- a/.env.example +++ b/.env.example @@ -5,3 +5,10 @@ MYSQL_URL= PLANETSCALE_HOST=aws.connect.psdb.cloud PLANETSCALE_USERNAME=username PLANETSCALE_PASSWORD=password + +# MSSQL +MSSQL_HOST=localhost +MSSQL_PORT=1433 +MSSQL_USERNAME=sa +MSSQL_PASSWORD=password +MSSQL_DB_NAME=test_db \ No newline at end of file From 3d2e6eaaef6c7f7b2d17faa1bc66886f80021677 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:25:23 -0500 Subject: [PATCH 19/40] moved utilities to bottom of file for prioritization --- src/connectors/mssql.ts | 126 ++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 6541723..65cff9e 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -9,68 +9,6 @@ import type { DataType } from "tedious/lib/data-type"; import type { Connector, Statement } from "../types"; -// taken from the `kysely` library: https://github.com/kysely-org/kysely/blob/413a88516c20be42dc8cbebade68c27669a3ac1a/src/dialect/mssql/mssql-driver.ts#L440 -function getTediousDataType(value: unknown): DataType { - if (value === null || value === undefined || typeof value === 'string') { - return TYPES.NVarChar; - } - - if (typeof value === 'bigint' || (typeof value === 'number' && value % 1 === 0)) { - return value < -2_147_483_648 || value > 2_147_483_647 ? TYPES.BigInt : TYPES.Int; - } - - if (typeof value === 'number') { - return TYPES.Float; - } - - if (typeof value === 'boolean') { - return TYPES.Bit; - } - - if (value instanceof Date) { - return TYPES.DateTime; - } - - if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - return TYPES.VarBinary; - } - - return TYPES.NVarChar; -}; - -// replace `?` placeholders with `@1`, `@2`, etc. -function prepareSqlParameters(sql: string, parameters: Record) { - const parameterIndexes = []; - const tokens = [...sql]; - - // find all `?` placeholders in the SQL string - for (let i = 0; i < sql.length; i++) { - const token = tokens[i]; - - if (token === '?') { - parameterIndexes.push(i); - } - }; - - const namedParameters = {}; - for (const [index, parameterIndex] of parameterIndexes.entries()) { - const incrementedIndex = index + 1; - // replace `?` placeholder with index-based parameter name - tokens[parameterIndex] = `@${incrementedIndex}`; - // store the parameter value and type with the index-based parameter name - namedParameters[`@${incrementedIndex}`] = { - name: String(incrementedIndex), - type: getTediousDataType(parameters[index]), - value: parameters[index], - }; - } - - return { - sql: tokens.join(''), // join the tokens back into a SQL string - parameters: namedParameters, - }; -}; - export default function mssqlConnector(opts: ConnectionConfiguration) { let _client: undefined | TediousConnection; async function getClient(): Promise { @@ -203,4 +141,66 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { return statement; }, }; -}; \ No newline at end of file +}; + +// taken from the `kysely` library: https://github.com/kysely-org/kysely/blob/413a88516c20be42dc8cbebade68c27669a3ac1a/src/dialect/mssql/mssql-driver.ts#L440 +function getTediousDataType(value: unknown): DataType { + if (value === null || value === undefined || typeof value === 'string') { + return TYPES.NVarChar; + } + + if (typeof value === 'bigint' || (typeof value === 'number' && value % 1 === 0)) { + return value < -2_147_483_648 || value > 2_147_483_647 ? TYPES.BigInt : TYPES.Int; + } + + if (typeof value === 'number') { + return TYPES.Float; + } + + if (typeof value === 'boolean') { + return TYPES.Bit; + } + + if (value instanceof Date) { + return TYPES.DateTime; + } + + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + return TYPES.VarBinary; + } + + return TYPES.NVarChar; +}; + +// replace `?` placeholders with `@1`, `@2`, etc. +function prepareSqlParameters(sql: string, parameters: Record) { + const parameterIndexes = []; + const tokens = [...sql]; + + // find all `?` placeholders in the SQL string + for (let i = 0; i < sql.length; i++) { + const token = tokens[i]; + + if (token === '?') { + parameterIndexes.push(i); + } + }; + + const namedParameters = {}; + for (const [index, parameterIndex] of parameterIndexes.entries()) { + const incrementedIndex = index + 1; + // replace `?` placeholder with index-based parameter name + tokens[parameterIndex] = `@${incrementedIndex}`; + // store the parameter value and type with the index-based parameter name + namedParameters[`@${incrementedIndex}`] = { + name: String(incrementedIndex), + type: getTediousDataType(parameters[index]), + value: parameters[index], + }; + } + + return { + sql: tokens.join(''), // join the tokens back into a SQL string + parameters: namedParameters, + }; +}; From 8e20159b1ad459b90eed4b0690b8d32881544860 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:29:11 -0500 Subject: [PATCH 20/40] updated supported connectors list --- docs/2.connectors/1.index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/2.connectors/1.index.md b/docs/2.connectors/1.index.md index f993a90..447ba5e 100644 --- a/docs/2.connectors/1.index.md +++ b/docs/2.connectors/1.index.md @@ -15,6 +15,7 @@ Currently supported connectors: - [PostgreSQL](/connectors/postgresql) - [MySQL](/connectors/mysql) - [SQLite](/connectors/sqlite) +- [MSSQL](/connectors/mssql) ::read-more{to="https://github.com/unjs/db0/issues/32"} See [unjs/db0#32](https://github.com/unjs/db0/issues/32) for the list of upcoming connectors. From 0498d64597b9e273dba9670c3f39334d59af3af8 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:44:02 -0500 Subject: [PATCH 21/40] added mssql doc page --- docs/2.connectors/mssql.md | 30 ++++++++++++++++++++++++++++++ package.json | 1 + src/connectors/test.js | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 docs/2.connectors/mssql.md create mode 100644 src/connectors/test.js diff --git a/docs/2.connectors/mssql.md b/docs/2.connectors/mssql.md new file mode 100644 index 0000000..533560b --- /dev/null +++ b/docs/2.connectors/mssql.md @@ -0,0 +1,30 @@ +--- +icon: devicon-plain:microsoftsqlserver +--- + +# MSSQL + +> Connect DB0 to MSSQL Database using `tedious` + +## Usage + +For this connector, you need to install [`tedious`](https://www.npmjs.com/package/tedious) dependency: + +:pm-install{name="tedious"} + +Use `mssql` connector: + +```js +import { createDatabase } from "db0"; +import mysql from "db0/connectors/mssql"; + +const db = createDatabase( + mssql({ + /* options */ + }), +); +``` + +## Options + +:read-more{to="https://tediousjs.github.io/tedious/api-connection.html#function_newConnection"} diff --git a/package.json b/package.json index 12f7632..102eddd 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "repository": "unjs/db0", "license": "MIT", "sideEffects": false, + "type": "module", "exports": { "./connectors/libsql": { "import": "./connectors/libsql/node.mjs", diff --git a/src/connectors/test.js b/src/connectors/test.js new file mode 100644 index 0000000..ce0c83c --- /dev/null +++ b/src/connectors/test.js @@ -0,0 +1,36 @@ +import { createDatabase } from '../../dist/index.cjs'; +import mssql from '../../connectors/mssql.cjs'; + +const db = createDatabase(mssql({ + server: 'localhost', + authentication: { + type: 'default', + options: { + userName: 'sa', + password: '3dg3Y0urB3ts', + }, + }, + options: { + database: 'test_db', + port: Number.parseInt(process.env.MSSQL_PORT || '32768', 10), + trustServerCertificate: true, + encrypt: false, + }, +})); + +const id = 2; + +console.log(await db.sql`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`); +console.log('exec', await db.exec(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`)); +// // console.log(db.dialect) +console.log('all', await db.prepare(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`).all()); +console.log('run', await db.prepare(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`).run()); +console.log('get', await db.prepare(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`).get()); +// console.log('run', await db.prepare(`CREATE TABLE users2 ( +// [id] NVARCHAR(4) PRIMARY KEY, +// [firstName] NVARCHAR(255), +// [lastName] NVARCHAR(255), +// [email] NVARCHAR(255) +// )`).run()); + + From c733c00969bb5434c95c80a8960431038449f31d Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:46:44 -0500 Subject: [PATCH 22/40] deleted test file --- src/connectors/test.js | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 src/connectors/test.js diff --git a/src/connectors/test.js b/src/connectors/test.js deleted file mode 100644 index ce0c83c..0000000 --- a/src/connectors/test.js +++ /dev/null @@ -1,36 +0,0 @@ -import { createDatabase } from '../../dist/index.cjs'; -import mssql from '../../connectors/mssql.cjs'; - -const db = createDatabase(mssql({ - server: 'localhost', - authentication: { - type: 'default', - options: { - userName: 'sa', - password: '3dg3Y0urB3ts', - }, - }, - options: { - database: 'test_db', - port: Number.parseInt(process.env.MSSQL_PORT || '32768', 10), - trustServerCertificate: true, - encrypt: false, - }, -})); - -const id = 2; - -console.log(await db.sql`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`); -console.log('exec', await db.exec(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`)); -// // console.log(db.dialect) -console.log('all', await db.prepare(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`).all()); -console.log('run', await db.prepare(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`).run()); -console.log('get', await db.prepare(`SELECT * from [test_db].[test_schema].[test_table3] where id = ${id}`).get()); -// console.log('run', await db.prepare(`CREATE TABLE users2 ( -// [id] NVARCHAR(4) PRIMARY KEY, -// [firstName] NVARCHAR(255), -// [lastName] NVARCHAR(255), -// [email] NVARCHAR(255) -// )`).run()); - - From e3cdb3368c5fea794cab427e97977a1654617902 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:50:58 -0500 Subject: [PATCH 23/40] fixed typo --- docs/2.connectors/mssql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/2.connectors/mssql.md b/docs/2.connectors/mssql.md index 533560b..090c96c 100644 --- a/docs/2.connectors/mssql.md +++ b/docs/2.connectors/mssql.md @@ -16,7 +16,7 @@ Use `mssql` connector: ```js import { createDatabase } from "db0"; -import mysql from "db0/connectors/mssql"; +import mssql from "db0/connectors/mssql"; const db = createDatabase( mssql({ From 6c59dab3d05f6710a3609e5752b72a374a60c619 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Sun, 10 Nov 2024 22:27:06 -0500 Subject: [PATCH 24/40] remove type module --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 102eddd..12f7632 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "repository": "unjs/db0", "license": "MIT", "sideEffects": false, - "type": "module", "exports": { "./connectors/libsql": { "import": "./connectors/libsql/node.mjs", From 815c669a5139fc90c2d2ad3c046d4a21ecdcceb6 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Mon, 11 Nov 2024 00:09:46 -0500 Subject: [PATCH 25/40] replaced iterator condition --- src/connectors/mssql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index 65cff9e..abfe8e0 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -178,7 +178,7 @@ function prepareSqlParameters(sql: string, parameters: Record) const tokens = [...sql]; // find all `?` placeholders in the SQL string - for (let i = 0; i < sql.length; i++) { + for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; if (token === '?') { From 7ea76fdc8c7923e7ff80be8c0a6621e0fd64df60 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:24:52 +0000 Subject: [PATCH 26/40] chore: apply automated updates --- src/connectors/mssql.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/connectors/mssql.ts b/src/connectors/mssql.ts index abfe8e0..b23e304 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql.ts @@ -178,8 +178,7 @@ function prepareSqlParameters(sql: string, parameters: Record) const tokens = [...sql]; // find all `?` placeholders in the SQL string - for (let i = 0; i < tokens.length; i++) { - const token = tokens[i]; + for (const [i, token] of tokens.entries()) { if (token === '?') { parameterIndexes.push(i); From c50498f610ad1e595b884cb81b7ad07f89df0915 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Wed, 13 Nov 2024 22:39:10 -0500 Subject: [PATCH 27/40] added peer dep meta entry --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 12f7632..ce47693 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,9 @@ "mysql2": { "optional": true }, + "tedious": { + "optional": true + }, "@electric-sql/pglite": { "optional": true } From 13c38cdff9a62c10ef99e8c3d025f9a2769eb102 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Thu, 14 Nov 2024 00:29:39 -0500 Subject: [PATCH 28/40] updated directory structure to allow utilities to be exported separately --- package.json | 8 ++++++++ src/connectors/{mssql.ts => mssql/connector.ts} | 6 +++--- src/connectors/mssql/index.ts | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) rename src/connectors/{mssql.ts => mssql/connector.ts} (96%) create mode 100644 src/connectors/mssql/index.ts diff --git a/package.json b/package.json index ce47693..877c60b 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,14 @@ "require": "./connectors/libsql/node.cjs" } }, + "./connectors/mssql": { + "import": "./connectors/mssql/index.mjs", + "require": "./connectors/mssql/index.cjs", + "web": { + "import": "./connectors/mssql/index.mjs", + "require": "./connectors/mssql/index.cjs" + } + }, "./connectors/*": { "types": "./connectors/*.d.ts", "import": "./connectors/*.mjs", diff --git a/src/connectors/mssql.ts b/src/connectors/mssql/connector.ts similarity index 96% rename from src/connectors/mssql.ts rename to src/connectors/mssql/connector.ts index b23e304..2acbd05 100644 --- a/src/connectors/mssql.ts +++ b/src/connectors/mssql/connector.ts @@ -7,7 +7,7 @@ import { } from "tedious"; import type { DataType } from "tedious/lib/data-type"; -import type { Connector, Statement } from "../types"; +import type { Connector, Statement } from "../../types"; export default function mssqlConnector(opts: ConnectionConfiguration) { let _client: undefined | TediousConnection; @@ -144,7 +144,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { }; // taken from the `kysely` library: https://github.com/kysely-org/kysely/blob/413a88516c20be42dc8cbebade68c27669a3ac1a/src/dialect/mssql/mssql-driver.ts#L440 -function getTediousDataType(value: unknown): DataType { +export function getTediousDataType(value: unknown): DataType { if (value === null || value === undefined || typeof value === 'string') { return TYPES.NVarChar; } @@ -173,7 +173,7 @@ function getTediousDataType(value: unknown): DataType { }; // replace `?` placeholders with `@1`, `@2`, etc. -function prepareSqlParameters(sql: string, parameters: Record) { +export function prepareSqlParameters(sql: string, parameters: Record) { const parameterIndexes = []; const tokens = [...sql]; diff --git a/src/connectors/mssql/index.ts b/src/connectors/mssql/index.ts new file mode 100644 index 0000000..b0186fc --- /dev/null +++ b/src/connectors/mssql/index.ts @@ -0,0 +1 @@ +export { default } from './connector'; \ No newline at end of file From c9aae00290aa0e4669f4d2407ca9b63efbf37b9a Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Thu, 14 Nov 2024 00:33:08 -0500 Subject: [PATCH 29/40] fixed parameter typing --- src/connectors/mssql/connector.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/connectors/mssql/connector.ts b/src/connectors/mssql/connector.ts index 2acbd05..c3a1e6f 100644 --- a/src/connectors/mssql/connector.ts +++ b/src/connectors/mssql/connector.ts @@ -31,7 +31,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { }); }; - async function _run(sql: string, parameters?: Record) { + async function _run(sql: string, parameters?: unknown[]) { if (!sql) { throw new Error('SQL query must be provided'); } @@ -110,7 +110,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { name: "mssql", dialect: "mssql", exec(sql: string) { - return _run(sql, {}); + return _run(sql, []); }, prepare(sql: string) { const statement = { @@ -173,7 +173,7 @@ export function getTediousDataType(value: unknown): DataType { }; // replace `?` placeholders with `@1`, `@2`, etc. -export function prepareSqlParameters(sql: string, parameters: Record) { +export function prepareSqlParameters(sql: string, parameters: unknown[]) { const parameterIndexes = []; const tokens = [...sql]; From dccba546d464558f0e414f1f8a4c71c801811125 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Thu, 14 Nov 2024 00:35:23 -0500 Subject: [PATCH 30/40] added tests for mssql utility functions --- test/connectors/mssql.test.ts | 88 ++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/test/connectors/mssql.test.ts b/test/connectors/mssql.test.ts index b5aa38d..57b4494 100644 --- a/test/connectors/mssql.test.ts +++ b/test/connectors/mssql.test.ts @@ -1,5 +1,7 @@ -import { describe } from "vitest"; -import connector from "../../src/connectors/mssql"; +import { describe, it, expect } from "vitest"; +import { TYPES } from "tedious"; + +import connector, { getTediousDataType, prepareSqlParameters } from "../../src/connectors/mssql/connector"; import { testConnector } from "./_tests"; describe.runIf( @@ -31,3 +33,85 @@ describe.runIf( }); }, ); + +describe("getTediousDataType", () => { + it("should return NVarChar for null", () => { + expect(getTediousDataType(null)).toBe(TYPES.NVarChar); + }); + + it("should return NVarChar for undefined", () => { + expect(getTediousDataType(undefined)).toBe(TYPES.NVarChar); + }); + + it("should return NVarChar for strings", () => { + expect(getTediousDataType("test")).toBe(TYPES.NVarChar); + }); + + it("should return Int for numbers", () => { + expect(getTediousDataType(123)).toBe(TYPES.Int); + }); + + it("should return BigInt for large integer numbers", () => { + expect(getTediousDataType(2_147_483_648)).toBe(TYPES.BigInt); + }); + + it("should return Float for floating point numbers", () => { + expect(getTediousDataType(123.45)).toBe(TYPES.Float); + }); + + it("should return Bit for boolean values", () => { + expect(getTediousDataType(true)).toBe(TYPES.Bit); + }); + + it("should return DateTime for Date objects", () => { + expect(getTediousDataType(new Date())).toBe(TYPES.DateTime); + }); + + it("should return VarBinary for Buffer objects", () => { + expect(getTediousDataType(Buffer.from("test"))).toBe(TYPES.VarBinary); + }); +}); + +describe("prepareSqlParameters", () => { + it("should replace ? with @1, @2, etc.", () => { + const sql = "SELECT * FROM users WHERE id = ? AND name = ?"; + const parameters = [1, "John"]; + const result = prepareSqlParameters(sql, parameters); + expect(result.sql).toBe("SELECT * FROM users WHERE id = @1 AND name = @2"); + expect(result.parameters).toEqual({ + "@1": { name: "1", type: TYPES.Int, value: 1 }, + "@2": { name: "2", type: TYPES.NVarChar, value: "John" }, + }); + }); + + it("should handle no parameters", () => { + const sql = "SELECT * FROM users"; + const parameters: unknown[] = []; + const result = prepareSqlParameters(sql, parameters); + expect(result.sql).toBe("SELECT * FROM users"); + expect(result.parameters).toEqual({}); + }); + + it("should handle multiple parameters of different types", () => { + const sql = "SELECT * FROM users WHERE id = ? AND age = ? AND active = ?"; + const parameters = [1, 30, true]; + const result = prepareSqlParameters(sql, parameters); + expect(result.sql).toBe("SELECT * FROM users WHERE id = @1 AND age = @2 AND active = @3"); + expect(result.parameters).toEqual({ + "@1": { name: "1", type: TYPES.Int, value: 1 }, + "@2": { name: "2", type: TYPES.Int, value: 30 }, + "@3": { name: "3", type: TYPES.Bit, value: true }, + }); + }); + + it("should handle null and undefined parameters", () => { + const sql = "SELECT * FROM users WHERE name = ? AND email = ?"; + const parameters = [null, undefined]; + const result = prepareSqlParameters(sql, parameters); + expect(result.sql).toBe("SELECT * FROM users WHERE name = @1 AND email = @2"); + expect(result.parameters).toEqual({ + "@1": { name: "1", type: TYPES.NVarChar, value: null }, + "@2": { name: "2", type: TYPES.NVarChar, value: undefined }, + }); + }); +}); \ No newline at end of file From fe98eabfd1307ff6ced14fc21e1fc93869ba7469 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Thu, 14 Nov 2024 02:36:09 -0500 Subject: [PATCH 31/40] updated import to test default export directly --- test/connectors/mssql.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/connectors/mssql.test.ts b/test/connectors/mssql.test.ts index 57b4494..518e466 100644 --- a/test/connectors/mssql.test.ts +++ b/test/connectors/mssql.test.ts @@ -1,7 +1,8 @@ import { describe, it, expect } from "vitest"; import { TYPES } from "tedious"; -import connector, { getTediousDataType, prepareSqlParameters } from "../../src/connectors/mssql/connector"; +import { getTediousDataType, prepareSqlParameters } from "../../src/connectors/mssql/connector"; +import connector from "../../src/connectors/mssql/index"; import { testConnector } from "./_tests"; describe.runIf( From d016bdc51c6916cfe6a956b36b2ac8f7d28b2b26 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Thu, 14 Nov 2024 02:45:42 -0500 Subject: [PATCH 32/40] added test to cover default function behavior --- test/connectors/mssql.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/connectors/mssql.test.ts b/test/connectors/mssql.test.ts index 518e466..3f9edb6 100644 --- a/test/connectors/mssql.test.ts +++ b/test/connectors/mssql.test.ts @@ -71,6 +71,10 @@ describe("getTediousDataType", () => { it("should return VarBinary for Buffer objects", () => { expect(getTediousDataType(Buffer.from("test"))).toBe(TYPES.VarBinary); }); + + it("should return NVarChar by default for other types", () => { + expect(getTediousDataType({})).toBe(TYPES.NVarChar); + }); }); describe("prepareSqlParameters", () => { From 53949b4b9ee7bcbd9587599a4694bd4a2cc18ee5 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:32:14 -0500 Subject: [PATCH 33/40] swapped DateTime for DateTime2 for better future proofing --- src/connectors/mssql/connector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connectors/mssql/connector.ts b/src/connectors/mssql/connector.ts index c3a1e6f..9c4012f 100644 --- a/src/connectors/mssql/connector.ts +++ b/src/connectors/mssql/connector.ts @@ -162,7 +162,7 @@ export function getTediousDataType(value: unknown): DataType { } if (value instanceof Date) { - return TYPES.DateTime; + return TYPES.DateTime2; } if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { From 389fd0c653ea53f8c061b179dd7de2c8c7023966 Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:32:39 -0500 Subject: [PATCH 34/40] swapped datetime value in test --- test/connectors/mssql.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/connectors/mssql.test.ts b/test/connectors/mssql.test.ts index 3f9edb6..d9c47e6 100644 --- a/test/connectors/mssql.test.ts +++ b/test/connectors/mssql.test.ts @@ -65,7 +65,7 @@ describe("getTediousDataType", () => { }); it("should return DateTime for Date objects", () => { - expect(getTediousDataType(new Date())).toBe(TYPES.DateTime); + expect(getTediousDataType(new Date())).toBe(TYPES.DateTime2); }); it("should return VarBinary for Buffer objects", () => { From c2630859412badbe03d935c613c57a186f8e47d0 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:09:00 +0000 Subject: [PATCH 35/40] chore: apply automated updates --- src/_connectors.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/_connectors.ts b/src/_connectors.ts index 9740135..3631afd 100644 --- a/src/_connectors.ts +++ b/src/_connectors.ts @@ -13,7 +13,7 @@ import type { ConnectorOptions as PgliteOptions } from "db0/connectors/pglite"; import type { ConnectorOptions as PlanetscaleOptions } from "db0/connectors/planetscale"; import type { ConnectorOptions as PostgreSQLOptions } from "db0/connectors/postgresql"; -export type ConnectorName = "better-sqlite3" | "sqlite" | "bun-sqlite" | "bun" | "cloudflare-d1" | "libsql-core" | "libsql-http" | "libsql-node" | "libsql" | "libsql-web" | "mysql2" | "node-sqlite3" | "pglite" | "planetscale" | "postgresql"; +export type ConnectorName = "better-sqlite3" | "sqlite" | "bun-sqlite" | "bun" | "cloudflare-d1" | "libsql-core" | "libsql-http" | "libsql-node" | "libsql" | "libsql-web" | "mssql-connector" | "mssql-index" | "mysql2" | "node-sqlite3" | "pglite" | "planetscale" | "postgresql"; export type ConnectorOptions = { "better-sqlite3": BetterSQLite3Options; @@ -50,6 +50,8 @@ export const connectors = Object.freeze({ /** @deprecated Alias of libsql-node */ "libsql": "db0/connectors/libsql/node", "libsql-web": "db0/connectors/libsql/web", + "mssql-connector": "db0/connectors/mssql/connector", + "mssql-index": "db0/connectors/mssql/index", "mysql2": "db0/connectors/mysql2", "node-sqlite3": "db0/connectors/node-sqlite3", "pglite": "db0/connectors/pglite", From 1f657ab6e26849c040d149407d708c584964315a Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:31:30 -0500 Subject: [PATCH 36/40] moved mssql connector to single file for consistency --- src/connectors/{mssql/connector.ts => mssql.ts} | 8 +++++--- src/connectors/mssql/index.ts | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) rename src/connectors/{mssql/connector.ts => mssql.ts} (95%) delete mode 100644 src/connectors/mssql/index.ts diff --git a/src/connectors/mssql/connector.ts b/src/connectors/mssql.ts similarity index 95% rename from src/connectors/mssql/connector.ts rename to src/connectors/mssql.ts index 9c4012f..640efa4 100644 --- a/src/connectors/mssql/connector.ts +++ b/src/connectors/mssql.ts @@ -7,9 +7,11 @@ import { } from "tedious"; import type { DataType } from "tedious/lib/data-type"; -import type { Connector, Statement } from "../../types"; +import type { Connector, Statement } from "../types"; -export default function mssqlConnector(opts: ConnectionConfiguration) { +export type ConnectorOptions = ConnectionConfiguration; + +export default function mssqlConnector(opts: ConnectorOptions) { let _client: undefined | TediousConnection; async function getClient(): Promise { if (_client && _client.state === _client.STATE.LOGGED_IN) { @@ -106,7 +108,7 @@ export default function mssqlConnector(opts: ConnectionConfiguration) { } } - return { + return >{ name: "mssql", dialect: "mssql", exec(sql: string) { diff --git a/src/connectors/mssql/index.ts b/src/connectors/mssql/index.ts deleted file mode 100644 index b0186fc..0000000 --- a/src/connectors/mssql/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './connector'; \ No newline at end of file From 59ee0509b1f8c309aa3d80c2188f60a89cca5d9f Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:32:02 -0500 Subject: [PATCH 37/40] updated gen connectors script to include options name whitelist for non-camelcaseable connector names --- scripts/gen-connectors.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/gen-connectors.ts b/scripts/gen-connectors.ts index 9813108..ae8219c 100644 --- a/scripts/gen-connectors.ts +++ b/scripts/gen-connectors.ts @@ -47,6 +47,10 @@ const connectors: { optionsTName?: string; }[] = []; +const connectorOptionsNameAliases: Record = { + "mssql": "MSSQL" +}; + for (const entry of connectorEntries) { const pathName = entry.replace(/\.ts$/, ""); const name = pathName.replace(/\/|\\/g, "-"); @@ -64,7 +68,7 @@ for (const entry of connectorEntries) { const names = [...new Set([name, ...alternativeNames])]; - const optionsTName = upperFirst(safeName) + "Options"; + const optionsTName = (connectorOptionsNameAliases[name] || upperFirst(safeName)) + "Options"; connectors.push({ name, From 756687dd97099ce9dee81a629966c42831ae399d Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:32:10 -0500 Subject: [PATCH 38/40] regenerated _connectors --- src/_connectors.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/_connectors.ts b/src/_connectors.ts index 9740135..1dad9c3 100644 --- a/src/_connectors.ts +++ b/src/_connectors.ts @@ -7,13 +7,14 @@ import type { ConnectorOptions as LibSQLCoreOptions } from "db0/connectors/libsq import type { ConnectorOptions as LibSQLHttpOptions } from "db0/connectors/libsql/http"; import type { ConnectorOptions as LibSQLNodeOptions } from "db0/connectors/libsql/node"; import type { ConnectorOptions as LibSQLWebOptions } from "db0/connectors/libsql/web"; +import type { ConnectorOptions as MSSQLOptions } from "db0/connectors/mssql"; import type { ConnectorOptions as MySQL2Options } from "db0/connectors/mysql2"; import type { ConnectorOptions as NodeSQLite3Options } from "db0/connectors/node-sqlite3"; import type { ConnectorOptions as PgliteOptions } from "db0/connectors/pglite"; import type { ConnectorOptions as PlanetscaleOptions } from "db0/connectors/planetscale"; import type { ConnectorOptions as PostgreSQLOptions } from "db0/connectors/postgresql"; -export type ConnectorName = "better-sqlite3" | "sqlite" | "bun-sqlite" | "bun" | "cloudflare-d1" | "libsql-core" | "libsql-http" | "libsql-node" | "libsql" | "libsql-web" | "mysql2" | "node-sqlite3" | "pglite" | "planetscale" | "postgresql"; +export type ConnectorName = "better-sqlite3" | "sqlite" | "bun-sqlite" | "bun" | "cloudflare-d1" | "libsql-core" | "libsql-http" | "libsql-node" | "libsql" | "libsql-web" | "mssql" | "mysql2" | "node-sqlite3" | "pglite" | "planetscale" | "postgresql"; export type ConnectorOptions = { "better-sqlite3": BetterSQLite3Options; @@ -29,6 +30,7 @@ export type ConnectorOptions = { /** @deprecated Alias of libsql-node */ "libsql": LibSQLNodeOptions; "libsql-web": LibSQLWebOptions; + "mssql": MSSQLOptions; "mysql2": MySQL2Options; "node-sqlite3": NodeSQLite3Options; "pglite": PgliteOptions; @@ -50,6 +52,7 @@ export const connectors = Object.freeze({ /** @deprecated Alias of libsql-node */ "libsql": "db0/connectors/libsql/node", "libsql-web": "db0/connectors/libsql/web", + "mssql": "db0/connectors/mssql", "mysql2": "db0/connectors/mysql2", "node-sqlite3": "db0/connectors/node-sqlite3", "pglite": "db0/connectors/pglite", From 48f229e10f34a26193d8571df872b0f10ebcb26f Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:34:32 -0500 Subject: [PATCH 39/40] updated test imports --- test/connectors/mssql.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/connectors/mssql.test.ts b/test/connectors/mssql.test.ts index d9c47e6..ffad5ad 100644 --- a/test/connectors/mssql.test.ts +++ b/test/connectors/mssql.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect } from "vitest"; import { TYPES } from "tedious"; -import { getTediousDataType, prepareSqlParameters } from "../../src/connectors/mssql/connector"; -import connector from "../../src/connectors/mssql/index"; +import { getTediousDataType, prepareSqlParameters } from "../../src/connectors/mssql"; +import connector from "../../src/connectors/mssql"; import { testConnector } from "./_tests"; describe.runIf( From f8c9ddc765067499c27079815e4a8ade2a91b64b Mon Sep 17 00:00:00 2001 From: nick-w-nick <43578531+nick-w-nick@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:35:58 -0500 Subject: [PATCH 40/40] removed custom export --- package.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/package.json b/package.json index 345d299..b1f0060 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,6 @@ "import": "./connectors/libsql/node.mjs", "require": "./connectors/libsql/node.cjs" }, - "./connectors/mssql": { - "import": "./connectors/mssql/index.mjs", - "require": "./connectors/mssql/index.cjs", - "web": { - "import": "./connectors/mssql/index.mjs", - "require": "./connectors/mssql/index.cjs" - } - }, "./connectors/*": { "types": "./connectors/*.d.ts", "import": "./connectors/*.mjs",