{"_id":"@automate-crud/mongoose","_rev":"4-6bd95be10bbd078f6ae8b48fc68ed225","name":"@automate-crud/mongoose","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@automate-crud/mongoose","version":"0.1.0","license":"MIT","_id":"@automate-crud/mongoose@0.1.0","maintainers":[{"name":"shivam27k","email":"shivamkumar027k@gmail.com"}],"dist":{"shasum":"2d984e4ee91deb4b884db124fb8a9ae4ec71106c","tarball":"https://registry.npmjs.org/@automate-crud/mongoose/-/mongoose-0.1.0.tgz","fileCount":7,"integrity":"sha512-NWolKSJE4hH5RVS3d3/jng7zCaeE9YbjP8zITeHjrcUfbH6PVaUlyLqzK5NM49ojh2xrd3G3sDp2K8b1Qfl+bQ==","signatures":[{"sig":"MEQCICLU5DQRkYuBCL/qEMSrne7zWFubsMV9pGoyr/7Ufm3aAiAD/sUiqw/K4J9Cld/9wq8mkBOL53DYLSBCYB0PHYaN2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9253},"main":"src/index.js","type":"module","gitHead":"34f8be5657d22ed8fcc0979e031af208f4267181","scripts":{"test":"node test/run-tests.js"},"_npmUser":{"name":"shivam27k","email":"shivamkumar027k@gmail.com"},"_npmVersion":"11.6.1","description":"Auto CRUD for Express + Mongoose","directories":{},"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"supertest":"^7.1.0","mongodb-memory-server":"^10.1.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","mongoose":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mongoose_0.1.0_1772150151324_0.9097033191671178","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@automate-crud/mongoose","version":"0.1.1","license":"MIT","_id":"@automate-crud/mongoose@0.1.1","maintainers":[{"name":"shivam27k","email":"shivamkumar027k@gmail.com"}],"dist":{"shasum":"f32b682c0097afee67abd5004b15564f99e6a05b","tarball":"https://registry.npmjs.org/@automate-crud/mongoose/-/mongoose-0.1.1.tgz","fileCount":5,"integrity":"sha512-FQJdofBBwUx/NJXWO8umkwjkIjB1TNTfbftxLHELhPXtjiVeBhXGhFrhyAWCKmU60Whjl1rvKzVHHnfdqtIgtw==","signatures":[{"sig":"MEUCIDxln5z6a6UBnoS0C92aTi14o+FEx5sdwPuyGmQ0hbUNAiEAjw63pQqKieLpZh6hOn7Wb2yYaCHw1U5ODyfdwnZRVpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7141},"main":"src/index.js","type":"module","exports":{".":"./src/index.js"},"gitHead":"34c32013226efb9623c467105f10d4b0fe02475c","scripts":{"test":"node test/run-tests.js"},"_npmUser":{"name":"shivam27k","email":"shivamkumar027k@gmail.com"},"_npmVersion":"11.6.1","description":"Auto CRUD for Express + Mongoose","directories":{},"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"supertest":"^7.1.0","mongodb-memory-server":"^10.1.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","mongoose":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mongoose_0.1.1_1772150706863_0.6182077909366817","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@automate-crud/mongoose","version":"0.1.2","keywords":["crud","mongoose","mongodb","express","rest-api","nodejs","boilerplate","automation"],"license":"MIT","_id":"@automate-crud/mongoose@0.1.2","maintainers":[{"name":"shivam27k","email":"shivamkumar027k@gmail.com"}],"dist":{"shasum":"61998acb07ea21ccc3e77e6dad95d88a962eec9b","tarball":"https://registry.npmjs.org/@automate-crud/mongoose/-/mongoose-0.1.2.tgz","fileCount":5,"integrity":"sha512-14djRulD00WPJwG9f/FEEOP5P0RXkrqRQWead1WrgIxsf86HI86NB/OU1RGtBielG0yCQJ+RzhLhWwFpQdIm5A==","signatures":[{"sig":"MEYCIQCxChc0pZ9sqXJPsV+/su1+9W6pTEEL0UvlSYBYQBLEpQIhALKT4IhHma5rG2LwJO+6LgKHlRUuB4GCjDh+v6zh4wXw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7286},"main":"src/index.js","type":"module","exports":{".":"./src/index.js"},"gitHead":"34c32013226efb9623c467105f10d4b0fe02475c","scripts":{"test":"node test/run-tests.js"},"_npmUser":{"name":"shivam27k","email":"shivamkumar027k@gmail.com"},"_npmVersion":"11.6.1","description":"Auto CRUD for Express + Mongoose","directories":{},"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"supertest":"^7.1.0","mongodb-memory-server":"^10.1.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","mongoose":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mongoose_0.1.2_1772150759043_0.8457375567737402","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@automate-crud/mongoose","version":"0.1.3","description":"Auto CRUD for Express + Mongoose","main":"src/index.js","exports":{".":"./src/index.js"},"types":"src/index.d.ts","type":"module","license":"MIT","peerDependencies":{"express":"^4.18.0 || ^5.0.0","mongoose":"^8.0.0"},"devDependencies":{"supertest":"^7.1.0","mongodb-memory-server":"^10.1.0"},"scripts":{"test":"node test/run-tests.js"},"keywords":["crud","mongoose","mongodb","express","rest-api","nodejs","boilerplate","automation"],"gitHead":"5d0d86f4724266e754522637279cf3375e89a7c9","_id":"@automate-crud/mongoose@0.1.3","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-Mkaaa9ynOTjEa3tNLvIfYNNhzgFrUAfAmEZB+JAeywXrfX01rIQIQB0R+qeQBtsSLaJd6cpNG/nrfQx9a1TQlA==","shasum":"999d1369df341d847b8855478a8bc6ce97989f3c","tarball":"https://registry.npmjs.org/@automate-crud/mongoose/-/mongoose-0.1.3.tgz","fileCount":6,"unpackedSize":12550,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD9cEOnV/UbdtPT9tnor5as3OpYZ7h0cP3vIaT9c2ux0gIgYPRbu+W+gweZJS1+KVPy1I64qMjS7AqXCngBta9pCBo="}]},"_npmUser":{"name":"shivam27k","email":"shivamkumar027k@gmail.com"},"directories":{},"maintainers":[{"name":"shivam27k","email":"shivamkumar027k@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mongoose_0.1.3_1774025373657_0.8215791253624405"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-26T23:55:51.143Z","modified":"2026-03-20T16:49:33.927Z","0.1.0":"2026-02-26T23:55:51.459Z","0.1.1":"2026-02-27T00:05:07.034Z","0.1.2":"2026-02-27T00:05:59.198Z","0.1.3":"2026-03-20T16:49:33.801Z"},"license":"MIT","keywords":["crud","mongoose","mongodb","express","rest-api","nodejs","boilerplate","automation"],"description":"Auto CRUD for Express + Mongoose","maintainers":[{"name":"shivam27k","email":"shivamkumar027k@gmail.com"}],"readme":"# @automate-crud/mongoose\n\nGenerate Express CRUD routes directly from a Mongoose model.\n\nThis package is for the repetitive part of backend work:\n\n- list\n- get by id\n- create\n- update\n- delete\n\nYou define the model, mount one router, and get working CRUD APIs with query support.\n\n## Install\n\n```bash\nnpm i @automate-crud/mongoose express mongoose\n```\n\n## Quick Start\n\n```js\nimport express from \"express\";\nimport mongoose from \"mongoose\";\nimport { createCrudRouter, crudErrorHandler } from \"@automate-crud/mongoose\";\n\nawait mongoose.connect(process.env.MONGO_URI);\n\nconst User = mongoose.model(\n  \"User\",\n  new mongoose.Schema(\n    {\n      name: { type: String, required: true, index: true },\n      email: { type: String, required: true, unique: true, index: true },\n      archived: { type: Boolean, default: false }\n    },\n    { timestamps: true }\n  )\n);\n\nconst app = express();\napp.use(express.json());\n\napp.use(\n  \"/users\",\n  createCrudRouter({\n    model: User,\n    searchFields: [\"name\", \"email\"],\n    allowedIncludes: []\n  })\n);\n\napp.use(crudErrorHandler);\napp.listen(4000);\n```\n\n## Generated Routes\n\nMounting on `/users` gives:\n\n- `GET /users`\n- `GET /users/:id`\n- `POST /users`\n- `PATCH /users/:id`\n- `DELETE /users/:id`\n\n## What You Get\n\n- Pagination with `page` and `limit`\n- Sorting with `sort`\n- Field selection with `select`\n- Search with `q`\n- Filtering with query params or `filter`\n- Controlled populate with `include`\n- Hooks for create, update, and delete\n- Custom routes for model-specific actions\n\n## Minimal Usage\n\n```js\napp.use(\n  \"/users\",\n  createCrudRouter({\n    model: User\n  })\n);\n```\n\n## Query Examples\n\n```http\nGET /users?page=2&limit=10\nGET /users?sort=-createdAt\nGET /users?select=name,email\nGET /users?q=shiv\nGET /users?include=team\nGET /users?name=Shiv\nGET /users?filter={\"archived\":false}\n```\n\n## Options\n\n### `model`\n\nRequired. The Mongoose model to use.\n\n### `searchFields`\n\nFields searched when `q` is provided.\n\n```js\ncreateCrudRouter({\n  model: User,\n  searchFields: [\"name\", \"email\"]\n});\n```\n\n### `allowedIncludes`\n\nAllowed populate paths for `include`.\n\n```js\ncreateCrudRouter({\n  model: User,\n  allowedIncludes: [\"team\", \"profile\"]\n});\n```\n\n### `idParam`\n\nChange the route param name from `id`.\n\n```js\ncreateCrudRouter({\n  model: User,\n  idParam: \"userId\"\n});\n```\n\n### `hooks`\n\nSupported hooks:\n\n- `beforeCreate(req, body)`\n- `beforeUpdate(req, body)`\n- `beforeDelete(req)`\n\nExample:\n\n```js\ncreateCrudRouter({\n  model: User,\n  hooks: {\n    beforeCreate(req, body) {\n      return {\n        ...body,\n        name: body.name.trim()\n      };\n    },\n    beforeUpdate(req, body) {\n      return {\n        ...body,\n        name: body.name?.toUpperCase() ?? body.name\n      };\n    }\n  }\n});\n```\n\n### `customRoutes`\n\nUse this for model-specific actions without writing full controller boilerplate.\n\n```js\ncreateCrudRouter({\n  model: User,\n  customRoutes: [\n    {\n      method: \"post\",\n      path: \"/:id/archive\",\n      handler: async ({ params, model }) => {\n        return model.findByIdAndUpdate(\n          params.id,\n          { archived: true },\n          { new: true }\n        ).lean();\n      }\n    }\n  ]\n});\n```\n\nHandler input:\n\n- `req`\n- `params`\n- `query`\n- `body`\n- `model`\n\nReturned value becomes:\n\n```json\n{\n  \"data\": {}\n}\n```\n\n## Error Handling\n\nUse the built-in middleware after your routes.\n\n```js\napp.use(crudErrorHandler);\n```\n\nError response shape:\n\n```json\n{\n  \"error\": {\n    \"message\": \"Internal server error\"\n  }\n}\n```\n\n## Local Testing\n\n```bash\nnpm test --workspace @automate-crud/mongoose\n```\n\nThe test setup uses:\n\n- `supertest`\n- `mongodb-memory-server`\n\n## Current Scope\n\nThis package currently focuses on:\n\n- Express\n- Mongoose\n- repetitive CRUD removal\n- hooks\n- custom routes\n\nIt does not yet include:\n\n- auth\n- role/permission system\n- soft delete\n- Prisma or SQL support\n- declarative action generation\n","readmeFilename":"README.md"}