{"_id":"@a_jackie_z/typeorm","_rev":"8-759e553f4467029853fc1a1bb47caf71","name":"@a_jackie_z/typeorm","dist-tags":{"latest":"1.0.9"},"versions":{"1.0.0":{"name":"@a_jackie_z/typeorm","version":"1.0.0","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.0","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"58e5a83f699974a7741bc98cbc4bad2f2721a137","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.0.tgz","fileCount":6,"integrity":"sha512-yMumVI8vJxqrrFIzqfv71eMW/vCTMEecG4wi08wgSgsmOLgShKHtVy9id7dCK0DKcoee3OSplerR/wb9p4wI7Q==","signatures":[{"sig":"MEYCIQDHPL74tsdJrBfaTV1BhfOipcTSx6k0RH5BXosQBPBjngIhANZDQCRglG24c8uO52dmXJBsibsmX1HuPL5CVwwdtLSX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1400797},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"326e417e5c29f5aa658fb8b988feb08936f407f2","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"pg":"^8.17.2","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.1","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.0_1769514520723_0.8151299755757746","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@a_jackie_z/typeorm","version":"1.0.1","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.1","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"f80641be8c30c9fbec7b16e144a32019d54c8f33","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.1.tgz","fileCount":6,"integrity":"sha512-1CLLhm6VMzaMV5xaaJjXtPCxrHaftrmpM/TiuMPj9l5oGxZqFJAYilqKLLhc9HCFKru4kO83HKDSCaIfLkI6LQ==","signatures":[{"sig":"MEQCIGNP28D4C+23oJn2MRGwIP05yM4pgxtEFVWvtK0dKCIMAiARye1pXLCfaw61WrSOlMOABXkkogOAuiuU7cc+bb81PA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1401799},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"85d2edae43db9cbf01ff635bbf96afffe37aebf4","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"pg":"^8.17.2","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.1","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.1_1770005488599_0.18100218706979043","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@a_jackie_z/typeorm","version":"1.0.2","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.2","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/typeorm#readme","bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"dist":{"shasum":"c6e3e794a59b0a19c2409e21a4a5b2f5f1cd66db","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.2.tgz","fileCount":6,"integrity":"sha512-qK/6eZ8YufCb59maodPfI2Bn/Od3bbd952xhwGNqvANd0VFjgoeaECG0LZy6zyLy5ysUnau9PXRtrfYstgqnbg==","signatures":[{"sig":"MEYCIQCkYdjZzsZicUaHkBgs0DvITaEex3/mt5aNybVP+y5rQAIhAPLz4qZTLH22kjIz/ELXptBhi/wZtByX+zot6JdYqRhJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1401873},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"93d403bfb55e86b29a02c6ba38856d08d7f2763b","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"_npmVersion":"11.6.2","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"pg":"^8.17.2","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.1","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.2_1770012221008_0.7041511798411435","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@a_jackie_z/typeorm","version":"1.0.3","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.3","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/typeorm#readme","bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"dist":{"shasum":"5204cb3c34b2694070532fe0e1b9ab0e6eff3aa3","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.3.tgz","fileCount":6,"integrity":"sha512-9CSBfd5ZRgagUm6ynSolip1Pq39h3jK5pKECj3k4c4DSR5L6YkrB07dYKFtAWpmz/qrUtokq+7WHIW4FhhUEUg==","signatures":[{"sig":"MEQCIA/MdyceCrPbG9aNtcTEkR1SYrci+z5DdOQBEuEBBWglAiA1jJljdjf7JnB2eiA0lffobmeFCtE2WDAKZTrPwRImxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1402329},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"93d403bfb55e86b29a02c6ba38856d08d7f2763b","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"_npmVersion":"11.6.2","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"pg":"^8.18.0","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.3","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.2.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.3_1770142698861_0.5720576148154186","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@a_jackie_z/typeorm","version":"1.0.5","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.5","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/typeorm#readme","bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"dist":{"shasum":"b72fc6607d9b44deaf0eb0280487553133d087e5","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.5.tgz","fileCount":6,"integrity":"sha512-OAI1aOR9ePfLjUR4XkYh7WQpJcVBmdxz8bnMhn584jisEGr9uSVXLM2y+lYz2CmNZvhV+T7XkKkrqq0zRjZ5gw==","signatures":[{"sig":"MEUCIQCgVxHgDG5nJYt5GLL3eg47B8QlA9qxoiKQtlFnMNdL8wIgCkUEJ2wdQubBaWJwQVrP+0s9IJsdH+kNbRATxi27C8c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1401873},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ea786b9d95f5a8a53d9032b9107a22d03d292e88","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"_npmVersion":"11.6.2","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"pg":"^8.18.0","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.5","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.2.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.5_1770192541656_0.8887331477345912","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@a_jackie_z/typeorm","version":"1.0.7","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.7","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/typeorm#readme","bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"dist":{"shasum":"c635dc65b09ce3afea3911f2973624c9ddedfd1b","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.7.tgz","fileCount":6,"integrity":"sha512-7jB2YBq4LpUdkrRi5bUemIfkyef9JsgrHyHJnI1jGRUpRFy0WOqW7wt+T7YaB3pxYvA94d4o2c1Qj380c9IZdg==","signatures":[{"sig":"MEQCIAP/ZB9/mZAA9y34JqpLUkRISo0+z5RWC9MGZW5WS+tJAiAWeeM/ULq6m9hJ6sNH24HDDLoDo3LpC6+JC7barTafgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1401881},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f67186b0243bf7f7573ccf15fa224ebae590c772","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"_npmVersion":"11.8.0","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"pg":"^8.18.0","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.6","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.3.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.7_1772032233062_0.07657620926966824","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@a_jackie_z/typeorm","version":"1.0.8","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/typeorm@1.0.8","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/typeorm#readme","bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"dist":{"shasum":"91a2e5753221653436345c948554b5e14ed6274d","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.8.tgz","fileCount":6,"integrity":"sha512-hLSZQ+f1fPR/crQQ0ni1jtpVcdoNWBWVklswwavDpEaiA9OMR0APmNUPPGYvw0K0Xk9U0NTGY0vg7qwpp6dGfA==","signatures":[{"sig":"MEUCIQCRqtc5/TrYFh3FuvBFhFweKDI/gp9g7D6e8+20aJScpAIgALSuRWDAkW1MbP3GHwOlHZjVFyzgXps9+BoPgYfQBgQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1401881},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f67186b0243bf7f7573ccf15fa224ebae590c772","scripts":{"test":"tsx lib/tests/config.ts","build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"_npmVersion":"11.8.0","description":"A TypeORM wrapper with handy utilities for easier database management.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"pg":"^8.18.0","sqlite3":"^5.1.7","typeorm":"^0.3.28","reflect-metadata":"^0.2.2","@a_jackie_z/config":"^1.1.7","typeorm-naming-strategies":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.3.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm_1.0.8_1772032282914_0.3917367927864981","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@a_jackie_z/typeorm","version":"1.0.9","description":"A TypeORM wrapper with handy utilities for easier database management.","license":"MIT","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup","test":"tsx lib/tests/config.ts"},"dependencies":{"@a_jackie_z/config":"^1.1.9","reflect-metadata":"^0.2.2","pg":"^8.20.0","sqlite3":"^6.0.1","typeorm":"^0.3.28","typeorm-naming-strategies":"^4.1.0"},"devDependencies":{"@types/node":"^25.5.0","tsup":"^8.5.1","tsx":"^4.21.0","typescript":"^6.0.2"},"gitHead":"697a8e6dbff1bb92497a1833fcba506dea62d648","_id":"@a_jackie_z/typeorm@1.0.9","bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"homepage":"https://github.com/a-jackie-z/typeorm#readme","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-8uJS9Km3BkiQ25SRE8qlb9ol+dEzQzWCqH6iRLdHol0FjWHTkaTjsw2zj3syMf7EKxRlS4FNBD2DLcMeetF8QA==","shasum":"390306832524e4f401de84a1f6a6be5fa73037ff","tarball":"https://registry.npmjs.org/@a_jackie_z/typeorm/-/typeorm-1.0.9.tgz","fileCount":6,"unpackedSize":1401881,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC3xltTHBBTYiD8YdshSi8tqZwvYCu87gd04M83qsawCwIhAPrrgOQYq9BeM4pCOSk4KFH9TI9kf5gVxivvGZmjFIDe"}]},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"directories":{},"maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/typeorm_1.0.9_1774347331447_0.9011792261647913"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-27T11:48:40.659Z","modified":"2026-03-24T10:15:31.752Z","1.0.0":"2026-01-27T11:48:40.907Z","1.0.1":"2026-02-02T04:11:28.766Z","1.0.2":"2026-02-02T06:03:41.179Z","1.0.3":"2026-02-03T18:18:18.997Z","1.0.5":"2026-02-04T08:09:01.830Z","1.0.7":"2026-02-25T15:10:33.321Z","1.0.8":"2026-02-25T15:11:23.145Z","1.0.9":"2026-03-24T10:15:31.644Z"},"bugs":{"url":"https://github.com/a-jackie-z/typeorm/issues"},"author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","homepage":"https://github.com/a-jackie-z/typeorm#readme","repository":{"url":"git+https://github.com/a-jackie-z/typeorm.git"},"description":"A TypeORM wrapper with handy utilities for easier database management.","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"readme":"# @a_jackie_z/typeorm\n\nA TypeORM wrapper with handy utilities for easier database management.\n\n## Installation\n\n```bash\nnpm install @a_jackie_z/typeorm reflect-metadata\n```\n\n## Quick Start (30 seconds)\n\n**1. Set environment variables:**\n\n```bash\nexport DB_TYPE=postgres\nexport DB_POSTGRES_HOST=localhost\nexport DB_POSTGRES_PORT=5432\nexport DB_POSTGRES_USERNAME=postgres\nexport DB_POSTGRES_PASSWORD=yourpassword\nexport DB_POSTGRES_DATABASE=mydb\n```\n\n**2. Connect to database:**\n\n```typescript\nimport 'reflect-metadata'\nimport { createOrm } from '@a_jackie_z/typeorm'\n\nconst dataSource = createOrm()\nawait dataSource.initialize()\n// ✓ Connected!\n```\n\nThat's it! You're connected and ready to use TypeORM.\n\n## Basic Usage\n\n### Define an Entity\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from '@a_jackie_z/typeorm'\n\n@Entity('user')\nexport class User {\n  @PrimaryGeneratedColumn()\n  id!: number\n\n  @Column()\n  email!: string\n\n  @Column()\n  name!: string\n\n  @CreateDateColumn()\n  createdAt!: Date\n}\n```\n\n### CRUD Operations\n\n```typescript\nimport { createOrm } from '@a_jackie_z/typeorm'\nimport { User } from './entities/User.js'\n\nconst dataSource = createOrm({\n  entities: [User],\n  synchronize: true, // Only for development!\n})\n\nawait dataSource.initialize()\n\nconst userRepo = dataSource.getRepository(User)\n\n// Create\nconst user = userRepo.create({ email: 'john@example.com', name: 'John' })\nawait userRepo.save(user)\n\n// Read\nconst users = await userRepo.find()\nconst john = await userRepo.findOneBy({ email: 'john@example.com' })\n\n// Update\njohn.name = 'John Doe'\nawait userRepo.save(john)\n\n// Delete\nawait userRepo.remove(john)\n```\n\n## Environment Variables\n\n### PostgreSQL (Recommended)\n\n```bash\nDB_TYPE=postgres\nDB_POSTGRES_HOST=localhost\nDB_POSTGRES_PORT=5432\nDB_POSTGRES_USERNAME=postgres\nDB_POSTGRES_PASSWORD=yourpassword\nDB_POSTGRES_DATABASE=mydb\nDB_POSTGRES_LOGGING=false  # optional\n```\n\n### MySQL / MariaDB\n\n```bash\nDB_TYPE=mysql  # or mariadb\nDB_MYSQL_HOST=localhost\nDB_MYSQL_PORT=3306\nDB_MYSQL_USERNAME=root\nDB_MYSQL_PASSWORD=yourpassword\nDB_MYSQL_DATABASE=mydb\nDB_MYSQL_LOGGING=false  # optional\n```\n\n### SQLite (Default)\n\n```bash\nDB_TYPE=sqlite\nDB_SQLITE_DATABASE=./data.db  # or :memory:\nDB_SQLITE_LOGGING=false  # optional\n```\n\nIf no `DB_TYPE` is set, SQLite with in-memory database is used by default.\n\n## Real-World Example\n\nProduction-ready setup with migrations and error handling:\n\n```typescript\nimport 'reflect-metadata'\nimport { logger } from '@a_jackie_z/logger'\nimport { createOrm, DataSource } from '@a_jackie_z/typeorm'\nimport { User } from './entities/User.js'\nimport { CreateUserTable1234567890 } from './migrations/1234567890-CreateUserTable.js'\n\nexport let dataSource: DataSource\n\ntry {\n  dataSource = createOrm({\n    entities: [User],\n    migrations: [CreateUserTable1234567890],\n    // migrations run automatically on startup\n  })\n\n  await dataSource.initialize()\n  logger.info('Database connection established')\n} catch (error) {\n  logger.error(error, 'Database connection error')\n  process.exit(1)\n}\n```\n\n## Features\n\n### Automatic Snake Case\n\nProperty names are automatically converted to snake_case in the database:\n\n```typescript\n@Entity('user')\nexport class User {\n  @Column()\n  firstName!: string  // → first_name in database\n\n  @CreateDateColumn()\n  createdAt!: Date  // → created_at in database\n}\n```\n\n### Automatic Migrations\n\nMigrations run automatically on startup (controlled by `migrationsRun: true` default):\n\n```typescript\nconst dataSource = createOrm({\n  entities: [User],\n  migrations: [CreateUserTable1234567890],\n  // migrationsRun: true by default\n})\n\nawait dataSource.initialize()\n// All pending migrations executed ✓\n```\n\n### Query Builder\n\n```typescript\nconst users = await dataSource\n  .getRepository(User)\n  .createQueryBuilder('user')\n  .where('user.email LIKE :pattern', { pattern: '%@example.com' })\n  .orderBy('user.createdAt', 'DESC')\n  .take(10)\n  .getMany()\n```\n\n### Transactions\n\n```typescript\nawait dataSource.transaction(async (manager) => {\n  const user = manager.create(User, {\n    email: 'jane@example.com',\n    name: 'Jane',\n  })\n  await manager.save(user)\n  \n  // More operations in same transaction...\n})\n```\n\n## API Reference\n\n### `createOrm(options?)`\n\nCreates a TypeORM DataSource with environment-based configuration.\n\n```typescript\nfunction createOrm(options?: Partial<DataSourceOptions>): DataSource\n```\n\n**Default Configuration:**\n- `logging`: `['migration', 'schema', 'error']`\n- `migrationsRun`: `true` (runs migrations on startup)\n- `namingStrategy`: `SnakeNamingStrategy` (camelCase → snake_case)\n- `synchronize`: `false` (use migrations instead)\n\n**Override any option:**\n\n```typescript\nconst dataSource = createOrm({\n  entities: ['./entities/**/*.entity.ts'],\n  migrations: ['./migrations/**/*.ts'],\n  logging: true,\n  synchronize: false, // NEVER true in production\n})\n```\n\n## Configuration Schemas\n\nType-safe configuration schemas for custom setup:\n\n```typescript\nimport { createConfig } from '@a_jackie_z/config'\nimport { postgresSchema, mysqlSchema, sqliteSchema } from '@a_jackie_z/typeorm'\n\n// Use with custom environment\nconst config = createConfig(\n  postgresSchema,\n  {\n    type: 'DB_TYPE',\n    host: 'DB_POSTGRES_HOST',\n    port: 'DB_POSTGRES_PORT',\n    username: 'DB_POSTGRES_USERNAME',\n    password: 'DB_POSTGRES_PASSWORD',\n    database: 'DB_POSTGRES_DATABASE',\n  },\n  process.env\n)\n```\n\n## Testing\n\nUse in-memory SQLite for fast tests:\n\n```typescript\nimport { createOrm } from '@a_jackie_z/typeorm'\n\nconst testDataSource = createOrm({\n  type: 'sqlite',\n  database: ':memory:',\n  entities: [User],\n  synchronize: true,  // OK for tests\n  dropSchema: true,\n})\n\nawait testDataSource.initialize()\n// Run tests...\nawait testDataSource.destroy()\n```\n\n## TypeScript Setup\n\nRequired in `tsconfig.json`:\n\n```json\n{\n  \"compilerOptions\": {\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true\n  }\n}\n```\n\nImport `reflect-metadata` once at your app entry point:\n\n```typescript\nimport 'reflect-metadata'\n```\n\n## Best Practices\n\n1. ✅ Use migrations for schema changes (never `synchronize: true` in production)\n2. ✅ Enable `migrationsRun: true` for automatic migration execution\n3. ✅ Use repositories for cleaner code\n4. ✅ Handle initialization errors gracefully\n5. ✅ Use environment variables for different environments\n6. ❌ Never commit database credentials to git\n\n## Re-exported TypeORM\n\nAll TypeORM exports are available:\n\n```typescript\nimport {\n  Entity,\n  Column,\n  PrimaryGeneratedColumn,\n  ManyToOne,\n  OneToMany,\n  // ... everything from 'typeorm'\n} from '@a_jackie_z/typeorm'\n```\n\n## License\n\nMIT\n\n## Author\n\nSang Lu <connect.with.sang@gmail.com>\n","readmeFilename":"README.md"}