{"_id":"@atiqisrak/jerry-pagebuilder-engine","_rev":"2-4eec02a58eb71f9b105ef65a9531db31","name":"@atiqisrak/jerry-pagebuilder-engine","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.1":{"name":"@atiqisrak/jerry-pagebuilder-engine","version":"1.0.1","keywords":["pagebuilder","headless","express","api","ecommerce","blocks"],"license":"MIT","_id":"@atiqisrak/jerry-pagebuilder-engine@1.0.1","maintainers":[{"name":"atiqisrak","email":"atiqisrak@gmail.com"}],"homepage":"https://github.com/atiqisrak/jerry#readme","bugs":{"url":"https://github.com/atiqisrak/jerry/issues"},"dist":{"shasum":"4190cb190f569fd146a04d403490536f162e11f6","tarball":"https://registry.npmjs.org/@atiqisrak/jerry-pagebuilder-engine/-/jerry-pagebuilder-engine-1.0.1.tgz","fileCount":33,"integrity":"sha512-Z6CNrVXmrGm4IoLwwpDWnY3ZPHFk97/R/beWoTXnHA1LD6exdkjKmsHcurBpQq3AMDgLVIpXnGkvxnNuPHrp2Q==","signatures":[{"sig":"MEUCIFNRVcS+vKvOZhRsSgpjf5Xng83zfzuKZJDgZHZvi9GUAiEAg6mfF6hl2Ag4YRryFJI04nIF5S3B1ctaG2J62nL2+wk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131273},"main":"dist/server.js","type":"commonjs","engines":{"node":">=18"},"gitHead":"1efd470f18f3e4725886223e751708220b186b79","private":false,"scripts":{"dev":"nodemon src/server.ts","seed":"ts-node src/utils/seed.ts","build":"tsc -p tsconfig.json","start":"node dist/server.js","migrate:up":"node-pg-migrate up -m src/migrations","migrate:down":"node-pg-migrate down -m src/migrations","prepublishOnly":"npm run build"},"_npmUser":{"name":"atiqisrak","email":"atiqisrak@gmail.com"},"repository":{"url":"git+https://github.com/atiqisrak/jerry.git","type":"git"},"_npmVersion":"10.9.0","description":"Express-based backend engine for the Jerry Pagebuilder.","directories":{},"_nodeVersion":"18.17.0","dependencies":{"pg":"^8.11.5","zod":"^3.23.8","cors":"^2.8.5","uuid":"^11.1.0","dotenv":"^16.4.5","helmet":"^7.1.0","morgan":"^1.10.0","multer":"^1.4.5-lts.1","express":"^4.19.2","winston":"^3.17.0","file-type":"16.5.4","@types/uuid":"^10.0.0","compression":"^1.8.1","dotenv-safe":"^9.0.0","@sentry/node":"^10.3.0","@types/winston":"^2.4.4","magic-bytes.js":"^1.12.1","express-slow-down":"^3.0.0","express-rate-limit":"^8.0.1","@sentry/profiling-node":"^10.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nodemon":"^3.0.1","ts-node":"^10.9.2","@types/pg":"^8.15.5","typescript":"^5.4.5","@types/cors":"^2.8.19","@types/node":"^20.11.30","@types/morgan":"^1.9.7","@types/multer":"^1.4.11","@types/express":"^4.17.21","node-pg-migrate":"^7.6.1","@types/compression":"^1.8.1","@types/dotenv-safe":"^8.1.6"},"peerDependencies":{"pg":">=8.11.0","express":">=4.18.0"},"_npmOperationalInternal":{"tmp":"tmp/jerry-pagebuilder-engine_1.0.1_1755018310195_0.6873203091324309","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@atiqisrak/jerry-pagebuilder-engine","version":"1.3.0","private":false,"type":"commonjs","main":"dist/server.js","engines":{"node":">=18"},"repository":{"type":"git","url":"git+https://github.com/atiqisrak/jerry.git"},"homepage":"https://github.com/atiqisrak/jerry#readme","bugs":{"url":"https://github.com/atiqisrak/jerry/issues"},"scripts":{"dev":"nodemon src/server.ts","build":"tsc -p tsconfig.json","start":"node dist/server.js","migrate:up":"node-pg-migrate up -m src/migrations","migrate:down":"node-pg-migrate down -m src/migrations","seed":"ts-node src/utils/seed.ts","prepublishOnly":"npm run build"},"license":"MIT","publishConfig":{"access":"public"},"keywords":["pagebuilder","headless","express","api","ecommerce","blocks"],"dependencies":{"@sentry/node":"^10.3.0","@sentry/profiling-node":"^10.3.0","@types/uuid":"^10.0.0","@types/winston":"^2.4.4","compression":"^1.8.1","cors":"^2.8.5","dotenv":"^16.4.5","dotenv-safe":"^9.0.0","express":"^4.19.2","express-rate-limit":"^8.0.1","express-slow-down":"^3.0.0","file-type":"16.5.4","helmet":"^7.1.0","magic-bytes.js":"^1.12.1","morgan":"^1.10.0","multer":"^1.4.5-lts.1","pg":"^8.11.5","uuid":"^11.1.0","winston":"^3.17.0","zod":"^3.23.8"},"peerDependencies":{"pg":">=8.11.0","express":">=4.18.0"},"devDependencies":{"@types/compression":"^1.8.1","@types/cors":"^2.8.19","@types/dotenv-safe":"^8.1.6","@types/express":"^4.17.21","@types/morgan":"^1.9.7","@types/multer":"^1.4.11","@types/node":"^20.11.30","@types/pg":"^8.15.5","node-pg-migrate":"^7.6.1","nodemon":"^3.0.1","ts-node":"^10.9.2","typescript":"^5.4.5"},"_id":"@atiqisrak/jerry-pagebuilder-engine@1.3.0","gitHead":"1efd470f18f3e4725886223e751708220b186b79","description":"Express-based backend engine for the Jerry Pagebuilder.","_nodeVersion":"18.17.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-YKzdwgYSPPI8Y3uu+Q34pdBWjIwBZb493mD+aiXygrdCWqsiO6PtLd+DMD+8w0boEHlKdieAk6MVrGpmGRBA2A==","shasum":"a6fcfe35eac78d391d55370328c1a46e94faefb0","tarball":"https://registry.npmjs.org/@atiqisrak/jerry-pagebuilder-engine/-/jerry-pagebuilder-engine-1.3.0.tgz","fileCount":33,"unpackedSize":131273,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA7kJ8zUGM2V4BiX4HZj5R3FtGPbDNfO7a3NGUqZb9X6AiEAge1CWKe/lHDS+C+1SYrkGo8Pw7rJvUZExmJkBBf2YQM="}]},"_npmUser":{"name":"atiqisrak","email":"atiqisrak@gmail.com"},"directories":{},"maintainers":[{"name":"atiqisrak","email":"atiqisrak@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jerry-pagebuilder-engine_1.3.0_1755019393611_0.19643967550359842"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-12T17:05:09.704Z","modified":"2025-08-12T17:23:13.991Z","1.0.1":"2025-08-12T17:05:10.384Z","1.3.0":"2025-08-12T17:23:13.808Z"},"bugs":{"url":"https://github.com/atiqisrak/jerry/issues"},"license":"MIT","homepage":"https://github.com/atiqisrak/jerry#readme","keywords":["pagebuilder","headless","express","api","ecommerce","blocks"],"repository":{"type":"git","url":"git+https://github.com/atiqisrak/jerry.git"},"description":"Express-based backend engine for the Jerry Pagebuilder.","maintainers":[{"name":"atiqisrak","email":"atiqisrak@gmail.com"}],"readme":"## @atiqisrak/jerry-pagebuilder-engine\n\nExpress-based backend engine for the Jerry Pagebuilder.\n\n### Install\n\n```bash\npnpm add @atiqisrak/jerry-pagebuilder-engine\n```\n\n### Usage\n\n```ts\nimport express from \"express\";\nimport { createPageBuilderRouter } from \"@atiqisrak/jerry-pagebuilder-engine\";\n\nconst app = express();\napp.use(\n  \"/pb\",\n  createPageBuilderRouter({\n    /* db, storage, auth */\n  })\n);\n\napp.listen(3000, () => console.log(\"PB Engine running on :3000\"));\n```\n\n### License\n\nMIT\n\n# PageBuilder Backend (Express + Postgres) — No Docker\n\nMVP backend for an Elementor‑style page builder. **No auth. No Docker.** Uses your provided `DATABASE_URL`.\n\n## Stack\n\n- Node 18+, TypeScript\n- Express\n- PostgreSQL (JSONB) via `pg`\n- Migrations: `node-pg-migrate`\n- Validation: `zod`\n- Uploads: `multer` (local)\n- **Blocks registry**: `/api/v1/blocks` returns all available page‑builder components & defaults\n\n## Setup\n\n1. Create `.env` from example and verify `DATABASE_URL`:\n   ```env\n   DATABASE_URL=postgres://olaf:Niloy%40Niil9@188.166.232.67:5432/Jerry\n   PORT=3017\n   CORS_ORIGIN=http://localhost:3000\n   UPLOAD_DIR=uploads\n   ```\n2. Install deps:\n   ```bash\n   pnpm install    # or npm/yarn\n   ```\n3. Run migrations:\n   ```bash\n   pnpm migrate:up\n   ```\n4. Start dev server:\n   ```bash\n   pnpm dev\n   ```\n5. Seed sample page:\n   ```bash\n   pnpm seed\n   ```\n\n## Key Endpoints\n\n- Health: `GET /health`\n- **Blocks:**\n  - `GET /api/v1/blocks` — list all block types with defaults\n  - `GET /api/v1/blocks/:type` — details for a block\n- **Pages (draft & management):**\n  - `GET /api/v1/pages` — list `?q=&status=&limit=&cursor=`\n  - `POST /api/v1/pages` — create `{ slug, title, seo?, tree? }`\n  - `GET /api/v1/pages/:slug` — get draft\n  - `PUT /api/v1/pages/:slug` — save draft `{ title?, seo?, tree }`\n  - `POST /api/v1/pages/:slug/publish` — publish draft\n  - `GET /api/v1/pages/:slug/snapshots` — list\n  - `POST /api/v1/pages/:slug/rollback/:snapshotId` — rollback\n  - `DELETE /api/v1/pages/:slug` — delete\n- **Public render:**\n  - `GET /api/v1/public/pages/:slug` — `{ tree, seo }` (404 if not published)\n- **Media:**\n  - `GET /api/v1/media`\n  - `POST /api/v1/media/upload` — multipart field `file`\n\n## Blocks included\n\n`root, section, row, column, grid, heading, text, richtext, button, image, video, spacer, divider, list, card, hero, gallery, form, map, tabs, accordion, slider`\n\nUse `/api/v1/blocks` to drive your editor's left panel and right‑panel defaults.\n\n## Curl quick test\n\n```bash\n# Create\ncurl -X POST http://localhost:3017/api/v1/pages -H \"Content-Type: application/json\" -d '{\"slug\":\"home\",\"title\":\"Home\"}'\n\n# Save draft\ncurl -X PUT http://localhost:3017/api/v1/pages/home -H \"Content-Type: application/json\" -d '{\"tree\":{\"id\":\"root\",\"type\":\"root\",\"props\":{},\"children\":[{\"id\":\"h\",\"type\":\"heading\",\"props\":{\"level\":1,\"text\":\"Hi\"}}]}}'\n\n# Publish\ncurl -X POST http://localhost:3017/api/v1/pages/home/publish\n\n# Public fetch\ncurl http://localhost:3017/api/v1/public/pages/home\n\n# Blocks list\ncurl http://localhost:3017/api/v1/blocks\n```\n\n## Notes\n\n- No authentication; enable CORS only for your frontend origin.\n- `updated_at` auto-updates via trigger.\n- JSONB indices included for future querying.\n","readmeFilename":"README.md"}