jelte-ten-holt / in-other-shops
Modular e-commerce domain packages for Laravel
Requires
- php: ^8.3
- ext-gd: *
- ext-intl: *
- filament/filament: ^5.0
- laravel/framework: ^12.0 || ^13.0
- opgginc/laravel-mcp-server: ^2.0
Requires (Dev)
- laravel/passport: ^13.0
- mockery/mockery: ^1.6
- orchestra/testbench: ^10.0 || ^11.0
- phpunit/phpunit: ^11.0 || ^12.0
- stripe/stripe-php: ^20.0
Suggests
- ext-exif: Enables EXIF orientation correction on uploaded JPEG/TIFF images. Without it every upload is treated as already upright, and a phone photo taken sideways stays sideways in every generated variant.
- laravel/passport: Required when agent.auth.oauth.enabled is true — powers the Passport authorization server that backs the MCP connector's OAuth flow (^13.0).
- stripe/stripe-php: Install to enable the Stripe payment gateway driver (^20.0 — the major both consumers run; the package suite tests against it).
Provides
None
Conflicts
None
Replaces
None
- v0.71.1
- v0.71.0
- v0.70.0
- v0.69.2
- v0.69.1
- v0.69.0
- v0.68.0
- v0.67.3
- v0.67.2
- v0.67.1
- v0.67.0
- v0.66.0
- dev-main / 0.65.x-dev
- v0.65.0
- v0.64.0
- v0.63.0
- v0.62.0
- v0.61.0
- v0.60.0
- v0.59.0
- v0.58.0
- v0.57.0
- v0.56.0
- v0.55.0
- v0.54.0
- v0.53.0
- v0.52.1
- v0.52.0
- v0.51.0
- v0.50.0
- v0.49.0
- v0.48.0
- v0.47.0
- v0.46.2
- v0.46.1
- v0.46.0
- v0.45.2
- v0.45.1
- v0.45.0
- v0.44.0
- v0.43.0
- v0.42.0
- v0.41.0
- v0.40.0
- v0.39.0
- v0.38.0
- v0.37.1
- v0.37.0
- v0.36.0
- v0.35.0
- v0.34.0
- v0.33.0
- v0.32.0
- v0.31.0
- v0.30.0
- v0.29.0
- v0.28.0
- v0.27.0
- v0.26.0
- v0.25.0
- v0.24.0
- v0.23.0
- v0.22.3
- v0.22.2
- v0.22.1
- v0.22.0
- v0.21.0
- v0.20.0
- v0.19.0
- v0.18.0
- v0.17.0
- v0.16.1
- v0.16.0
- v0.15.4
- v0.15.3
- v0.15.2
- v0.15.1
- v0.15.0
- v0.14.0
- v0.13.1
- v0.13.0
- v0.12.0
- v0.11.0
- v0.10.1
- v0.10.0
- v0.9.0
- v0.8.0
- v0.7.1
- v0.7.0
- v0.6.1
- v0.6.0
- v0.5.0
- v0.4.0
- v0.3.0
- v0.2.1
- v0.2.0
- 0.1.0
- dev-release-1/pr2-deletions
- dev-release-1/pr1-conventions
- dev-release-1/pr3-query-shape
- dev-media/phase-4-prune
- dev-docs/media-pipeline-shape-parity
- dev-media/phase-2-variants
- dev-fix/stub-locale-group-fk
- dev-docs/archive-repoint
- dev-fix/mysql-ci-harness
- dev-fix/category-count-decrement-mysql
- dev-feat/manual-form-state-refill
- dev-feat/filament-page-fixture
- dev-fix/audit-bianka-2026-07-04
- dev-fix/money-path-v0.52.1
- dev-fix/money-path-v0.52
- dev-storefront-http-archive
This package is auto-updated.
Last update: 2026-09-10 07:12:25 UTC
README
Modular e-commerce domain packages for Laravel 12+.
Installation
composer require jelte-ten-holt/in-other-shops
Service providers are auto-discovered via Laravel's package discovery.
Domains
Each domain under src/ has its own service provider, migrations, config, contracts, and concerns. This is a modular monolith — one package with clean internal domain boundaries — not a staging ground for per-domain packages. See CLAUDE.md for the four-tier structure (generic leaves / middle band / shop core / integration) and the extraction policy.
Grouped by tier (see CLAUDE.md for what the tiers mean).
| Tier | Domain | Purpose | Dependencies |
|---|---|---|---|
| Leaf | Currency | Currency enum, formatting, config | — |
| Leaf | Translation | Polymorphic translations table, locale management | — |
| Leaf | Location | Address management (polymorphic) | — |
| Leaf | Media | File attachments via morphToMany pivot | — |
| Leaf | Logging | Domain event logging with pluggable handlers | — |
| Leaf | FlowChain | Orchestrated multi-step business processes | — |
| Leaf | Support | Shared kernel: base service provider, Filament bases, state transitions | Currency |
| Middle | Pricing | Prices, price lists, vouchers | Currency |
| Middle | Taxonomy | Categories (hierarchical) and tags (flat, typed) | Translation, Media |
| Middle | Payment | Gateway-agnostic payments, refunds, webhooks | Currency |
| Middle | Tax | VAT rates and calculation | Location |
| Middle | Inventory | Stock tracking, reservations, audit ledger | (Translation — drift) |
| Shop core | Commerce | Cart, Order, Customer lifecycle | Currency, Location, Payment, Pricing, Shipping, Tax, FlowChain, Inventory |
| Shop core | Shipping | Shipment model, shipping cost calculation | Currency, Location, Commerce (cycle — accepted) |
| Shop core | Purchasing | Inbound inventory / purchase orders | Inventory, Tax |
| Integration | Storefront | Read-only API layer for browsable catalog | Currency, Inventory, Media, Pricing, Taxonomy, Translation |
| Integration | Variants | Product options/values and purchasable variants | Commerce, Inventory, Media, Pricing, Translation |
| Integration | Agent | MCP Streamable HTTP endpoint (bearer or OAuth 2.1 + DCR) | Commerce, Inventory, Storefront, Taxonomy |
| Planned | Navigation | Configurable menus | — |
Usage
Project models opt into domain capabilities by implementing contracts and using traits:
use InOtherShops\Pricing\Contracts\HasPrices; use InOtherShops\Pricing\Concerns\InteractsWithPrices; use InOtherShops\Media\Contracts\HasMedia; use InOtherShops\Media\Concerns\InteractsWithMedia; class Product extends Model implements HasPrices, HasMedia { use InteractsWithPrices; use InteractsWithMedia; }
Each domain ships config with a models key for overriding model classes via the registry pattern. Publish config to customize:
// config/pricing.php return [ 'models' => [ 'price' => App\Models\CustomPrice::class, ], ];
Extraction Policy
This package is a modular monolith, not a set of packages-in-waiting. Extraction is on-demand and leaf-only: split a generic leaf (Currency, Logging, Media, Translation, Location, FlowChain, Support) into its own lower-level Composer package only when a concrete non-shop consumer needs it without the rest of the shop. The middle band, shop core, and integration tier are not extraction targets — the shop core (Commerce/Shipping/Purchasing) moves as one unit if it ever moves at all.
Don't split speculatively. The migrations-run-in-every-consumer cost that used to motivate splitting is handled by the per-domain {domain}.migrations.enabled config gate, not by extraction.
If a leaf extraction ever happens: move the directory to its own repo, give it a composer.json with the InOtherShops\{Domain}\ PSR-4 namespace and its (leaf-only) dependencies as require entries, and depend on the new package here. Note that Logging is consumed by nearly every domain, so it would need to publish first.
License
MIT