{"_id":"@dainamite/cpq","_rev":"3-d102493f850f7cf321d41cdcbadb4a9a","name":"@dainamite/cpq","dist-tags":{"latest":"0.4.0"},"versions":{"0.2.2":{"name":"@dainamite/cpq","version":"0.2.2","license":"MIT","_id":"@dainamite/cpq@0.2.2","maintainers":[{"name":"dainamite-acc","email":"hq@dainamite.com"},{"name":"kamyyylo","email":"kamyszek1@gmail.com"}],"homepage":"https://github.com/dainamite-technologies/dainamite-core#readme","bugs":{"url":"https://github.com/dainamite-technologies/dainamite-core/issues"},"dist":{"shasum":"84b3e9a5781bc614a2fdd0fd5dfef4644d752602","tarball":"https://registry.npmjs.org/@dainamite/cpq/-/cpq-0.2.2.tgz","fileCount":504,"integrity":"sha512-ZcnXBayBPasg27qt9sq4Fwlezlignkd3n+Hi+ObcaitNIKiaPMYyNk2cK6NYbdxESxqZ94I0kWauH/eQROEoZA==","signatures":[{"sig":"MEUCIQC2V1bEawgvbhwNqr0lxR+tHDR81al13QmoubFJGVuFrwIgcts9Hzu9Ad0GPsDiT87ksHaN8atEnK8iZtLAlUVlaEc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5019519},"main":"./dist/modules/cpq/index.js","type":"module","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./src/modules/cpq/index.ts","default":"./dist/modules/cpq/index.js"},"./*":{"types":["./src/*.ts","./src/*.tsx"],"default":"./dist/*.js"},"./*/*":{"types":["./src/*/*.ts","./src/*/*.tsx"],"default":"./dist/*/*.js"},"./*.ts":{"types":"./src/*.ts","default":"./dist/*.js"},"./*.tsx":{"types":"./src/*.tsx","default":"./dist/*.js"},"./*/*/*":{"types":["./src/*/*/*.ts","./src/*/*/*.tsx"],"default":"./dist/*/*/*.js"},"./*.json":"./src/*.json","./*/*/*/*":{"types":["./src/*/*/*/*.ts","./src/*/*/*/*.tsx"],"default":"./dist/*/*/*/*.js"},"./*/*.json":"./src/*/*.json","./*/*/*/*/*":{"types":["./src/*/*/*/*/*.ts","./src/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*.js"},"./*/*/*.json":"./src/*/*/*.json","./*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*.js"},"./modules/cpq":{"types":"./src/modules/cpq/index.ts","default":"./dist/modules/cpq/index.js"},"./*/*/*/*.json":"./src/*/*/*/*.json","./*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*.js"},"./*/*/*/*/*.json":"./src/*/*/*/*/*.json","./*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*.json":"./src/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*/*/*.json"},"gitHead":"9ec7ea2e2442a26e259765f2a5c923b5cef55389","scripts":{"build":"node build.mjs","watch":"node watch.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"dainamite-acc","email":"hq@dainamite.com"},"repository":{"url":"git+https://github.com/dainamite-technologies/dainamite-core.git","type":"git","directory":"packages/cpq"},"_npmVersion":"11.12.1","description":"Dainamite CPQ — Configure, Price, Quote engine for Open Mercato (configurable products, multi-charge pricing tables, guided quoting, customer inventory, orders).","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chokidar":"^4.0.3"},"peerDependencies":{"zod":"^4.0.0","next":"^16.0.0","xlsx":"^0.18.0","react":"^19.0.0","awilix":"^12.0.0","bcryptjs":"^3.0.0","react-dom":"^19.0.0","lucide-react":"^0.400.0","@mikro-orm/core":"^7.0.0","@open-mercato/ui":"^0.6.0","@open-mercato/core":"^0.6.0","@open-mercato/events":"^0.6.0","@open-mercato/shared":"^0.6.0","@mikro-orm/decorators":"^7.0.0","@mikro-orm/postgresql":"^7.0.0","@tanstack/react-table":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cpq_0.2.2_1778880453063_0.9456545197191044","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@dainamite/cpq","version":"0.3.0","license":"MIT","_id":"@dainamite/cpq@0.3.0","maintainers":[{"name":"dainamite-acc","email":"hq@dainamite.com"},{"name":"kamyyylo","email":"kamyszek1@gmail.com"}],"homepage":"https://github.com/dainamite-technologies/dainamite-core#readme","bugs":{"url":"https://github.com/dainamite-technologies/dainamite-core/issues"},"dist":{"shasum":"90598baac07f9bb75b65ad2d7f4665cc1ef4b9f7","tarball":"https://registry.npmjs.org/@dainamite/cpq/-/cpq-0.3.0.tgz","fileCount":516,"integrity":"sha512-ofAIYLQWybfMivkIsKJmfl8hOzX/0MNPz+DPagW9juQ7BQWI/1bOmXF4JZQVMlkdqw5K96M1puLiWil1wvyBUw==","signatures":[{"sig":"MEUCIQClXIb3RkGwh0hDFa+B1crL2HrABILX8C88fQdfrjXTzgIgX6JwRn05nItJNkKwF3jzQItq2yClGWoS950AKN+5TRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5139330},"main":"./dist/modules/cpq/index.js","type":"module","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./src/modules/cpq/index.ts","default":"./dist/modules/cpq/index.js"},"./*":{"types":["./src/*.ts","./src/*.tsx"],"default":"./dist/*.js"},"./*/*":{"types":["./src/*/*.ts","./src/*/*.tsx"],"default":"./dist/*/*.js"},"./*.ts":{"types":"./src/*.ts","default":"./dist/*.js"},"./*.tsx":{"types":"./src/*.tsx","default":"./dist/*.js"},"./*/*/*":{"types":["./src/*/*/*.ts","./src/*/*/*.tsx"],"default":"./dist/*/*/*.js"},"./*.json":"./src/*.json","./*/*/*/*":{"types":["./src/*/*/*/*.ts","./src/*/*/*/*.tsx"],"default":"./dist/*/*/*/*.js"},"./*/*.json":"./src/*/*.json","./*/*/*/*/*":{"types":["./src/*/*/*/*/*.ts","./src/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*.js"},"./*/*/*.json":"./src/*/*/*.json","./*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*.js"},"./modules/cpq":{"types":"./src/modules/cpq/index.ts","default":"./dist/modules/cpq/index.js"},"./*/*/*/*.json":"./src/*/*/*/*.json","./*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*.js"},"./*/*/*/*/*.json":"./src/*/*/*/*/*.json","./*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*.json":"./src/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*/*/*.json"},"gitHead":"ad015655f0396201e5fe861eb2869c3c87f9a5b4","scripts":{"build":"node build.mjs","watch":"node watch.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"dainamite-acc","email":"hq@dainamite.com"},"repository":{"url":"git+https://github.com/dainamite-technologies/dainamite-core.git","type":"git","directory":"packages/cpq"},"_npmVersion":"11.13.0","description":"Dainamite CPQ — Configure, Price, Quote engine for Open Mercato (configurable products, multi-charge pricing tables, guided quoting, customer inventory, orders).","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chokidar":"^4.0.3"},"peerDependencies":{"zod":"^4.0.0","next":"^16.0.0","react":"^19.0.0","awilix":"^12.0.0","bcryptjs":"^3.0.0","react-dom":"^19.0.0","lucide-react":"^0.400.0","@mikro-orm/core":"^7.0.0","@open-mercato/ui":"^0.6.0","@open-mercato/core":"^0.6.0","@open-mercato/events":"^0.6.0","@open-mercato/shared":"^0.6.0","@mikro-orm/decorators":"^7.0.0","@mikro-orm/postgresql":"^7.0.0","@tanstack/react-table":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cpq_0.3.0_1781005894985_0.9747483063788729","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@dainamite/cpq","version":"0.4.0","description":"Dainamite CPQ — Configure, Price, Quote engine for Open Mercato (configurable products, multi-charge pricing tables, guided quoting, customer inventory, orders).","type":"module","main":"./dist/modules/cpq/index.js","scripts":{"build":"node build.mjs","watch":"node watch.mjs","typecheck":"tsc --noEmit"},"dependencies":{"xlsx":"^0.18.0"},"devDependencies":{"chokidar":"^4.0.3"},"exports":{".":{"types":"./src/modules/cpq/index.ts","default":"./dist/modules/cpq/index.js"},"./modules/cpq":{"types":"./src/modules/cpq/index.ts","default":"./dist/modules/cpq/index.js"},"./*.ts":{"types":"./src/*.ts","default":"./dist/*.js"},"./*.tsx":{"types":"./src/*.tsx","default":"./dist/*.js"},"./*.json":"./src/*.json","./*":{"types":["./src/*.ts","./src/*.tsx"],"default":"./dist/*.js"},"./*/*.json":"./src/*/*.json","./*/*":{"types":["./src/*/*.ts","./src/*/*.tsx"],"default":"./dist/*/*.js"},"./*/*/*.json":"./src/*/*/*.json","./*/*/*":{"types":["./src/*/*/*.ts","./src/*/*/*.tsx"],"default":"./dist/*/*/*.js"},"./*/*/*/*.json":"./src/*/*/*/*.json","./*/*/*/*":{"types":["./src/*/*/*/*.ts","./src/*/*/*/*.tsx"],"default":"./dist/*/*/*/*.js"},"./*/*/*/*/*.json":"./src/*/*/*/*/*.json","./*/*/*/*/*":{"types":["./src/*/*/*/*/*.ts","./src/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*.js"},"./*/*/*/*/*/*.json":"./src/*/*/*/*/*/*.json","./*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*/*.js"},"./*/*/*/*/*/*/*/*/*/*.json":"./src/*/*/*/*/*/*/*/*/*/*.json","./*/*/*/*/*/*/*/*/*/*":{"types":["./src/*/*/*/*/*/*/*/*/*/*.ts","./src/*/*/*/*/*/*/*/*/*/*.tsx"],"default":"./dist/*/*/*/*/*/*/*/*/*/*.js"}},"peerDependencies":{"@mikro-orm/core":"^7.1.5","@mikro-orm/decorators":"^7.1.5","@mikro-orm/postgresql":"^7.1.5","@open-mercato/core":"^0.6.7","@open-mercato/events":"^0.6.7","@open-mercato/shared":"^0.6.7","@open-mercato/ui":"^0.6.7","@tanstack/react-table":"^8.0.0 || ^9.0.0","awilix":"^12.0.0","bcryptjs":"^3.0.0","lucide-react":"^0.400.0","next":"^16.0.0","react":"^19.0.0","react-dom":"^19.0.0","zod":"^4.0.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/dainamite-technologies/dainamite-core.git","directory":"packages/cpq"},"license":"MIT","engines":{"node":">=24.0.0"},"gitHead":"bf641f89e1493ae88a88234140f0cf43daaa0849","_id":"@dainamite/cpq@0.4.0","bugs":{"url":"https://github.com/dainamite-technologies/dainamite-core/issues"},"homepage":"https://github.com/dainamite-technologies/dainamite-core#readme","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-ZLQRTwele2z6yJ0ZuhqFd5c3QJLgFfBZeL/A4hfRMpYODctCT8PBLQHPId+r72fUaKBsCrHsOXyqmRUMCEuJ1A==","shasum":"87e96d241a9699e7f1bcb8a75f27f03d65521caa","tarball":"https://registry.npmjs.org/@dainamite/cpq/-/cpq-0.4.0.tgz","fileCount":516,"unpackedSize":5140321,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDaKHSDgF7FHibJNg9/quDbsy/gZ1ICfxuzTGH+faK7cgIgPI5RyPbgxSmTTZVSWpKu85dxbGhyzyjb6o0kxtpG+Uc="}]},"_npmUser":{"name":"dainamite-acc","email":"hq@dainamite.com"},"directories":{},"maintainers":[{"name":"dainamite-acc","email":"hq@dainamite.com"},{"name":"kamyyylo","email":"kamyszek1@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cpq_0.4.0_1787655231257_0.758560719510005"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-15T21:27:32.982Z","modified":"2026-08-25T10:53:51.641Z","0.2.2":"2026-05-15T21:27:33.260Z","0.3.0":"2026-06-09T11:51:35.189Z","0.4.0":"2026-08-25T10:53:51.413Z"},"bugs":{"url":"https://github.com/dainamite-technologies/dainamite-core/issues"},"license":"MIT","homepage":"https://github.com/dainamite-technologies/dainamite-core#readme","repository":{"type":"git","url":"git+https://github.com/dainamite-technologies/dainamite-core.git","directory":"packages/cpq"},"description":"Dainamite CPQ — Configure, Price, Quote engine for Open Mercato (configurable products, multi-charge pricing tables, guided quoting, customer inventory, orders).","maintainers":[{"name":"dainamite-acc","email":"hq@dainamite.com"},{"name":"kamyyylo","email":"kamyszek1@gmail.com"}],"readme":"# @dainamite/cpq\n\nDainamite **CPQ** (Configure, Price, Quote) module for Open Mercato —\nconfigurable product attributes, multi-charge pricing tables, guided\nquoting wizards, customer inventory & subscription tracking, ARC\n(Amend / Renew / Cancel) flows, quote → order → activation pipeline.\n\n## Install\n\nPublished to the **public npm registry** — no scope auth or `.npmrc`\nchanges needed:\n\n```sh\nyarn add @dainamite/cpq\n```\n\nRegister the module in your host app's `src/modules.ts` (after its\nrequired core modules — see below):\n\n```ts\n{ id: 'cpq', from: '@dainamite/cpq' }\n```\n\nRegenerate the module graph, then run framework migrations to install\nCPQ's schema:\n\n```sh\nyarn generate\nyarn mercato db migrate\n```\n\nCPQ admin pages appear under `/backend/cpq/*`.\n\n## What's inside\n\n```\npackages/cpq/src/modules/cpq/\n├── index.ts        module metadata + requires\n├── acl.ts          ACL feature definitions\n├── ce.ts           custom entity / field set declarations\n├── di.ts           Awilix DI registrations\n├── setup.ts        tenant init, role features, seed data\n├── data/           entities, validators, enrichers\n├── api/            REST routes (resource-style: api/<resource>/route.ts)\n├── backend/        admin UI pages (auto-discovered)\n├── services/       pricing, quoting, validation, product, wizard, inventory, order, bundle\n├── widgets/        injection: customer-inventory, order-cpq-tab, quote-configurator\n├── workflows/      quote → order step components\n├── lib/seeds/      use-case registry API\n└── migrations/     own MikroORM migrations (never hand-write — `yarn mercato db generate`)\n```\n\nThe package ships `src/` (for TypeScript consumers' types) and\n`dist/` (esbuild-built JS for runtime). Following the\n[`@open-mercato/core`](https://www.npmjs.com/package/@open-mercato/core)\nbuild convention, no `.d.ts` is emitted — `exports.types` resolves\ndirectly to source.\n\n## Distribution model (per SPEC-001)\n\n- **L1** — Open Mercato core consumed from `@open-mercato/*` (npm).\n- **L2** — Dainamite product modules (this package + sibling\n  `@dainamite/*`), published to **public npm** under the `@dainamite`\n  scope.\n- **L3** — `dainamite-core` is the first L3 customer app; other customer\n  repos consume `@dainamite/cpq` via `yarn add` and register it the same\n  way.\n\n## Hard rules (carried over from SPEC-001)\n\n- **No ORM relations across packages.** Cross-module references are FK\n  strings only (`productId: string`), never `@ManyToOne`.\n- **`peerDependencies`, never `dependencies`** for sibling\n  `@dainamite/*` and `@open-mercato/*` — guarantees a single shared\n  instance in `node_modules`.\n- **Each major bump ships its own migrations** under\n  `src/modules/cpq/migrations/`; document upgrade path in\n  `CHANGELOG.md`.\n- **No customer-specific logic here.** Tenant-specific overrides live\n  in the consuming app under `src/modules/@app/<feature>/`.\n\n## Required Open Mercato modules\n\nCPQ declares the following in `metadata.requires` and will fail to\nbootstrap if any are missing from the host app's `src/modules.ts`:\n\n`auth`, `directory`, `catalog`, `sales`, `customers`, `dictionaries`.\n\n## Package isolation guard\n\nStatic lint test at\n[`src/modules/cpq/__tests__/package-isolation.test.ts`](src/modules/cpq/__tests__/package-isolation.test.ts)\nasserts the package never imports from sibling app modules, never\ndeep-imports `@open-mercato/core/modules/<x>` for an undeclared\ndependency, and contains zero cross-entity ORM relations. Runs on\nevery CI build — protects future contributors from accidentally\nbreaking the package boundary.\n\n## Versioning\n\nVersioned via [changesets](https://github.com/changesets/changesets).\nAdd a changeset alongside any change in `packages/cpq/`:\n\n```sh\nyarn changeset\n```\n\nBumps and the public-npm publish are handled by the release workflow on\npush to `main`.\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}