{"_id":"@abinashpatri/mysql","_rev":"5-abe5e6e6ade15674755a2a92ac0b980e","name":"@abinashpatri/mysql","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@abinashpatri/mysql","version":"1.0.0","keywords":["utils","mysql"],"author":{"name":"Abinash Patri"},"license":"MIT","_id":"@abinashpatri/mysql@1.0.0","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"dist":{"shasum":"2bdcc13a5ce4c029cadd5c50225a3ede44cafe48","tarball":"https://registry.npmjs.org/@abinashpatri/mysql/-/mysql-1.0.0.tgz","fileCount":9,"integrity":"sha512-yxvYargZQ1WLicRqLz9tXnhqbUdYUmT8W6rFr3633w3f8ky/mN/SBx7/KLbp56B8RQLbHOVNU+D7TSmlhHoFhA==","signatures":[{"sig":"MEQCIHmLdFCXC56WGHaSlHDQET2M2qeRtPAAr3mZjbxBt6H/AiAj54uVQyNGWds3utsgXDyZ146NPRlGGQgZ834YXHKrHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25973},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"bc9d483c89a82a628a4285b2f9766083b1b061a9","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"_npmVersion":"11.6.2","description":"Production-grade mysql utility library","directories":{},"_nodeVersion":"24.11.1","dependencies":{"mysql2":"^3.20.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.1.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mysql_1.0.0_1774189338752_0.044922135528558504","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@abinashpatri/mysql","version":"1.0.1","keywords":["utils","mysql"],"author":{"name":"Abinash Patri"},"license":"MIT","_id":"@abinashpatri/mysql@1.0.1","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"dist":{"shasum":"ac7acdc3245becf75ca1df754e643c58f4feeede","tarball":"https://registry.npmjs.org/@abinashpatri/mysql/-/mysql-1.0.1.tgz","fileCount":9,"integrity":"sha512-DqxPOxBFsfV8lpeu/07m54/7AsJ/d02mlC5zlqDQIEdpCvWHgCtJgEo0O8et61w6WEEMguKPfR9BVfPFSRbadQ==","signatures":[{"sig":"MEQCIHsyqBW3Fshhy0rOOfxWur1Ih+4/klfR9aFgo0pgPCsoAiAo3vJAR9CNMOuA+f3m0aaMKsYH/wyZSbdidmI/GuoxQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29606},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"bc9d483c89a82a628a4285b2f9766083b1b061a9","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"_npmVersion":"11.6.2","description":"Production-grade mysql utility library","directories":{},"_nodeVersion":"24.11.1","dependencies":{"mysql2":"^3.20.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.1.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mysql_1.0.1_1774189848700_0.9720801465176321","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@abinashpatri/mysql","version":"1.0.2","keywords":["utils","mysql"],"author":{"name":"Abinash Patri"},"license":"MIT","_id":"@abinashpatri/mysql@1.0.2","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"dist":{"shasum":"a37c664c4cb70f9f99711c7465984056cff9ffa5","tarball":"https://registry.npmjs.org/@abinashpatri/mysql/-/mysql-1.0.2.tgz","fileCount":9,"integrity":"sha512-ut22yKTYs49Ucg92asVpHkEQ9BzyYWi4OF0vSyMUIAZProCQlxjN8axsIQ4cUe3wQyl0FcEkzI/qJLZAAzV9Mg==","signatures":[{"sig":"MEUCIQDHfV5vQh4OtSpKraIPYPjRj1vIBaJv3aALTy3BEqbPJAIgZJCzgyjCXTSLpZ0GBTyl5eb1GSip9DwMKiH9CmPUrsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29592},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"bc9d483c89a82a628a4285b2f9766083b1b061a9","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"_npmVersion":"11.6.2","description":"Production-grade mysql utility library","directories":{},"_nodeVersion":"24.11.1","dependencies":{"mysql2":"^3.20.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.1.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mysql_1.0.2_1774190180702_0.8761602477041084","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@abinashpatri/mysql","version":"1.0.3","keywords":["utils","mysql"],"author":{"name":"Abinash Patri"},"license":"MIT","_id":"@abinashpatri/mysql@1.0.3","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"dist":{"shasum":"a7c77772e54e58a9cde09ab187e097c90e250ac0","tarball":"https://registry.npmjs.org/@abinashpatri/mysql/-/mysql-1.0.3.tgz","fileCount":9,"integrity":"sha512-UORtd/JPgMalX5cNKEqEozxyY3eSt5fPM1l6s+37P4mjWxi+HMHNVqo0IkQBTKs3u5dghKE6G+845NBWCjJocA==","signatures":[{"sig":"MEYCIQDglHZZ/oP8osv/oFxmYwrqWG8BIhqvui25Udg9jZPBqgIhAJlx1cj3yh2ZbSS3fH+TfU5mdHm2tF0d+ii9VSgNUdK1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29592},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"97744f53af74895186a01f2101aefa810274c7ff","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"_npmVersion":"11.6.2","description":"Production-grade mysql utility library","directories":{},"_nodeVersion":"24.11.1","dependencies":{"mysql2":"^3.20.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.1.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mysql_1.0.3_1774241893480_0.7975813532262086","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@abinashpatri/mysql","version":"1.0.4","description":"Production-grade mysql utility library","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js","import":"./dist/index.mjs"}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"keywords":["utils","mysql"],"author":{"name":"Abinash Patri"},"license":"MIT","type":"commonjs","devDependencies":{"@types/express":"^5.0.6","@types/node":"^25.5.0","eslint":"^10.1.0","prettier":"^3.8.1","tsup":"^8.5.1","typescript":"^5.9.3"},"dependencies":{"mysql2":"^3.20.0"},"gitHead":"97744f53af74895186a01f2101aefa810274c7ff","_id":"@abinashpatri/mysql@1.0.4","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-ym8IgPgzeHzZlE+8+UDQpRWiyfDfRCwY8HHLcOLxTMh6/13yEQalF8H49kkpRcNiTKNm6PH0h6eQ9v8EzAknrg==","shasum":"c3c1dc5be3e06498f2ae118419f850c8566dfabf","tarball":"https://registry.npmjs.org/@abinashpatri/mysql/-/mysql-1.0.4.tgz","fileCount":9,"unpackedSize":29564,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC7AYIx8GhvWK6aY5xHvqqZleDyYV58bEI2HUkb0xgOTAiAJGW642O8u0RGaqS6DmECxP4XGV7pSJI/72ogtTqdnPw=="}]},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"directories":{},"maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mysql_1.0.4_1774845630270_0.45771315738242624"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T14:22:18.666Z","modified":"2026-03-30T04:40:30.508Z","1.0.0":"2026-03-22T14:22:18.899Z","1.0.1":"2026-03-22T14:30:48.864Z","1.0.2":"2026-03-22T14:36:20.868Z","1.0.3":"2026-03-23T04:58:13.611Z","1.0.4":"2026-03-30T04:40:30.389Z"},"author":{"name":"Abinash Patri"},"license":"MIT","keywords":["utils","mysql"],"description":"Production-grade mysql utility library","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"readme":"# @abinashpatri/mysql\n\nProduction-focused MySQL utility helpers for Node.js applications using `mysql2/promise`.\n\n## Why this package\n\nThis package gives you a small, practical MySQL toolkit with:\n\n- pooled connections per database key\n- built-in retry for transient query failures\n- transaction helper with auto rollback\n- health checks for one or many configured databases\n- TypeScript-ready APIs and declaration files\n\n## Features\n\n- **Multi-database configuration**  \n  Define multiple database connections (for example `primary`, `analytics`, `readReplica`) and query each by name.\n\n- **Connection pooling**  \n  Uses `mysql2` pool with sensible defaults (`waitForConnections`, `connectionLimit`, `queueLimit`, keep-alive, timeout).\n\n- **Retry support for queries**  \n  `query()` supports retry options: `retries`, `delay`, and exponential `factor`.\n\n- **Slow query warning**  \n  Logs a warning when query execution takes longer than 500ms.\n\n- **Safe transaction wrapper**  \n  `transaction()` automatically:\n  - begins transaction\n  - commits on success\n  - rolls back on error\n  - releases connection in all cases\n\n- **Health checks**  \n  Check one DB (`checkHealth`) or all configured DBs (`checkAllHealth`).\n\n## Install\n\n```bash\nnpm install @abinashpatri/mysql mysql2\n```\n\n## Quick start\n\n```ts\nimport { mysql } from \"@abinashpatri/mysql\";\n\nmysql.setDatabaseConfig({\n  primary: {\n    host: \"127.0.0.1\",\n    port: 3306,\n    user: \"root\",\n    password: \"secret\",\n    database: \"app_db\",\n  },\n});\n\nconst rows = await mysql.query(\"primary\", \"SELECT 1 AS ok\");\nconsole.log(rows);\n```\n\n## Complete demo\n\n```ts\nimport { mysql } from \"@abinashpatri/mysql\";\nimport type { RowDataPacket } from \"mysql2\";\n\n// 1) Configure one or more databases\nmysql.setDatabaseConfig({\n  primary: {\n    host: \"127.0.0.1\",\n    port: 3306,\n    user: \"root\",\n    password: \"secret\",\n    database: \"app_db\",\n    connectionLimit: 20,\n    queueLimit: 100,\n    connectTimeout: 10000,\n  },\n  analytics: {\n    host: \"127.0.0.1\",\n    user: \"analytics_user\",\n    password: \"analytics_secret\",\n    database: \"analytics_db\",\n  },\n});\n\n// 2) Typed SELECT query\ntype UserRow = RowDataPacket & {\n  id: number;\n  email: string;\n  active: number;\n};\n\nconst users = await mysql.query<UserRow[]>(\n  \"primary\",\n  \"SELECT id, email, active FROM users WHERE active = ?\",\n  [1],\n);\n\n// 3) Insert with retry strategy\nawait mysql.query(\n  \"primary\",\n  \"INSERT INTO audit_logs(action, created_at) VALUES(?, NOW())\",\n  [\"login\"],\n  {\n    retry: {\n      retries: 3,\n      delay: 200,\n      factor: 2,\n    },\n  },\n);\n\n// 4) Transaction example\nawait mysql.transaction(\"primary\", async (conn) => {\n  await conn.execute(\n    \"UPDATE wallets SET balance = balance - ? WHERE user_id = ?\",\n    [100, 1],\n  );\n  await conn.execute(\n    \"UPDATE wallets SET balance = balance + ? WHERE user_id = ?\",\n    [100, 2],\n  );\n});\n\n// 5) Health checks\nconst primaryHealth = await mysql.checkHealth(\"primary\");\nconst allHealth = await mysql.checkAllHealth();\nconsole.log({ primaryHealth, allHealth });\n```\n\n## API reference\n\n### `setDatabaseConfig(configs)`\n\nRegisters one or more DB configurations.\n\n```ts\nmysql.setDatabaseConfig({\n  primary: {\n    host: \"127.0.0.1\",\n    user: \"root\",\n    password: \"secret\",\n    database: \"app_db\",\n  },\n});\n```\n\n### `query(dbName, sql, params?, options?)`\n\nExecutes a query using the named pool.\n\n- `dbName: string` - configured database key\n- `sql: string` - SQL statement\n- `params?: unknown[]` - query parameters\n- `options?: { retry?: { retries?: number; delay?: number; factor?: number } }`\n\nReturns a promise of query rows (generic type supported).\n\n### `transaction(dbName, callback)`\n\nRuns callback inside a transaction with auto commit/rollback.\n\n- `dbName: string`\n- `callback: (conn) => Promise<T>`\n\nReturns the callback result `T`.\n\n### `checkHealth(dbName)`\n\nChecks single DB by running `SELECT 1`.\n\nReturns:\n\n```ts\n{\n  db: string;\n  status: \"healthy\" | \"unhealthy\";\n  error?: string;\n}\n```\n\n### `checkAllHealth()`\n\nChecks all configured DBs and returns an array of health statuses.\n\n## Scripts\n\n- `npm run build` - Build CJS, ESM, and declaration files.\n- `npm run typecheck` - Run TypeScript checks (`tsc --noEmit`).\n- `npm run dev` - Watch mode build.\n\n## Production notes\n\n- Call `setDatabaseConfig()` once during app startup before first query.\n- Keep DB credentials in environment variables (do not hardcode secrets).\n- Use separate DB users with least privilege for each environment.\n- Keep retries conservative to avoid amplifying load during outages.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}