{"_id":"@chenpeiyuan/idb-repository","_rev":"4-72721ff294532380b097c46827b5d40b","name":"@chenpeiyuan/idb-repository","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@chenpeiyuan/idb-repository","version":"1.0.0","keywords":[],"author":{"name":"chenxingzhi"},"license":"ISC","_id":"@chenpeiyuan/idb-repository@1.0.0","maintainers":[{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"}],"dist":{"shasum":"ccdcc83bdb49b8bf48c6c8c181acf3df78690a9e","tarball":"https://registry.npmjs.org/@chenpeiyuan/idb-repository/-/idb-repository-1.0.0.tgz","fileCount":8,"integrity":"sha512-BRV/+fzPb7pSxVh8ZYa4DXsq1nmh975yaWdC1RrhVGmz/XdypoM1WyU08s5jSYK0txyahRmiQkaa1n0XY55U+w==","signatures":[{"sig":"MEUCIEfa906beILMbe6dm+oa+Nx463UhWxcBYe80SVdsXpimAiEA8eWMqX4klYW6kZakfv7RjkH2KyAZ2Ifotk0q4C4/IWI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30940},"main":"./dist/index.cjs","pnpm":{"onlyBuiltDependencies":["esbuild","sharp","core-js"]},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"9300036f78d754d5fc71250a0dd1054113bdc3d8","scripts":{"test":"vitest run","build":"tsup","prebuild":"rimraf dist .tsbuildinfo","test:watch":"vitest"},"_npmUser":{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"},"_npmVersion":"10.9.2","description":"一个基于 Dexie.js 的 IndexedDB 仓库管理库，提供了简洁的 CRUD 操作接口。","directories":{},"_nodeVersion":"22.17.0","dependencies":{"dexie":"^4.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.4","devDependencies":{"tsx":"^4.20.6","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^4.0.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/node":"^24.9.2","fake-indexeddb":"^6.2.5"},"_npmOperationalInternal":{"tmp":"tmp/idb-repository_1.0.0_1773913372186_0.6603159675011752","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@chenpeiyuan/idb-repository","version":"1.0.1","keywords":[],"author":{"name":"chenxingzhi"},"license":"ISC","_id":"@chenpeiyuan/idb-repository@1.0.1","maintainers":[{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"}],"dist":{"shasum":"a7c4b15ab8ce86c98a2f51b239f2230f7f89634f","tarball":"https://registry.npmjs.org/@chenpeiyuan/idb-repository/-/idb-repository-1.0.1.tgz","fileCount":8,"integrity":"sha512-TofWX/WhaRR3wL3VbcTiFY51sINsyZn3vD+un5hF3N5DvFnE/XKHrb6yMwumTMXaxvjXtyITVRXlQQVeDcb6Tg==","signatures":[{"sig":"MEYCIQDkP1Rt2GCmyEXjyxKu5a6PzoetbuznWriiQ+T4Bzu6IAIhAPfwvC2/VzqZzvUq0kKODwbLp27YMAYEeu469XESZvZK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31300},"main":"./dist/index.cjs","pnpm":{"onlyBuiltDependencies":["esbuild","sharp","core-js"]},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"faa3b5969d254b77ea7460633f3dfd628359347b","scripts":{"test":"vitest run","build":"tsup","prebuild":"rimraf dist .tsbuildinfo","test:watch":"vitest"},"_npmUser":{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"},"_npmVersion":"10.9.2","description":"一个基于 Dexie.js 的 IndexedDB 仓库管理库，提供了简洁的 CRUD 操作接口。","directories":{},"_nodeVersion":"22.17.0","dependencies":{"dexie":"^4.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.4","devDependencies":{"tsx":"^4.20.6","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^4.0.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/node":"^24.9.2","fake-indexeddb":"^6.2.5"},"_npmOperationalInternal":{"tmp":"tmp/idb-repository_1.0.1_1773974816350_0.7339788950308117","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@chenpeiyuan/idb-repository","version":"1.0.2","keywords":[],"author":{"name":"chenxingzhi"},"license":"ISC","_id":"@chenpeiyuan/idb-repository@1.0.2","maintainers":[{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"}],"dist":{"shasum":"d47cec6ac0a831f431f4afce1ff5ad791c0a3afa","tarball":"https://registry.npmjs.org/@chenpeiyuan/idb-repository/-/idb-repository-1.0.2.tgz","fileCount":8,"integrity":"sha512-jGHFi1AT2c4PljcdO9eCH8kuMX8LwsNktQeg8ua+/NzhhZJU+c4UklXyD0nThunfvxMh3g5kzN7TrdavOgMcLA==","signatures":[{"sig":"MEUCIHQy4i/Kd+Te6rgPt/1AP6ZwvGLNBrAbWEdGcxgrkpxBAiEAoS3auYkYr/AS2tQE/KUZSGBQyoTHHYX3fnVX54UpqAQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31329},"main":"./dist/index.cjs","pnpm":{"onlyBuiltDependencies":["esbuild","sharp","core-js"]},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"957330f4c59825fa35cabc509c31d7fc8eaa17ed","scripts":{"test":"vitest run","build":"tsup","prebuild":"rimraf dist .tsbuildinfo","test:watch":"vitest"},"_npmUser":{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"},"_npmVersion":"10.9.2","description":"一个基于 Dexie.js 的 IndexedDB 仓库管理库，提供了简洁的 CRUD 操作接口。","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.4","devDependencies":{"tsx":"^4.20.6","tsup":"^8.5.0","dexie":"^4.0.11","rimraf":"^6.0.1","vitest":"^4.0.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/node":"^24.9.2","fake-indexeddb":"^6.2.5"},"peerDependencies":{"dexie":"^4.0.11"},"_npmOperationalInternal":{"tmp":"tmp/idb-repository_1.0.2_1779634551100_0.2534838016837917","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@chenpeiyuan/idb-repository","version":"1.0.3","type":"module","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"scripts":{"prebuild":"rimraf dist .tsbuildinfo","build":"tsup","test":"vitest run","test:watch":"vitest"},"keywords":[],"author":{"name":"chenxingzhi"},"license":"ISC","packageManager":"pnpm@10.12.4","devDependencies":{"dexie":"^4.0.11","@types/node":"^24.9.2","fake-indexeddb":"^6.2.5","rimraf":"^6.0.1","tsc-alias":"^1.8.16","tsup":"^8.5.0","tsx":"^4.20.6","typescript":"^5.9.3","vitest":"^4.0.4"},"peerDependencies":{"dexie":"^4.0.11"},"pnpm":{"onlyBuiltDependencies":["esbuild","sharp","core-js"]},"_id":"@chenpeiyuan/idb-repository@1.0.3","gitHead":"312b0db2b063ad3c379ae23395475dd4b8f6a338","description":"一个基于 **Dexie.js** 的 IndexedDB 仓库管理库，提供简洁的 CRUD 操作接口，自动处理时间戳和版本管理。","_nodeVersion":"22.17.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-tefMomSlj6O28lj1iLxVMqDmXLBXG1jTmg6x+z15r/No68QQnjQ2y0fztk7+JQsc6WLLdofJEjhXAA3O+14Ezg==","shasum":"492c3576f95a3cc4a3814d14d0e8f637bca016ed","tarball":"https://registry.npmjs.org/@chenpeiyuan/idb-repository/-/idb-repository-1.0.3.tgz","fileCount":8,"unpackedSize":50849,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQClrV3XVBrp+REmhertPJlyXEBUpjkGhg6+U+jnlN9PGgIhAKFOHR9FaRUIiFbytNUGjJPi9ie+QSFXkzK1Dp9l4q6c"}]},"_npmUser":{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"},"directories":{},"maintainers":[{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/idb-repository_1.0.3_1780293993400_0.9235561514793778"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-19T09:42:52.110Z","modified":"2026-06-01T06:06:33.638Z","1.0.0":"2026-03-19T09:42:52.320Z","1.0.1":"2026-03-20T02:46:56.499Z","1.0.2":"2026-05-24T14:55:51.243Z","1.0.3":"2026-06-01T06:06:33.534Z"},"author":{"name":"chenxingzhi"},"license":"ISC","keywords":[],"description":"一个基于 **Dexie.js** 的 IndexedDB 仓库管理库，提供简洁的 CRUD 操作接口，自动处理时间戳和版本管理。","maintainers":[{"name":"chenpeiyuan","email":"chenpeiyuan1987@163.com"}],"readme":"# @chenpeiyuan/idb-repository\n\n一个基于 **Dexie.js** 的 IndexedDB 仓库管理库，提供简洁的 CRUD 操作接口，自动处理时间戳和版本管理。\n\n## ✨ 特性\n\n- 🚀 **简洁 API**: 提供直观的 CRUD 操作接口\n- ⏰ **自动时间戳**: 自动管理 `createdAt` 和 `updatedAt` 字段\n- 🔢 **版本控制**: 自动维护数据版本号\n- 🆔 **自定义 ID**: 支持自定义 ID 生成器\n- 📦 **两种仓库**: \n  - `BaseRepository`: 支持完整 CRUD 操作\n  - `OnlyCreateRepository`: 只支持创建和删除（适用于日志等场景）\n- ✅ **完整测试**: 36 个测试用例，覆盖所有核心功能\n\n## 📦 安装\n\n```bash\nnpm install @chenpeiyuan/idb-repository\n```\n\n## 🔧 基本使用\n\n### 1. 定义实体接口\n\n```typescript\nimport type { BaseEntity, OnlyCreateEntity } from '@chenpeiyuan/idb-repository';\n\n// 可读写实体（支持添加、更新、删除）\nexport interface Product extends BaseEntity<number> {\n  name: string;\n  price: number;\n  description?: string;\n}\n\n// 只创建实体（支持添加、删除，但不支持更新）\nexport interface Log extends OnlyCreateEntity<number> {\n  level: 'info' | 'warn' | 'error';\n  message: string;\n  details?: any;\n}\n\n// 使用自定义ID类型的实体\nexport interface User extends BaseEntity<string> {\n  username: string;\n  email: string;\n}\n```\n\n### 2. 创建数据库类\n\n```typescript\nimport { Database, type IdGenerator, type Table } from '@chenpeiyuan/idb-repository';\nimport type { Product, Log, User } from './types';\n\n// 自定义ID生成器（可选）\nconst stringIdGenerator: IdGenerator<string> = () => {\n  return Date.now().toString(36) + Math.random().toString(36).substr(2);\n};\n\nexport class AppDatabase extends Database<number> {\n  readonly products!: Table<Product>;\n  readonly logs!: Table<Log>;\n\n  constructor() {\n    // 传入自定义ID生成器（可选）\n    super('appDatabase');\n    \n    this.version(1).stores({\n      products: '++id, name, price, createdAt, updatedAt, version',\n      logs: '++id, level, createdAt'\n    });\n\n    // 初始化钩子\n    this.initAlterHooks(['products']); // 为可更新的表添加钩子\n    this.initWriteHooks(['logs']);     // 为只创建的表添加钩子\n  }\n}\n\n// 使用字符串ID的数据库\nexport class UserDatabase extends Database<string> {\n  readonly users!: Table<User>;\n\n  constructor() {\n    super('userDatabase', stringIdGenerator);\n    \n    this.version(1).stores({\n      users: 'id, username, email, createdAt, updatedAt, version'\n    });\n\n    this.initAlterHooks(['users']);\n  }\n}\n```\n\n### 3. 创建仓库实例\n\n```typescript\nimport { BaseRepository, OnlyCreateRepository } from '@chenpeiyuan/idb-repository';\nimport { AppDatabase, UserDatabase } from './database';\n\n// 创建数据库实例\nconst db = new AppDatabase();\nconst userDb = new UserDatabase();\n\n// 创建仓库实例\nconst productRepository = new BaseRepository<Product>(db.products);\nconst logRepository = new OnlyCreateRepository<Log>(db.logs);\nconst userRepository = new BaseRepository<User>(userDb.users);\n```\n\n### 4. 使用仓库操作数据\n\n#### BaseRepository（可读写仓库）\n\n```typescript\n// 添加产品\nconst productId = await productRepository.add({ name: 'iPhone 14', price: 6999 });\n\n// 获取产品\nconst product = await productRepository.get(productId);\n\n// 更新产品\nif (product) {\n  const updatedProduct = { ...product, price: 7999 };\n  await productRepository.alt(updatedProduct);\n}\n\n// 删除产品\nawait productRepository.del(productId);\n\n// 批量添加产品\nconst productIds = await productRepository.batchAdd([\n  { name: 'iPhone 14', price: 6999 },\n  { name: 'iPhone 14 Pro', price: 8999 }\n]);\n\n// 批量更新产品\nconst productsToUpdate = await Promise.all([\n  productRepository.get(productIds[0]),\n  productRepository.get(productIds[1])\n]);\n\nif (productsToUpdate[0] && productsToUpdate[1]) {\n  const updatedProducts = [\n    { ...productsToUpdate[0], price: 7499 },\n    { ...productsToUpdate[1], price: 9499 }\n  ];\n  await productRepository.batchAlt(updatedProducts);\n}\n\n// 批量删除产品\nawait productRepository.batchDel(productIds);\n\n// 获取所有产品\nconst allProducts = await productRepository.list();\n\n// 使用字符串ID的用户操作\nconst userId = await userRepository.add({ username: 'admin', email: 'admin@example.com' });\nconst user = await userRepository.get(userId);\n```\n\n#### OnlyCreateRepository（只创建仓库）\n\n```typescript\n// 添加日志\nconst logId = await logRepository.add({ level: 'info', message: '用户登录' });\n\n// 获取日志\nconst log = await logRepository.get(logId);\n\n// 删除日志\nawait logRepository.del(logId);\n\n// 批量添加日志\nawait logRepository.batchAdd([\n  { level: 'info', message: '用户登录' },\n  { level: 'error', message: '登录失败' }\n]);\n\n// 批量删除日志\nconst logIds = [1, 2, 3];\nawait logRepository.batchDel(logIds);\n\n// 获取所有日志\nconst allLogs = await logRepository.list();\n```\n\n## 📖 API 文档\n\n### BaseRepository<T>\n\n| 方法 | 描述 | 参数 | 返回值 |\n|------|------|------|--------|\n| `add` | 添加实体 | `entity: InsertType<T>` | `Promise<T['id']>` |\n| `del` | 删除实体 | `id: T['id']` | `Promise<void>` |\n| `alt` | 更新实体 | `entity: T` | `Promise<void>` |\n| `get` | 获取实体 | `id: T['id']` | `Promise<T \\| undefined>` |\n| `batchAdd` | 批量添加实体 | `entities: Array<InsertType<T>>` | `Promise<T['id'][]>` |\n| `batchAlt` | 批量更新实体 | `entities: Array<T>` | `Promise<void>` |\n| `batchDel` | 批量删除实体 | `ids: Array<T['id']>` | `Promise<void>` |\n| `list` | 获取所有实体 | 无 | `Promise<T[]>` |\n\n### OnlyCreateRepository<T>\n\n| 方法 | 描述 | 参数 | 返回值 |\n|------|------|------|--------|\n| `add` | 添加实体 | `entity: InsertType<T>` | `Promise<T['id']>` |\n| `del` | 删除实体 | `id: T['id']` | `Promise<void>` |\n| `get` | 获取实体 | `id: T['id']` | `Promise<T \\| undefined>` |\n| `batchAdd` | 批量添加实体 | `entities: Array<InsertType<T>>` | `Promise<T['id'][]>` |\n| `batchDel` | 批量删除实体 | `ids: Array<T['id']>` | `Promise<void>` |\n| `list` | 获取所有实体 | 无 | `Promise<T[]>` |\n\n### Database<K>\n\n| 方法 | 描述 | 参数 |\n|------|------|------|\n| `initAlterHooks` | 为可更新的表初始化钩子（自动管理 createdAt、updatedAt、version） | `tables: Array<string>` |\n| `initWriteHooks` | 为只创建的表初始化钩子（自动管理 createdAt） | `tables: Array<string>` |\n\n## 📐 类型定义\n\n### BaseEntity<K>\n\n```typescript\ntype BaseEntity<K> = {\n  id: K;\n  createdAt: Date;\n  updatedAt: Date;\n  version: number;\n};\n```\n\n### OnlyCreateEntity<K>\n\n```typescript\ntype OnlyCreateEntity<K> = {\n  id: K;\n  createdAt: Date;\n};\n```\n\n### InsertType<T>\n\n用于创建实体时的类型，自动排除了系统生成的字段。\n\n```typescript\ntype InsertType<T> = Omit<T, keyof BaseEntity<T['id']>> & Partial<BaseEntity<T['id']>>;\n```\n\n### IdGenerator<K>\n\n```typescript\ntype IdGenerator<K> = () => K;\n```\n\n## 🧪 测试\n\n运行测试：\n\n```bash\nnpm test\n```\n\n测试覆盖：\n- ✅ CRUD 操作测试\n- ✅ 批量操作测试\n- ✅ 钩子功能测试\n- ✅ ID 生成器测试\n- ✅ 边界情况测试\n- ✅ 空数组处理测试\n\n## 📁 项目结构\n\n```\nidb-repository/\n├── main/                    # 源代码目录\n│   ├── BaseRepository.ts    # 可读写仓库实现\n│   ├── OnlyCreateRepository.ts  # 只创建仓库实现\n│   ├── Database.ts          # 数据库基类\n│   ├── type.d.ts            # 类型定义\n│   └── index.ts             # 导出入口\n├── test/                    # 测试目录\n│   └── repository.test.ts   # 测试用例\n├── package.json\n├── tsconfig.json\n├── vitest.config.ts\n└── README.md\n```\n\n## 📝 许可证\n\nMIT\n","readmeFilename":"README.md"}