{"_id":"@200systems/mf-db-mysql","_rev":"14-4f83e86427ed95c4ff42b40b4dd89599","name":"@200systems/mf-db-mysql","dist-tags":{"latest":"1.1.7"},"versions":{"1.0.1":{"name":"@200systems/mf-db-mysql","version":"1.0.1","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.0.1","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"35fbc5db2f2dde680147e5c6812efc104215cc41","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.0.1.tgz","fileCount":26,"integrity":"sha512-pBZnA5aaaEUnijyw5PwnzOhimNZZQw+s4LqCeXt+LB5RSkBquucS5EgadgElUWQwgZ+7QyAeeRM1C0FeQWXSZQ==","signatures":[{"sig":"MEUCIB2lr7Q7MEA4hbJPuhOHPIz5+6I+mbwA7hv3e84ldOxVAiEA9JtdpWeZdH58CNhsdz7+TARIp5IhkB9b+mQwK24nydQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65346},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"b23d0aca4444d3727bef596b99d52f845ee6bdd8","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.0.1_1750937022881_0.7423587802871838","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.0.2":{"name":"@200systems/mf-db-mysql","version":"1.0.2","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.0.2","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"c05857678cc9b0509d340eedf28103ee639836d7","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.0.2.tgz","fileCount":26,"integrity":"sha512-j0fhifTzmlYWt3FiiEOxzvX91IdJ8nqtY0MR5iPF2mvcSxIeLBtEmOwHybY/31RGBJCqHe4AwECWivvOlnu6YQ==","signatures":[{"sig":"MEYCIQCs7u3l0hIUFhyfhSg40lVfABkm3PSsr6ptoWKQsRcvWAIhAJ2MXkhz80Q2m+xNHvaewaGND8+0j153Ma0Dt+tmUEnt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78645},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"3b9df0fba14ad311035a103071c895f780597d75","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.0.2_1751014415808_0.36739627632251803","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.0.3":{"name":"@200systems/mf-db-mysql","version":"1.0.3","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.0.3","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"63d7276f667eec5a5a8b404c591c6867ee99aa6c","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.0.3.tgz","fileCount":26,"integrity":"sha512-XNaCRHp0r5hBBFy3TmJP0y3cFpj9Z7qwyTQWFNL2r0HHVDk1rA5ffiA1H11POgqJnPwwV+FIY915ilpHa5WKLw==","signatures":[{"sig":"MEUCIHUNiOAOIww8sc6AzULmBfCFd4EpbY5YBQRiIK0P4tNgAiEAg4oidjN27JDy/n7YeEIb8SLj866JQq5D7zKz+9wNQq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78708},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"17e3ce1150d8a91f15ba15d4208a96a40cf211b9","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.0.3_1751056789296_0.5602458741879073","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.0.4":{"name":"@200systems/mf-db-mysql","version":"1.0.4","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.0.4","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"53906c07b1ebcfda562838d58711d883c291d622","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.0.4.tgz","fileCount":26,"integrity":"sha512-01i/rGi7g5DTf2z88Dzb5pVUp46D6qlgcyQ6ITPnUDE9UsVMC9/9tmmkAQaGcHzNXMBfuXP1g1qCjztWNQGGig==","signatures":[{"sig":"MEYCIQDNhSJoy0wCMVZC8GEhYE6teDmli7kZNysDj+lH/xZVaAIhAIYxPQhx8Ldf1HSbaKb5aVkSQDnlUtAI5yIcPlWQFp7u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78708},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"d7bb90f291b6b532083319fa040cfeb43eae8ad7","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.0.4_1751058909264_0.011358991477187885","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.0.5":{"name":"@200systems/mf-db-mysql","version":"1.0.5","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.0.5","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"c92b3f916617d16607b694b6c07d96b0b38c08b3","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.0.5.tgz","fileCount":26,"integrity":"sha512-sQniGfWUrMsFEZ73GpreUMv7/Dd2n5r9JcOlfzcKt0tvyCe0g18qM0nH/wBTTcmIt0uepZf7gzWjXP6EaKIhTw==","signatures":[{"sig":"MEUCIAxZmtsFDNGIQ7es1y/3hue7FbtfJzd30YC3A2IvOHTOAiEAw24Sr0Gu41gWunxUw219zXbnxjhnltlBQkUCqNrgLes=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78730},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"d7bb90f291b6b532083319fa040cfeb43eae8ad7","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.0.5_1751059746149_0.42970046578470855","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.0":{"name":"@200systems/mf-db-mysql","version":"1.1.0","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.0","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"6249b4871543f8ee2d084c9d4c8c499280a06c5d","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.0.tgz","fileCount":30,"integrity":"sha512-4LQ9E+VW2BbpHaQzriGmQTawK9S+P53Mk9i3YXxxoIvoHHMy9MDEmWHPZ7DOvf59GgiaRXySuoKH9vKz5JNsFg==","signatures":[{"sig":"MEYCIQDkK0iyuAhh8RqYMmUx8Lt9B4puVIVkHhmoFPnRT38FNwIhANCltAtfiUUu/mklyLKNad1b3hd31E8XJ6SKe4SeMxuj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77288},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"f17262551117147d336d909a4af42a3520922708","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.0_1751215933143_0.953528287953757","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.1":{"name":"@200systems/mf-db-mysql","version":"1.1.1","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.1","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"f44b321f379b2cc1bb756d7e62ef7be14cca6119","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.1.tgz","fileCount":30,"integrity":"sha512-9d25fgTiu7MJKL4/GUsMU987l5oyXueJpjiUBycn9aZSvdrnZ6i6NW4PGG1HaZYXv2CbduAxYoIMzlubIwcAaQ==","signatures":[{"sig":"MEQCIEVZdnEWVUR2uicqaKDLx7M6IagOPHktJVbZ4X8WsKRBAiABIk9NCnt14K2zQiamag/5Ycuy/gY++w3ZE9eF/pymLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77288},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"b2e1d0a164c5cfd355a044b56b7ec48c88def397","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.1_1751223526474_0.512225515249539","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.2":{"name":"@200systems/mf-db-mysql","version":"1.1.2","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.2","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"6624aef684a8b0493dd514b58300222d06af753c","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.2.tgz","fileCount":30,"integrity":"sha512-FC2tMQruVAhJcf6VADyXvefIM2EB+FPAKihoUWYQeQidJ8X8Jtl4R5XoUf8farWjw9QPHAWK+aURFlc5F1Lbhg==","signatures":[{"sig":"MEUCIEDzTUJOPL85kaRzpbZk8cTZ3STlvOZVMGAeYLWTQK8EAiEA7yNBX+UZCrGj5uMiXOQowtq99Xm9EJXwLCf5HqmEZFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77344},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"b2e1d0a164c5cfd355a044b56b7ec48c88def397","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.2_1751224228423_0.7729047692832753","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.3":{"name":"@200systems/mf-db-mysql","version":"1.1.3","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.3","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"f7323433fd3c5727f3e0f079d28e5584fc1b8ca3","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.3.tgz","fileCount":30,"integrity":"sha512-5ldXAvdajyISlQGSkOor/aITf4lKhP1f/MxJvlqaRRos1VP6F+SyHqVvX+atdqfTn+XL0pgQzn4msFWhXZUG6w==","signatures":[{"sig":"MEUCIDmOXmEMqNBurwj7XtwE4ToeZTccUXpAenoNg6l12t+yAiEAuuBuSu82NTR5vfByEx8mrmucV7ewhvK8nPYY2n+V9LU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77344},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"c3deab4b45525f101f4f82799966e87052d244a7","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.3_1751388971780_0.7732430209053036","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.4":{"name":"@200systems/mf-db-mysql","version":"1.1.4","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.4","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"802947030a3898098e33206ae68012bfad561a2d","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.4.tgz","fileCount":30,"integrity":"sha512-V4GLM3RH/EuZjRFNQGKyya8IAdiNiozrksqbSh3vHuFCfNbWgI+f2L4PX8sh2Igs+IpJS2/WZH5bwBHPGy7jUw==","signatures":[{"sig":"MEQCIDlXM9XHOvXKlR/NqXtfTBpLKQj95rW4pYfWaNxMADvkAiBTcRCB+LaSh1pX18HfTqwKlBthQTgvngdTaAGizkoRjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78260},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"23dcee4f5721e057c3d9625f10e1823f834a466d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.4_1751472519469_0.8625477305765172","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.5":{"name":"@200systems/mf-db-mysql","version":"1.1.5","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.5","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"a20357b3cd8644f5a08ac29ffa5569992ced3a69","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.5.tgz","fileCount":30,"integrity":"sha512-Beq/2p/BRlamIYk57E+VHUrRezpcvvawWuxY/b7YCkhL7FwrVeTNP0FFnnEkAqNBmYAPkfLYJh8URGEyn/nQCA==","signatures":[{"sig":"MEUCIQCzX2o9GCs+2pphYGppPu9B3j1WCfkrZCf+Ju9z3QxTSQIgBoC9lZbitayx1hzXzXOC1RueB0Bb54Ei9WtaTLeLA+w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78260},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"23dcee4f5721e057c3d9625f10e1823f834a466d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.5_1751473971020_0.8663598306124936","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.6":{"name":"@200systems/mf-db-mysql","version":"1.1.6","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.6","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"04ccdd8a70096a37577dc85a4e8301931b3e9498","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.6.tgz","fileCount":30,"integrity":"sha512-NiT7tvSbWXPa2sPw9nbtcWKCQhx6CI3ZShvWWVlSdRMwfjlhE6SPMV1jF6/wLxZSB2XdHZWYvFufHJsOEQwqgg==","signatures":[{"sig":"MEUCIQDR0RoEEF8onRDO3BLjOjG50wwYIENGWQ2WiAgy0JIKNQIgYrlazF0aP6xnegcIDm96Ik4UxJiz8IJyaiTqykcOTVw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78260},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"23dcee4f5721e057c3d9625f10e1823f834a466d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.6_1751474244600_0.06745123619448679","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."},"1.1.7":{"name":"@200systems/mf-db-mysql","version":"1.1.7","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","_id":"@200systems/mf-db-mysql@1.1.7","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"homepage":"https://github.com/200Systems/bitbrick-microframework#readme","bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"dist":{"shasum":"00deac0da3f64f3fe15c3103e99c2a49ed077e01","tarball":"https://registry.npmjs.org/@200systems/mf-db-mysql/-/mf-db-mysql-1.1.7.tgz","fileCount":30,"integrity":"sha512-Q/aKEc92Avp1WRbYQON2W5FS9ZzavJulahqMIb8MMsNNGXUR41EjyiuNcHDOvC7ABQfxwdgIMIhd/vxB+yVLKA==","signatures":[{"sig":"MEUCIGkRxZd04dKrGym65Ra34y3gchpMKACRryx/k56H1NEMAiEA4GodVfjRWTqY17fe2in/9aTsuLKBhEcgY3B44lKg+Ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78271},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"23dcee4f5721e057c3d9625f10e1823f834a466d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist *.tsbuildinfo","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"200systems","actor":{"name":"200systems","type":"user","email":"cleiton.marques@200.systems"},"email":"cleiton.marques@200.systems"},"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"_npmVersion":"10.8.1","description":"MySQL database client with connection pooling, migrations, and health monitoring","directories":{},"_nodeVersion":"22.3.0","dependencies":{"@200systems/mf-logger":"^1.0.0","@200systems/mf-db-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"mysql2":"^3.6.0","typescript":"^5.8.3","@types/node":"^20.10.0"},"peerDependencies":{"mysql2":"^3.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mf-db-mysql_1.1.7_1751475253940_0.5051701752221829","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Descontinuado: use @groundbrick/db-mysql."}},"time":{"created":"2025-06-26T11:23:42.747Z","modified":"2026-09-27T14:02:25.932Z","1.0.1":"2025-06-26T11:23:43.066Z","1.0.2":"2025-06-27T08:53:35.978Z","1.0.3":"2025-06-27T20:39:49.477Z","1.0.4":"2025-06-27T21:15:09.435Z","1.0.5":"2025-06-27T21:29:06.343Z","1.1.0":"2025-06-29T16:52:13.315Z","1.1.1":"2025-06-29T18:58:46.670Z","1.1.2":"2025-06-29T19:10:28.627Z","1.1.3":"2025-07-01T16:56:11.946Z","1.1.4":"2025-07-02T16:08:39.638Z","1.1.5":"2025-07-02T16:32:51.245Z","1.1.6":"2025-07-02T16:37:24.774Z","1.1.7":"2025-07-02T16:54:14.201Z"},"bugs":{"url":"https://github.com/200Systems/bitbrick-microframework/issues"},"author":{"name":"Cleiton Marques","email":"cleiton.marques@200.systems"},"license":"MIT","homepage":"https://github.com/200Systems/bitbrick-microframework#readme","keywords":["typescript","mysql","database","migrations","connection-pooling","microframework","health-monitoring"],"repository":{"url":"git+https://github.com/200Systems/bitbrick-microframework.git","type":"git","directory":"packages/db-mysql"},"description":"MySQL database client with connection pooling, migrations, and health monitoring","maintainers":[{"name":"200systems","email":"cleiton.marques@200.systems"}],"readme":"# @200systems/mf-db-mysql\n\nCliente MySQL para o microframework TypeScript com connection pooling, monitoramento de saúde, gerenciamento de transações e sistema de migrações completo.\n\n## Features Implementadas\n\n- **🔗 Connection Pooling** - Usando `mysql2` com configuração avançada\n- **🏭 Singleton Factory** - Gerenciamento centralizado de instâncias de clientes\n- **🔄 Transaction Management** - Transações automáticas e manuais com BaseTransaction\n- **📊 Health Monitoring** - Verificações de saúde com métricas de timing e pool\n- **🗃️ Migration System** - Sistema completo com UP/DOWN scripts, checksum e rollback\n- **⚙️ TypeScript Support** - Tipagem completa para queries e configurações\n- **🛡️ Error Handling** - Tipos de erro específicos (ConnectionError, QueryError, etc.)\n- **📈 Pool Monitoring** - Informações detalhadas sobre estado do pool de conexões\n\n## Instalação\n\n```bash\nnpm install @200systems/mf-db-mysql\n```\n\n### Peer Dependencies\n\n```bash\nnpm install mysql2\n```\n\n## Quick Start\n\n### 1. Configuração Básica\n\n```typescript\n// src/database.ts\nimport { MySQLFactory, MySQLConfig } from '@200systems/mf-db-mysql';\nimport { createLogger } from '@200systems/mf-logger';\n\nconst config: MySQLConfig = {\n  host: process.env.MYSQL_HOST || 'localhost',\n  port: parseInt(process.env.MYSQL_PORT || '3306'),\n  database: process.env.MYSQL_DATABASE || 'myapp',\n  user: process.env.MYSQL_USER || 'root',\n  password: process.env.MYSQL_PASSWORD || 'secret',\n  \n  // Pool configuration\n  max: 10,\n  min: 2,\n  connectionTimeoutMillis: 60000,\n  idleTimeoutMillis: 30000,\n  \n  // MySQL specific\n  charset: 'utf8mb4',\n  timezone: 'Z',\n  acquireTimeout: 60000,\n  timeout: 60000,\n  reconnect: true,\n  multipleStatements: false,\n  \n  // SSL configuration (production)\n  ssl: process.env.NODE_ENV === 'production' ? {\n    rejectUnauthorized: true\n  } : false\n};\n\nconst logger = createLogger({ context: 'database' });\nexport const dbClient = MySQLFactory.getInstance(config, logger);\n```\n\n### 2. Inicialização e Queries\n\n```typescript\n// src/server.ts\nimport { dbClient } from './database.js';\n\n// Inicializar conexão\nawait dbClient.initialize();\n\n// Query simples com placeholders MySQL (?)\nconst users = await dbClient.query<{ id: number; name: string; email: string }>(\n  'SELECT id, name, email FROM users WHERE active = ?',\n  [true]\n);\n\nconsole.log(`Found ${users.rowCount} users:`, users.rows);\n\n// Cleanup gracioso\nprocess.on('SIGTERM', async () => {\n  await dbClient.close();\n  process.exit(0);\n});\n```\n\n### 3. Transações\n\n```typescript\n// Transação automática (recomendado)\nconst result = await dbClient.transaction(async (trx) => {\n  // Log de auditoria\n  await trx.query('INSERT INTO audit_logs (action, user_id) VALUES (?, ?)', \n    ['USER_CREATED', 123]);\n\n  // Criar usuário\n  const user = await trx.query<{ id: number }>(\n    'INSERT INTO users (name, email) VALUES (?, ?)',\n    ['João Silva', 'joao@example.com']\n  );\n\n  // Criar perfil associado\n  await trx.query('INSERT INTO user_profiles (user_id, settings) VALUES (?, ?)', \n    [user.rows[0].id, '{}']);\n\n  return user.rows[0];\n});\n\nconsole.log('Usuário criado:', result);\n```\n\n## API Reference\n\n### MySQLFactory\n\n```typescript\ninterface MySQLConfig extends DatabaseConfig {\n  // Conexão básica\n  host: string;\n  port: number;\n  database: string;\n  user: string;\n  password: string;\n  \n  // Pool de conexões\n  max?: number;                    // Máximo de conexões (padrão: 10)\n  min?: number;                    // Mínimo de conexões (padrão: 2)\n  connectionTimeoutMillis?: number; // Timeout de conexão (padrão: 60000)\n  idleTimeoutMillis?: number;      // Timeout de idle (padrão: 30000)\n  \n  // MySQL específico\n  charset?: string;                // Charset (padrão: 'utf8mb4')\n  timezone?: string;               // Timezone (padrão: 'Z')\n  acquireTimeout?: number;         // Timeout para adquirir conexão (padrão: 60000)\n  timeout?: number;                // Timeout de query (padrão: 60000)\n  reconnect?: boolean;             // Auto-reconnect (padrão: true)\n  multipleStatements?: boolean;    // Múltiplas statements (padrão: false)\n  \n  // SSL (produção)\n  ssl?: boolean | string | {\n    rejectUnauthorized?: boolean;\n    ca?: string;\n    cert?: string;\n    key?: string;\n  };\n}\n\n// Singleton Factory\nclass MySQLDatabaseFactory {\n  static getInstance(): MySQLDatabaseFactory;\n  getInstance(config: DatabaseConfig, logger?: Logger): DatabaseClient;\n  closeInstance(): Promise<void>;\n}\n\n// Instância padrão para conveniência\nconst MySQLFactory: MySQLDatabaseFactory;\n```\n\n### MySQLClient\n\n```typescript\nclass MySQLClient implements DatabaseClient {\n  // Ciclo de vida\n  initialize(): Promise<void>;\n  close(): Promise<void>;\n  isReady(): boolean;\n  \n  // Queries (usando ? como placeholder - padrão MySQL)\n  query<T>(sql: string, params?: any[]): Promise<QueryResult<T>>;\n  transaction<T>(callback: (trx: MySQLTransaction) => Promise<T>): Promise<T>;\n  \n  // Monitoramento\n  healthCheck(): Promise<HealthCheckResult>;\n  getConnectionInfo(): { total: number; idle: number; waiting: number };\n}\n\ninterface QueryResult<T> {\n  rows: T[];\n  rowCount: number;\n  fields: Array<{ name: string; dataTypeID: number }>;\n}\n\ninterface HealthCheckResult {\n  status: 'healthy' | 'unhealthy';\n  message: string;\n  timestamp: Date;\n  responseTime: number;\n  details?: {\n    activeConnections: number;\n    totalConnections: number;\n  };\n}\n```\n\n### MySQLTransaction\n\n```typescript\nclass MySQLTransaction extends BaseTransaction {\n  query<T>(sql: string, params?: any[]): Promise<QueryResult<T>>;\n  commit(): Promise<void>;\n  rollback(): Promise<void>;\n  isCompleted(): boolean;\n}\n\n// Uso manual (não recomendado)\nconst trx = await dbClient.transaction();\ntry {\n  await trx.query('INSERT INTO logs (event) VALUES (?)', ['START']);\n  await trx.query('UPDATE counters SET value = value + 1');\n  await trx.commit();\n} catch (error) {\n  await trx.rollback();\n  throw error;\n}\n```\n\n## Sistema de Migrações\n\n### MySQLMigrator\n\n```typescript\nimport { MySQLMigrator } from '@200systems/mf-db-mysql';\n\nconst migrator = new MySQLMigrator(\n  dbClient,\n  './migrations',\n  logger.child('migrator')\n);\n\n// Aplicar todas as migrações pendentes\nawait migrator.migrate();\n\n// Rollback da última migração\nawait migrator.rollback();\n\n// Rollback até uma migração específica\nawait migrator.rollbackTo('20241201_001_create_users');\n\n// Reset completo (cuidado!)\nawait migrator.reset();\n\n// Verificar status\nconst status = await migrator.getStatus();\nconsole.log('Migrações aplicadas:', status.map(m => m.id));\n\n// Listar migrações pendentes\nconst pending = await migrator.getPending();\nconsole.log('Pendentes:', pending.map(m => m.id));\n```\n\n### Estrutura de Arquivos de Migração\n\n```\nmigrations/\n├── 20241201_001_create_users_table.sql\n├── 20241201_002_add_user_profiles.sql\n├── 20241202_001_add_indexes.sql\n└── 20241203_001_add_audit_logs.sql\n```\n\n### Formato de Arquivo de Migração\n\n```sql\n-- Criar tabela de usuários com engine InnoDB\n-- UP\nCREATE TABLE users (\n  id INT AUTO_INCREMENT PRIMARY KEY,\n  name VARCHAR(100) NOT NULL,\n  email VARCHAR(100) UNIQUE NOT NULL,\n  password_hash VARCHAR(255) NOT NULL,\n  active BOOLEAN DEFAULT TRUE,\n  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE INDEX idx_users_email ON users(email);\nCREATE INDEX idx_users_active ON users(active);\n\n-- DOWN\nDROP INDEX IF EXISTS idx_users_active ON users;\nDROP INDEX IF EXISTS idx_users_email ON users;\nDROP TABLE IF EXISTS users;\n```\n\n**Regras importantes:**\n- Arquivo deve ter seção `-- UP` e seção `-- DOWN` **obrigatórias**\n- Primeira linha com `--` vira a descrição da migração\n- Arquivos aplicados em ordem lexicográfica\n- Rollback executa a seção `-- DOWN` em ordem reversa\n- Checksum garante integridade dos arquivos já aplicados\n\n### Exemplos de Migrações MySQL\n\n```sql\n-- migrations/20241201_001_create_users_table.sql\n-- Criar tabela inicial de usuários\n-- UP\nCREATE TABLE users (\n  id INT AUTO_INCREMENT PRIMARY KEY,\n  name VARCHAR(100) NOT NULL,\n  email VARCHAR(100) UNIQUE NOT NULL,\n  password_hash VARCHAR(255) NOT NULL,\n  role ENUM('admin', 'user') DEFAULT 'user',\n  active BOOLEAN DEFAULT TRUE,\n  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n-- DOWN\nDROP TABLE IF EXISTS users;\n```\n\n```sql\n-- migrations/20241201_002_add_user_profiles.sql\n-- Adicionar tabela de perfis com foreign key\n-- UP\nCREATE TABLE user_profiles (\n  id INT AUTO_INCREMENT PRIMARY KEY,\n  user_id INT NOT NULL,\n  first_name VARCHAR(50),\n  last_name VARCHAR(50),\n  phone VARCHAR(20),\n  avatar_url TEXT,\n  settings JSON,\n  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  \n  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\n  UNIQUE KEY uk_user_profiles_user_id (user_id)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n-- DOWN\nDROP TABLE IF EXISTS user_profiles;\n```\n\n```sql\n-- migrations/20241202_001_optimize_indexes.sql\n-- Otimizar índices para queries comuns\n-- UP\nCREATE INDEX idx_users_role_active ON users(role, active);\nCREATE INDEX idx_user_profiles_name ON user_profiles(first_name, last_name);\n\n-- Adicionar índice fulltext para busca\nALTER TABLE users ADD FULLTEXT(name, email);\n\n-- DOWN\nALTER TABLE users DROP INDEX name;\nDROP INDEX IF EXISTS idx_user_profiles_name ON user_profiles;\nDROP INDEX IF EXISTS idx_users_role_active ON users;\n```\n\n## Exemplos Práticos\n\n### Configuração com Variáveis de Ambiente\n\n```typescript\n// src/config/database.ts\nimport { MySQLConfig } from '@200systems/mf-db-mysql';\n\nexport const dbConfig: MySQLConfig = {\n  host: process.env.MYSQL_HOST || 'localhost',\n  port: parseInt(process.env.MYSQL_PORT || '3306'),\n  database: process.env.MYSQL_DATABASE!,\n  user: process.env.MYSQL_USER!,\n  password: process.env.MYSQL_PASSWORD!,\n  \n  // Pool otimizado para produção\n  max: parseInt(process.env.DB_POOL_MAX || '10'),\n  min: parseInt(process.env.DB_POOL_MIN || '2'),\n  connectionTimeoutMillis: parseInt(process.env.DB_CONNECTION_TIMEOUT || '60000'),\n  idleTimeoutMillis: parseInt(process.env.DB_IDLE_TIMEOUT || '30000'),\n  \n  // Configurações MySQL específicas\n  charset: 'utf8mb4',\n  timezone: 'Z',\n  acquireTimeout: 60000,\n  timeout: 10000,\n  reconnect: true,\n  multipleStatements: false,\n  \n  // SSL em produção\n  ssl: process.env.NODE_ENV === 'production' ? {\n    rejectUnauthorized: process.env.DB_SSL_REJECT_UNAUTHORIZED === 'true',\n    ca: process.env.DB_SSL_CA,\n    cert: process.env.DB_SSL_CERT,\n    key: process.env.DB_SSL_KEY\n  } : false\n};\n```\n\n### Repository Pattern\n\n```typescript\n// src/repositories/UserRepository.ts\nimport { DatabaseClient, QueryResult } from '@200systems/mf-db-mysql';\n\nexport interface User {\n  id: number;\n  name: string;\n  email: string;\n  role: 'admin' | 'user';\n  active: boolean;\n  created_at: Date;\n  updated_at: Date;\n}\n\nexport class UserRepository {\n  constructor(private db: DatabaseClient) {}\n\n  async findById(id: number): Promise<User | null> {\n    const result = await this.db.query<User>(\n      'SELECT * FROM users WHERE id = ?',\n      [id]\n    );\n    return result.rows[0] || null;\n  }\n\n  async findByEmail(email: string): Promise<User | null> {\n    const result = await this.db.query<User>(\n      'SELECT * FROM users WHERE email = ?',\n      [email]\n    );\n    return result.rows[0] || null;\n  }\n\n  async findPaginated(limit: number, offset: number): Promise<{ users: User[]; total: number }> {\n    const [usersResult, countResult] = await Promise.all([\n      this.db.query<User>(\n        'SELECT * FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?',\n        [limit, offset]\n      ),\n      this.db.query<{ count: number }>(\n        'SELECT COUNT(*) as count FROM users'\n      )\n    ]);\n\n    return {\n      users: usersResult.rows,\n      total: countResult.rows[0].count\n    };\n  }\n\n  async create(userData: Omit<User, 'id' | 'created_at' | 'updated_at'>): Promise<User> {\n    const result = await this.db.query<{ insertId: number }>(\n      `INSERT INTO users (name, email, role, active) \n       VALUES (?, ?, ?, ?)`,\n      [userData.name, userData.email, userData.role, userData.active]\n    );\n\n    return this.findById(result.rows[0].insertId)!;\n  }\n\n  async update(id: number, userData: Partial<Omit<User, 'id' | 'created_at' | 'updated_at'>>): Promise<User | null> {\n    const setClause = Object.keys(userData)\n      .map(key => `${key} = ?`)\n      .join(', ');\n    \n    const values = [...Object.values(userData), id];\n    \n    await this.db.query(\n      `UPDATE users SET ${setClause} WHERE id = ?`,\n      values\n    );\n\n    return this.findById(id);\n  }\n\n  async delete(id: number): Promise<boolean> {\n    const result = await this.db.query(\n      'DELETE FROM users WHERE id = ?',\n      [id]\n    );\n    return (result.rowCount || 0) > 0;\n  }\n\n  async searchByName(searchTerm: string): Promise<User[]> {\n    const result = await this.db.query<User>(\n      'SELECT * FROM users WHERE MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE)',\n      [searchTerm]\n    );\n    return result.rows;\n  }\n}\n```\n\n### Service com Transações\n\n```typescript\n// src/services/UserService.ts\nimport { DatabaseClient } from '@200systems/mf-db-mysql';\nimport { UserRepository } from '../repositories/UserRepository.js';\n\nexport class UserService {\n  constructor(\n    private db: DatabaseClient,\n    private userRepo: UserRepository\n  ) {}\n\n  async createUserWithProfile(userData: {\n    name: string;\n    email: string;\n    role: 'admin' | 'user';\n    firstName: string;\n    lastName: string;\n  }): Promise<{ user: User; profile: UserProfile }> {\n    return this.db.transaction(async (trx) => {\n      // Criar usuário\n      const userResult = await trx.query<{ insertId: number }>(\n        'INSERT INTO users (name, email, role) VALUES (?, ?, ?)',\n        [userData.name, userData.email, userData.role]\n      );\n\n      const userId = userResult.rows[0].insertId;\n\n      // Criar perfil\n      await trx.query(\n        `INSERT INTO user_profiles (user_id, first_name, last_name) \n         VALUES (?, ?, ?)`,\n        [userId, userData.firstName, userData.lastName]\n      );\n\n      // Log de auditoria\n      await trx.query(\n        'INSERT INTO audit_logs (action, entity_type, entity_id, details) VALUES (?, ?, ?, ?)',\n        ['CREATE', 'user', userId, JSON.stringify(userData)]\n      );\n\n      // Buscar dados criados\n      const [user, profile] = await Promise.all([\n        trx.query<User>('SELECT * FROM users WHERE id = ?', [userId]),\n        trx.query<UserProfile>('SELECT * FROM user_profiles WHERE user_id = ?', [userId])\n      ]);\n\n      return {\n        user: user.rows[0],\n        profile: profile.rows[0]\n      };\n    });\n  }\n\n  async transferCredits(fromUserId: number, toUserId: number, amount: number): Promise<void> {\n    return this.db.transaction(async (trx) => {\n      // Verificar saldo suficiente\n      const fromUser = await trx.query<{ credits: number }>(\n        'SELECT credits FROM user_accounts WHERE user_id = ? FOR UPDATE',\n        [fromUserId]\n      );\n\n      if (fromUser.rows[0].credits < amount) {\n        throw new Error('Insufficient credits');\n      }\n\n      // Debitar do usuário origem\n      await trx.query(\n        'UPDATE user_accounts SET credits = credits - ? WHERE user_id = ?',\n        [amount, fromUserId]\n      );\n\n      // Creditar para usuário destino\n      await trx.query(\n        'UPDATE user_accounts SET credits = credits + ? WHERE user_id = ?',\n        [amount, toUserId]\n      );\n\n      // Log da transação\n      await trx.query(\n        `INSERT INTO credit_transactions (from_user_id, to_user_id, amount, type) \n         VALUES (?, ?, ?, ?)`,\n        [fromUserId, toUserId, amount, 'transfer']\n      );\n    });\n  }\n}\n```\n\n### Health Check e Monitoring\n\n```typescript\n// src/health.ts\nimport { dbClient } from './database.js';\n\nexport async function checkDatabaseHealth() {\n  const health = await dbClient.healthCheck();\n  const connectionInfo = dbClient.getConnectionInfo();\n  \n  return {\n    database: {\n      status: health.status,\n      message: health.message,\n      responseTime: health.responseTime,\n      timestamp: health.timestamp,\n      details: health.details\n    },\n    connectionPool: {\n      total: connectionInfo.total,\n      idle: connectionInfo.idle,\n      waiting: connectionInfo.waiting,\n      active: connectionInfo.total - connectionInfo.idle,\n      utilization: `${Math.round((connectionInfo.total - connectionInfo.idle) / connectionInfo.total * 100)}%`\n    }\n  };\n}\n\n// src/routes/health.ts (Express)\napp.get('/health', async (req, res) => {\n  try {\n    const health = await checkDatabaseHealth();\n    const statusCode = health.database.status === 'healthy' ? 200 : 503;\n    res.status(statusCode).json(health);\n  } catch (error) {\n    res.status(503).json({\n      database: { status: 'unhealthy', message: error.message },\n      connectionPool: { total: 0, idle: 0, waiting: 0, active: 0, utilization: '0%' }\n    });\n  }\n});\n```\n\n## Diferenças MySQL vs PostgreSQL\n\n### Placeholders de Query\n\n```typescript\n// MySQL usa ? como placeholder\nawait mysqlClient.query('SELECT * FROM users WHERE id = ? AND active = ?', [123, true]);\n\n// PostgreSQL usa $1, $2, etc.\nawait postgresClient.query('SELECT * FROM users WHERE id = $1 AND active = $2', [123, true]);\n```\n\n### Auto-increment vs Serial\n\n```sql\n-- MySQL\nCREATE TABLE users (\n  id INT AUTO_INCREMENT PRIMARY KEY,\n  name VARCHAR(100)\n);\n\n-- PostgreSQL  \nCREATE TABLE users (\n  id SERIAL PRIMARY KEY,\n  name VARCHAR(100)\n);\n```\n\n### Tipos de Dados\n\n```sql\n-- MySQL\nJSON, ENUM('value1', 'value2'), TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n\n-- PostgreSQL\nJSONB, VARCHAR(20) CHECK (column IN ('value1', 'value2')), TIMESTAMP WITH TIME ZONE\n```\n\n## Error Handling\n\n### Tipos de Erro Disponíveis\n\n```typescript\nimport { \n  ConnectionError, \n  QueryError, \n  TransactionError, \n  MigrationError \n} from '@200systems/mf-db-mysql';\n\ntry {\n  await dbClient.query('SELECT * FROM users');\n} catch (error) {\n  if (error instanceof ConnectionError) {\n    console.error('Erro de conexão:', error.message);\n    // Tentar reconectar ou usar fallback\n  } else if (error instanceof QueryError) {\n    console.error('Erro na query:', error.message);\n    console.error('SQL:', error.sql);\n    console.error('Params:', error.params);\n    \n    // Tratar erros específicos do MySQL\n    if (error.message.includes('Duplicate entry')) {\n      console.error('Violação de constraint UNIQUE');\n    }\n  } else if (error instanceof TransactionError) {\n    console.error('Erro na transação:', error.message);\n    // Transaction já foi automaticamente revertida\n  }\n}\n```\n\n### Padrão Singleton e Múltiplos Clientes\n\n```typescript\n// Múltiplos clientes para diferentes bases\nconst mainDbClient = MySQLFactory.getInstance({\n  host: 'localhost',\n  database: 'main_app',\n  user: 'app_user',\n  password: 'secret'\n});\n\nconst analyticsDbClient = MySQLFactory.getInstance({\n  host: 'analytics-server',\n  database: 'analytics',\n  user: 'analytics_user', \n  password: 'secret'\n});\n\n// Clients são automaticamente reutilizados se config for idêntica\nconst sameClient = MySQLFactory.getInstance({\n  host: 'localhost',\n  database: 'main_app',\n  user: 'app_user',\n  password: 'secret'\n}); // Retorna a mesma instância de mainDbClient\n\n// Cleanup de todas as conexões\nawait MySQLDatabaseFactory.getInstance().closeInstance();\n```\n\n## Configuração de Ambiente\n\n```bash\n# .env\n# Configuração do MySQL\nMYSQL_HOST=localhost\nMYSQL_PORT=3306\nMYSQL_DATABASE=microframework_app\nMYSQL_USER=root\nMYSQL_PASSWORD=your_password\n\n# SSL (produção)\nDB_SSL=true\nDB_SSL_REJECT_UNAUTHORIZED=true\nDB_SSL_CA=/path/to/ca.pem\nDB_SSL_CERT=/path/to/cert.pem\nDB_SSL_KEY=/path/to/key.pem\n\n# Pool de Conexões\nDB_POOL_MAX=10\nDB_POOL_MIN=2\nDB_CONNECTION_TIMEOUT=60000\nDB_IDLE_TIMEOUT=30000\n\n# Configuração da Aplicação\nNODE_ENV=production\nLOG_LEVEL=info\n```\n\n## Migration CLI Script\n\n```typescript\n// scripts/migrate.ts\nimport { dbClient } from '../src/database.js';\nimport { MySQLMigrator } from '@200systems/mf-db-mysql';\nimport { createLogger } from '@200systems/mf-logger';\n\nconst logger = createLogger({ context: 'migration-cli' });\nconst migrator = new MySQLMigrator(dbClient, './migrations', logger);\n\nasync function main() {\n  const command = process.argv[2];\n  const arg = process.argv[3];\n  \n  await dbClient.initialize();\n  \n  try {\n    switch (command) {\n      case 'up':\n        await migrator.migrate();\n        break;\n      case 'down':\n        if (arg) {\n          await migrator.rollbackTo(arg);\n        } else {\n          await migrator.rollback();\n        }\n        break;\n      case 'status':\n        const status = await migrator.getStatus();\n        console.log(`Applied migrations: ${status.length}`);\n        status.forEach(m => console.log(`  ✓ ${m.id} - ${m.description}`));\n        \n        const pending = await migrator.getPending();\n        if (pending.length > 0) {\n          console.log(`\\nPending migrations: ${pending.length}`);\n          pending.forEach(m => console.log(`  ○ ${m.id} - ${m.description}`));\n        }\n        break;\n      case 'reset':\n        if (arg === '--confirm') {\n          await migrator.reset();\n        } else {\n          console.log('Use: npm run migrate reset --confirm');\n        }\n        break;\n      default:\n        console.log('Usage: npm run migrate [up|down|status|reset] [migration_id|--confirm]');\n    }\n  } finally {\n    await dbClient.close();\n  }\n}\n\nmain().catch(console.error);\n```\n\n```json\n// package.json scripts\n{\n  \"scripts\": {\n    \"migrate\": \"tsx scripts/migrate.ts\",\n    \"migrate:up\": \"npm run migrate up\",\n    \"migrate:down\": \"npm run migrate down\",\n    \"migrate:status\": \"npm run migrate status\",\n    \"migrate:reset\": \"npm run migrate reset\"\n  }\n}\n```\n\n## Integração com Express Adapter\n\n```typescript\n// src/server.ts - Integração com @200systems/mf-express-adapter\nimport { ExpressApp } from '@200systems/mf-express-adapter';\nimport { dbClient } from './database.js';\n\nconst app = new ExpressApp({\n  port: 3000,\n  cors: { origin: true }\n});\n\n// Middleware de database (personalizado)\napp.getApp().use((req, res, next) => {\n  req.db = dbClient;\n  next();\n});\n\n// Health check endpoint\napp.addRoute({\n  method: 'get',\n  path: '/health',\n  handler: async (req, res) => {\n    const health = await checkDatabaseHealth();\n    const statusCode = health.database.status === 'healthy' ? 200 : 503;\n    res.status(statusCode).json(health);\n  }\n});\n\n// Aplicar migrações na inicialização\nconst migrator = new MySQLMigrator(dbClient, './migrations', logger);\nawait dbClient.initialize();\nawait migrator.migrate();\n\nawait app.start();\n```\n\n## Melhores Práticas\n\n1. **Use o padrão Singleton** para evitar múltiplas conexões desnecessárias\n2. **Sempre inicialize** o cliente antes de usar (`await dbClient.initialize()`)\n3. **Use transações** para operações que modificam múltiplas tabelas\n4. **Configure charset utf8mb4** para suporte completo a Unicode\n5. **Use InnoDB engine** para suporte a transações e foreign keys\n6. **Implemente health checks** para monitoramento de produção\n7. **Configure SSL** adequadamente em produção\n8. **Use Repository pattern** para organizar queries\n9. **Monitore o pool** de conexões em produção\n10. **Teste migrações** em ambiente de desenvolvimento primeiro\n11. **Use índices apropriados** para queries frequentes\n12. **Configure timeouts** adequados para sua aplicação\n\n## Dependencies\n\n### Required\n- `@200systems/mf-logger` - Sistema de logging\n- `@200systems/mf-db-core` - Abstrações de banco de dados\n\n### Peer Dependencies\n- `mysql2` - Driver MySQL para Node.js (^3.6.0)\n\n## License\n\nMIT","readmeFilename":"README.md"}