@mantajs/cli 0.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/manta.mjs +20 -0
- package/bin/manta.ts +13 -0
- package/dist/admin/generate-admin-config.d.ts +8 -0
- package/dist/admin/generate-admin-config.d.ts.map +1 -0
- package/dist/admin/generate-admin-config.js +127 -0
- package/dist/admin/generate-admin-config.js.map +1 -0
- package/dist/ai/chat-handler.d.ts +10 -0
- package/dist/ai/chat-handler.d.ts.map +1 -0
- package/dist/ai/chat-handler.js +1353 -0
- package/dist/ai/chat-handler.js.map +1 -0
- package/dist/bootstrap/boot.d.ts +25 -0
- package/dist/bootstrap/boot.d.ts.map +1 -0
- package/dist/bootstrap/boot.js +344 -0
- package/dist/bootstrap/boot.js.map +1 -0
- package/dist/bootstrap/bootstrap-app.d.ts +71 -0
- package/dist/bootstrap/bootstrap-app.d.ts.map +1 -0
- package/dist/bootstrap/bootstrap-app.js +308 -0
- package/dist/bootstrap/bootstrap-app.js.map +1 -0
- package/dist/bootstrap/bootstrap-context.d.ts +76 -0
- package/dist/bootstrap/bootstrap-context.d.ts.map +1 -0
- package/dist/bootstrap/bootstrap-context.js +4 -0
- package/dist/bootstrap/bootstrap-context.js.map +1 -0
- package/dist/bootstrap/bootstrap-helpers.d.ts +71 -0
- package/dist/bootstrap/bootstrap-helpers.d.ts.map +1 -0
- package/dist/bootstrap/bootstrap-helpers.js +373 -0
- package/dist/bootstrap/bootstrap-helpers.js.map +1 -0
- package/dist/bootstrap/generate-types.d.ts +7 -0
- package/dist/bootstrap/generate-types.d.ts.map +1 -0
- package/dist/bootstrap/generate-types.js +832 -0
- package/dist/bootstrap/generate-types.js.map +1 -0
- package/dist/bootstrap/phases/assemble/index.d.ts +5 -0
- package/dist/bootstrap/phases/assemble/index.d.ts.map +1 -0
- package/dist/bootstrap/phases/assemble/index.js +5 -0
- package/dist/bootstrap/phases/assemble/index.js.map +1 -0
- package/dist/bootstrap/phases/assemble/load-links.d.ts +3 -0
- package/dist/bootstrap/phases/assemble/load-links.d.ts.map +1 -0
- package/dist/bootstrap/phases/assemble/load-links.js +160 -0
- package/dist/bootstrap/phases/assemble/load-links.js.map +1 -0
- package/dist/bootstrap/phases/assemble/load-modules.d.ts +3 -0
- package/dist/bootstrap/phases/assemble/load-modules.d.ts.map +1 -0
- package/dist/bootstrap/phases/assemble/load-modules.js +163 -0
- package/dist/bootstrap/phases/assemble/load-modules.js.map +1 -0
- package/dist/bootstrap/phases/assemble/load-resources.d.ts +3 -0
- package/dist/bootstrap/phases/assemble/load-resources.d.ts.map +1 -0
- package/dist/bootstrap/phases/assemble/load-resources.js +270 -0
- package/dist/bootstrap/phases/assemble/load-resources.js.map +1 -0
- package/dist/bootstrap/phases/assemble/wire-commands.d.ts +3 -0
- package/dist/bootstrap/phases/assemble/wire-commands.d.ts.map +1 -0
- package/dist/bootstrap/phases/assemble/wire-commands.js +408 -0
- package/dist/bootstrap/phases/assemble/wire-commands.js.map +1 -0
- package/dist/bootstrap/phases/assemble-modules.d.ts +3 -0
- package/dist/bootstrap/phases/assemble-modules.d.ts.map +1 -0
- package/dist/bootstrap/phases/assemble-modules.js +14 -0
- package/dist/bootstrap/phases/assemble-modules.js.map +1 -0
- package/dist/bootstrap/phases/build-app.d.ts +3 -0
- package/dist/bootstrap/phases/build-app.d.ts.map +1 -0
- package/dist/bootstrap/phases/build-app.js +15 -0
- package/dist/bootstrap/phases/build-app.js.map +1 -0
- package/dist/bootstrap/phases/discover-resources.d.ts +3 -0
- package/dist/bootstrap/phases/discover-resources.d.ts.map +1 -0
- package/dist/bootstrap/phases/discover-resources.js +60 -0
- package/dist/bootstrap/phases/discover-resources.js.map +1 -0
- package/dist/bootstrap/phases/index.d.ts +7 -0
- package/dist/bootstrap/phases/index.d.ts.map +1 -0
- package/dist/bootstrap/phases/index.js +7 -0
- package/dist/bootstrap/phases/index.js.map +1 -0
- package/dist/bootstrap/phases/init-infra.d.ts +3 -0
- package/dist/bootstrap/phases/init-infra.d.ts.map +1 -0
- package/dist/bootstrap/phases/init-infra.js +193 -0
- package/dist/bootstrap/phases/init-infra.js.map +1 -0
- package/dist/bootstrap/phases/seed-dev-users.d.ts +3 -0
- package/dist/bootstrap/phases/seed-dev-users.d.ts.map +1 -0
- package/dist/bootstrap/phases/seed-dev-users.js +93 -0
- package/dist/bootstrap/phases/seed-dev-users.js.map +1 -0
- package/dist/bootstrap/phases/wire/auth-helpers.d.ts +12 -0
- package/dist/bootstrap/phases/wire/auth-helpers.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/auth-helpers.js +25 -0
- package/dist/bootstrap/phases/wire/auth-helpers.js.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/context-registry.d.ts +4 -0
- package/dist/bootstrap/phases/wire/contexts/context-registry.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/context-registry.js +96 -0
- package/dist/bootstrap/phases/wire/contexts/context-registry.js.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/cqrs-routes.d.ts +3 -0
- package/dist/bootstrap/phases/wire/contexts/cqrs-routes.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/cqrs-routes.js +138 -0
- package/dist/bootstrap/phases/wire/contexts/cqrs-routes.js.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/index.d.ts +6 -0
- package/dist/bootstrap/phases/wire/contexts/index.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/index.js +6 -0
- package/dist/bootstrap/phases/wire/contexts/index.js.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/query-endpoints.d.ts +3 -0
- package/dist/bootstrap/phases/wire/contexts/query-endpoints.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/query-endpoints.js +116 -0
- package/dist/bootstrap/phases/wire/contexts/query-endpoints.js.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/spa-warnings.d.ts +3 -0
- package/dist/bootstrap/phases/wire/contexts/spa-warnings.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/spa-warnings.js +17 -0
- package/dist/bootstrap/phases/wire/contexts/spa-warnings.js.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/user-routes.d.ts +3 -0
- package/dist/bootstrap/phases/wire/contexts/user-routes.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/contexts/user-routes.js +83 -0
- package/dist/bootstrap/phases/wire/contexts/user-routes.js.map +1 -0
- package/dist/bootstrap/phases/wire/index.d.ts +5 -0
- package/dist/bootstrap/phases/wire/index.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/index.js +5 -0
- package/dist/bootstrap/phases/wire/index.js.map +1 -0
- package/dist/bootstrap/phases/wire/wire-adapter.d.ts +12 -0
- package/dist/bootstrap/phases/wire/wire-adapter.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/wire-adapter.js +156 -0
- package/dist/bootstrap/phases/wire/wire-adapter.js.map +1 -0
- package/dist/bootstrap/phases/wire/wire-auth.d.ts +3 -0
- package/dist/bootstrap/phases/wire/wire-auth.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/wire-auth.js +46 -0
- package/dist/bootstrap/phases/wire/wire-auth.js.map +1 -0
- package/dist/bootstrap/phases/wire/wire-contexts.d.ts +3 -0
- package/dist/bootstrap/phases/wire/wire-contexts.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/wire-contexts.js +15 -0
- package/dist/bootstrap/phases/wire/wire-contexts.js.map +1 -0
- package/dist/bootstrap/phases/wire/wire-cron-routes.d.ts +3 -0
- package/dist/bootstrap/phases/wire/wire-cron-routes.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/wire-cron-routes.js +102 -0
- package/dist/bootstrap/phases/wire/wire-cron-routes.js.map +1 -0
- package/dist/bootstrap/phases/wire/wire-extras.d.ts +3 -0
- package/dist/bootstrap/phases/wire/wire-extras.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/wire-extras.js +305 -0
- package/dist/bootstrap/phases/wire/wire-extras.js.map +1 -0
- package/dist/bootstrap/phases/wire/wire-workflow-routes.d.ts +3 -0
- package/dist/bootstrap/phases/wire/wire-workflow-routes.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire/wire-workflow-routes.js +212 -0
- package/dist/bootstrap/phases/wire/wire-workflow-routes.js.map +1 -0
- package/dist/bootstrap/phases/wire-http.d.ts +3 -0
- package/dist/bootstrap/phases/wire-http.d.ts.map +1 -0
- package/dist/bootstrap/phases/wire-http.js +10 -0
- package/dist/bootstrap/phases/wire-http.js.map +1 -0
- package/dist/bootstrap/validate-generated-ts.d.ts +6 -0
- package/dist/bootstrap/validate-generated-ts.d.ts.map +1 -0
- package/dist/bootstrap/validate-generated-ts.js +26 -0
- package/dist/bootstrap/validate-generated-ts.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +10 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +138 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +421 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.d.ts +21 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +399 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/db/create.d.ts +17 -0
- package/dist/commands/db/create.d.ts.map +1 -0
- package/dist/commands/db/create.js +94 -0
- package/dist/commands/db/create.js.map +1 -0
- package/dist/commands/db/diff.d.ts +39 -0
- package/dist/commands/db/diff.d.ts.map +1 -0
- package/dist/commands/db/diff.js +81 -0
- package/dist/commands/db/diff.js.map +1 -0
- package/dist/commands/db/generate.d.ts +58 -0
- package/dist/commands/db/generate.d.ts.map +1 -0
- package/dist/commands/db/generate.js +138 -0
- package/dist/commands/db/generate.js.map +1 -0
- package/dist/commands/db/migrate.d.ts +29 -0
- package/dist/commands/db/migrate.d.ts.map +1 -0
- package/dist/commands/db/migrate.js +118 -0
- package/dist/commands/db/migrate.js.map +1 -0
- package/dist/commands/db/pg-deps.d.ts +30 -0
- package/dist/commands/db/pg-deps.d.ts.map +1 -0
- package/dist/commands/db/pg-deps.js +178 -0
- package/dist/commands/db/pg-deps.js.map +1 -0
- package/dist/commands/db/rollback.d.ts +21 -0
- package/dist/commands/db/rollback.d.ts.map +1 -0
- package/dist/commands/db/rollback.js +85 -0
- package/dist/commands/db/rollback.js.map +1 -0
- package/dist/commands/db/types.d.ts +113 -0
- package/dist/commands/db/types.d.ts.map +1 -0
- package/dist/commands/db/types.js +4 -0
- package/dist/commands/db/types.js.map +1 -0
- package/dist/commands/dev.d.ts +12 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +79 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/exec.d.ts +21 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +148 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/generate.d.ts +11 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +19 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +476 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/start.d.ts +15 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +121 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/user.d.ts +19 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +125 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/config/load-config.d.ts +23 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +105 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/load-env.d.ts +11 -0
- package/dist/config/load-env.d.ts.map +1 -0
- package/dist/config/load-env.js +61 -0
- package/dist/config/load-env.js.map +1 -0
- package/dist/config/resolve-adapters.d.ts +23 -0
- package/dist/config/resolve-adapters.d.ts.map +1 -0
- package/dist/config/resolve-adapters.js +96 -0
- package/dist/config/resolve-adapters.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/jiti.d.ts +2 -0
- package/dist/jiti.d.ts.map +1 -0
- package/dist/jiti.js +2 -0
- package/dist/jiti.js.map +1 -0
- package/dist/openapi/generate-spec.d.ts +56 -0
- package/dist/openapi/generate-spec.d.ts.map +1 -0
- package/dist/openapi/generate-spec.js +491 -0
- package/dist/openapi/generate-spec.js.map +1 -0
- package/dist/openapi/index.d.ts +4 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +3 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/swagger-html.d.ts +2 -0
- package/dist/openapi/swagger-html.d.ts.map +1 -0
- package/dist/openapi/swagger-html.js +29 -0
- package/dist/openapi/swagger-html.js.map +1 -0
- package/dist/plugins/merge-resources.d.ts +18 -0
- package/dist/plugins/merge-resources.d.ts.map +1 -0
- package/dist/plugins/merge-resources.js +76 -0
- package/dist/plugins/merge-resources.js.map +1 -0
- package/dist/plugins/resolve-plugins.d.ts +14 -0
- package/dist/plugins/resolve-plugins.d.ts.map +1 -0
- package/dist/plugins/resolve-plugins.js +73 -0
- package/dist/plugins/resolve-plugins.js.map +1 -0
- package/dist/resource-loader.d.ts +151 -0
- package/dist/resource-loader.d.ts.map +1 -0
- package/dist/resource-loader.js +456 -0
- package/dist/resource-loader.js.map +1 -0
- package/dist/route-discovery.d.ts +33 -0
- package/dist/route-discovery.d.ts.map +1 -0
- package/dist/route-discovery.js +69 -0
- package/dist/route-discovery.js.map +1 -0
- package/dist/server-bootstrap.d.ts +38 -0
- package/dist/server-bootstrap.d.ts.map +1 -0
- package/dist/server-bootstrap.js +21 -0
- package/dist/server-bootstrap.js.map +1 -0
- package/dist/spa/generate-spa.d.ts +15 -0
- package/dist/spa/generate-spa.d.ts.map +1 -0
- package/dist/spa/generate-spa.js +357 -0
- package/dist/spa/generate-spa.js.map +1 -0
- package/dist/templates/agent/nextjs.md +129 -0
- package/dist/templates/agent/nuxt.md +98 -0
- package/dist/templates/agent/standalone.md +498 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/colors.d.ts +7 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +8 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompts.d.ts +6 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +28 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/spinner.d.ts +7 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +20 -0
- package/dist/utils/spinner.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
# Manta — AI Agent Instructions
|
|
2
|
+
|
|
3
|
+
You are working in a **standalone Manta project**. Manta is a filesystem-first framework with an integrated database. You write models, services, commands, queries, and the framework generates HTTP API, auth, admin dashboard, AI tools, and OpenAPI documentation automatically.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
**Filesystem-first**: The structure of your folders IS your configuration. No routing files, no module registration. The framework scans and wires everything at boot.
|
|
8
|
+
|
|
9
|
+
**CQRS**: Commands = mutations (write), Queries = reads. Commands are compensable workflows. Queries use the Query Graph for cross-module joins.
|
|
10
|
+
|
|
11
|
+
**1 entity = 1 service**: Each entity has its own service. A service mutates ONE entity only. Cross-entity mutations go in commands.
|
|
12
|
+
|
|
13
|
+
**Constraint as Convention**: The framework prevents mistakes structurally. Services only receive their repository. Compensation is automatic via snapshots.
|
|
14
|
+
|
|
15
|
+
## The primitives
|
|
16
|
+
|
|
17
|
+
All `define*` functions are **globals** — zero imports needed:
|
|
18
|
+
|
|
19
|
+
| Function | Purpose | Location |
|
|
20
|
+
|----------|---------|----------|
|
|
21
|
+
| `defineModel()` | Entity schema (DML) | `src/modules/{mod}/entities/{entity}/model.ts` |
|
|
22
|
+
| `defineService()` | Custom mutations per entity | `src/modules/{mod}/entities/{entity}/service.ts` |
|
|
23
|
+
| `defineCommand()` | Compensable workflow (= API endpoint) | `src/commands/{context}/{name}.ts` |
|
|
24
|
+
| `defineWorkflow()` | Intra-module workflow (business logic) | `src/modules/{mod}/workflows/{name}.ts` |
|
|
25
|
+
| `defineQuery()` | Read endpoint (CQRS read side) | `src/queries/{context}/{name}.ts` |
|
|
26
|
+
| `defineQueryGraph()` | Expose query graph to frontend | `src/queries/{context}/graph.ts` |
|
|
27
|
+
| `extendQueryGraph()` | Resolver for external entities (PostHog, Stripe…) | `src/modules/{mod}/queries/graph.ts` |
|
|
28
|
+
| `defineSubscriber()` | Event reaction | `src/subscribers/{name}.ts` |
|
|
29
|
+
| `defineJob()` | Scheduled cron (dispatches commands) | `src/jobs/{name}.ts` |
|
|
30
|
+
| `defineLink()` | Relation (intra-module or cross-module) | `src/links/` or `src/modules/{mod}/links/` |
|
|
31
|
+
| `defineAgent()` | Typed AI step (LLM call) | `src/agents/{name}.ts` |
|
|
32
|
+
| `defineUserModel()` | Augmented defineModel with auth | `src/modules/{mod}/entities/{entity}/model.ts` |
|
|
33
|
+
| `defineMiddleware()` | Override per-context auth middleware | `src/middleware/{context}.ts` |
|
|
34
|
+
| `defineConfig()` | App configuration | `manta.config.ts` |
|
|
35
|
+
| `definePreset()` | Adapter preset (dev/prod) | Config or package |
|
|
36
|
+
|
|
37
|
+
Helpers: `field.*` (property types), `many()` (cardinality), `listParams()` / `retrieveParams()` (query input helpers), `fromZodSchema()` (convert a Zod schema into DML fields, typically for external models).
|
|
38
|
+
|
|
39
|
+
> **Note:** Relations between entities are defined exclusively with `defineLink()`. There is no `field.relation()`, `belongsTo()`, `hasMany()`, or `hasOne()` API.
|
|
40
|
+
|
|
41
|
+
## Project structure
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
src/
|
|
45
|
+
├── modules/ # Business logic (filesystem = module)
|
|
46
|
+
│ ├── catalog/
|
|
47
|
+
│ │ ├── entities/
|
|
48
|
+
│ │ │ ├── product/
|
|
49
|
+
│ │ │ │ ├── model.ts # defineModel('Product', { ... })
|
|
50
|
+
│ │ │ │ └── service.ts # defineService('product', ({ db }) => ({ ... }))
|
|
51
|
+
│ │ │ └── category/
|
|
52
|
+
│ │ │ └── model.ts
|
|
53
|
+
│ │ ├── links/
|
|
54
|
+
│ │ │ └── product-category.ts # defineLink (intra-module)
|
|
55
|
+
│ │ └── workflows/
|
|
56
|
+
│ │ └── categorize-product.ts # defineWorkflow (scoped, no auth)
|
|
57
|
+
│ ├── inventory/
|
|
58
|
+
│ │ └── entities/
|
|
59
|
+
│ │ └── inventory-item/
|
|
60
|
+
│ │ └── model.ts
|
|
61
|
+
│ └── admin/
|
|
62
|
+
│ └── entities/
|
|
63
|
+
│ └── admin/
|
|
64
|
+
│ └── model.ts # defineUserModel('admin', { role: field.enum([...]) })
|
|
65
|
+
│
|
|
66
|
+
├── commands/ # Mutations (context = folder name)
|
|
67
|
+
│ ├── admin/
|
|
68
|
+
│ │ ├── create-product.ts # → POST /api/admin/command/create-product
|
|
69
|
+
│ │ └── bulk-import.ts
|
|
70
|
+
│ └── store/
|
|
71
|
+
│ └── place-order.ts # → POST /api/store/command/place-order
|
|
72
|
+
│
|
|
73
|
+
├── queries/ # Reads (context = folder name)
|
|
74
|
+
│ ├── admin/
|
|
75
|
+
│ │ ├── list-products.ts # → GET /api/admin/list-products
|
|
76
|
+
│ │ └── graph.ts # defineQueryGraph('*') → POST /api/admin/graph
|
|
77
|
+
│ └── store/
|
|
78
|
+
│ ├── get-catalog.ts # → GET /api/store/get-catalog
|
|
79
|
+
│ └── graph.ts # defineQueryGraph({ product: true, order: (auth) => ... })
|
|
80
|
+
│
|
|
81
|
+
├── subscribers/ # Event reactions
|
|
82
|
+
│ └── product-created.ts
|
|
83
|
+
├── jobs/ # Cron tasks (dispatch commands)
|
|
84
|
+
│ └── cleanup-drafts.ts
|
|
85
|
+
├── links/ # Cross-module relations
|
|
86
|
+
│ └── product-inventory.ts
|
|
87
|
+
├── agents/ # AI agents
|
|
88
|
+
│ └── categorize-product.ts
|
|
89
|
+
├── middleware/ # Per-context auth overrides (optional)
|
|
90
|
+
│ └── admin.ts
|
|
91
|
+
├── spa/ # Single Page Applications (auto-detected)
|
|
92
|
+
│ ├── admin/
|
|
93
|
+
│ │ └── pages/
|
|
94
|
+
│ │ ├── page.tsx # → /admin/
|
|
95
|
+
│ │ └── products/
|
|
96
|
+
│ │ └── page.tsx # → /admin/products
|
|
97
|
+
│ └── vendor/
|
|
98
|
+
│ └── pages/
|
|
99
|
+
│ └── page.tsx
|
|
100
|
+
└── manta.config.ts
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## How things work
|
|
104
|
+
|
|
105
|
+
### defineModel — Data entities
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// src/modules/catalog/entities/product/model.ts
|
|
109
|
+
export default defineModel('Product', {
|
|
110
|
+
title: field.text(),
|
|
111
|
+
description: field.text().nullable(),
|
|
112
|
+
price: field.bigNumber(),
|
|
113
|
+
status: field.enum(['draft', 'active', 'archived']).default('draft'),
|
|
114
|
+
sku: field.text().unique(),
|
|
115
|
+
})
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Auto-generates: database table, TypeScript types, CRUD service methods.
|
|
119
|
+
|
|
120
|
+
### defineService — Custom mutations
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// src/modules/catalog/entities/product/service.ts
|
|
124
|
+
export default defineService('product', ({ db }) => ({
|
|
125
|
+
activate: async (id: string) => {
|
|
126
|
+
await db.update({ id, status: 'active' })
|
|
127
|
+
},
|
|
128
|
+
}))
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- First arg: entity name (string, autocompletes from codegen)
|
|
132
|
+
- Factory receives `{ db, log }` — db is a typed repository, log is ILoggerPort
|
|
133
|
+
- Auto-generated CRUD: `createProducts()`, `listProducts()`, `retrieveProduct()`, `updateProducts()`, `deleteProducts()`, `softDeleteProducts()`, `restoreProducts()`
|
|
134
|
+
- Compensation is automatic via repository snapshots
|
|
135
|
+
|
|
136
|
+
### defineCommand — Compensable workflows
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// src/commands/admin/create-product.ts
|
|
140
|
+
export default defineCommand({
|
|
141
|
+
name: 'create-product',
|
|
142
|
+
description: 'Create a product with initial inventory',
|
|
143
|
+
input: z.object({
|
|
144
|
+
title: z.string(),
|
|
145
|
+
sku: z.string(),
|
|
146
|
+
price: z.number(),
|
|
147
|
+
}),
|
|
148
|
+
workflow: async (input, { step, log, auth, headers }) => {
|
|
149
|
+
const product = await step.service.catalog.create({
|
|
150
|
+
title: input.title,
|
|
151
|
+
sku: input.sku,
|
|
152
|
+
price: input.price,
|
|
153
|
+
})
|
|
154
|
+
await step.emit('product.created', { id: product.id, sku: input.sku })
|
|
155
|
+
return product
|
|
156
|
+
},
|
|
157
|
+
})
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- Folder = context: `commands/admin/` → `POST /api/admin/command/create-product`
|
|
161
|
+
- `step.service.MODULE.METHOD()` — auto-compensated
|
|
162
|
+
- `step.command.NAME()` — sub-command
|
|
163
|
+
- `step.workflow.MODULE.NAME()` — call a module workflow
|
|
164
|
+
- `step.agent.NAME()` — AI call (checkpointed)
|
|
165
|
+
- `step.action('name', { invoke, compensate })` — external action
|
|
166
|
+
- `step.emit('event', data)` — fire event
|
|
167
|
+
- `step.link(a, b)` — link entities
|
|
168
|
+
- `auth` — authenticated user (`{ id, type, email }`) or null
|
|
169
|
+
- `headers` — raw request headers (for custom context like `x-property-id`)
|
|
170
|
+
|
|
171
|
+
### defineWorkflow — Intra-module business logic
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
// src/modules/catalog/workflows/categorize-product.ts
|
|
175
|
+
export default defineWorkflow({
|
|
176
|
+
name: 'categorize-product',
|
|
177
|
+
input: z.object({
|
|
178
|
+
productId: z.string(),
|
|
179
|
+
categoryId: z.string(),
|
|
180
|
+
}),
|
|
181
|
+
workflow: async (input, { step, log }) => {
|
|
182
|
+
const product = await step.service.catalog.retrieveProduct(input.productId)
|
|
183
|
+
await step.service.catalog.update(input.productId, { category_id: input.categoryId })
|
|
184
|
+
log.info(`Product ${product.id} categorized`)
|
|
185
|
+
return { productId: product.id }
|
|
186
|
+
},
|
|
187
|
+
})
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
- Scoped to the module: can only call `step.service.MODULE.*` for its own module's entities
|
|
191
|
+
- Receives `{ step, log }` — NO `auth`, NO `headers` (pure business logic)
|
|
192
|
+
- Has compensation (same step proxy as commands)
|
|
193
|
+
- Called from commands via `step.workflow.MODULE.NAME(input)`
|
|
194
|
+
- NOT an HTTP endpoint — only callable as a sub-workflow from commands
|
|
195
|
+
|
|
196
|
+
### defineQuery — Read endpoints
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// src/queries/admin/list-products.ts
|
|
200
|
+
export default defineQuery({
|
|
201
|
+
name: 'list-products',
|
|
202
|
+
description: 'List products with filtering',
|
|
203
|
+
input: z.object({
|
|
204
|
+
status: z.string().optional(),
|
|
205
|
+
...listParams(), // adds limit, offset, sort, order, search
|
|
206
|
+
}),
|
|
207
|
+
handler: async (input, { query, log, auth, headers }) => {
|
|
208
|
+
return query.graph({
|
|
209
|
+
entity: 'product',
|
|
210
|
+
filters: input.status ? { status: input.status } : undefined,
|
|
211
|
+
pagination: { take: input.limit, skip: input.offset },
|
|
212
|
+
})
|
|
213
|
+
},
|
|
214
|
+
})
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
- Handler receives `{ query, log, auth, headers }` — NO `app` (forced to use query graph)
|
|
218
|
+
- `query.graph()` for cross-module joins
|
|
219
|
+
- `listParams()` helper adds standard pagination/sort/search fields
|
|
220
|
+
- `retrieveParams()` helper adds `{ id, fields }` for single entity lookups
|
|
221
|
+
|
|
222
|
+
### defineQueryGraph — Expose query graph to frontend
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
// src/queries/admin/graph.ts — full access (admin/AI)
|
|
226
|
+
export default defineQueryGraph('*')
|
|
227
|
+
|
|
228
|
+
// src/queries/store/graph.ts — scoped access with row-level filtering
|
|
229
|
+
export default defineQueryGraph({
|
|
230
|
+
product: true, // all products
|
|
231
|
+
category: true, // all categories
|
|
232
|
+
order: (auth) => ({ customer_id: auth.id }), // only MY orders
|
|
233
|
+
customer: (auth) => ({ id: auth.id }), // only MY profile
|
|
234
|
+
})
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
- `'*'` = wildcard, all entities, all rows (admin/AI use case)
|
|
238
|
+
- `true` = all rows for this entity
|
|
239
|
+
- `(auth) => filters` = row-level filter applied automatically
|
|
240
|
+
- Not listed = not accessible (403)
|
|
241
|
+
- Creates `POST /api/{context}/graph` endpoint
|
|
242
|
+
- Frontend uses `useGraphQuery()` from `@mantajs/sdk`
|
|
243
|
+
|
|
244
|
+
### External entities — .external() + extendQueryGraph()
|
|
245
|
+
|
|
246
|
+
Use `.external()` on a model when the data lives in a third-party system (PostHog, Stripe, Shopify…). Manta keeps the entity visible to the query graph, AI tools, and `defineLink()`, but does NOT create a table, migration, or CRUD service.
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// src/modules/posthog/entities/posthog-event/model.ts
|
|
250
|
+
export default defineModel('PostHogEvent', {
|
|
251
|
+
id: field.text().primaryKey(),
|
|
252
|
+
event: field.text(),
|
|
253
|
+
distinct_id: field.text(),
|
|
254
|
+
timestamp: field.dateTime(),
|
|
255
|
+
properties: field.json(),
|
|
256
|
+
}).external()
|
|
257
|
+
|
|
258
|
+
// Shortcut: build the field map from a Zod schema (e.g. generated from an SDK)
|
|
259
|
+
// export default defineModel('PostHogEvent', fromZodSchema(postHogEventSchema)).external()
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Every module that owns external entities MUST register a resolver via `extendQueryGraph()` in `src/modules/{mod}/queries/graph.ts`:
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
// src/modules/posthog/queries/graph.ts
|
|
266
|
+
export default extendQueryGraph({
|
|
267
|
+
owns: ['PostHogEvent', 'PostHogPerson'],
|
|
268
|
+
async resolve(query, { app, logger }) {
|
|
269
|
+
// Translate the Manta GraphQueryConfig into a call to the external backend
|
|
270
|
+
return await fetchFromPostHog(query)
|
|
271
|
+
},
|
|
272
|
+
supportedFilters: {
|
|
273
|
+
PostHogEvent: ['distinct_id', 'event', 'timestamp'],
|
|
274
|
+
},
|
|
275
|
+
})
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
- `owns` — entity names this module resolves (must match `defineModel` names).
|
|
279
|
+
- `resolve` — receives the Manta query graph config, returns normalized rows shaped like the model's schema.
|
|
280
|
+
- `supportedFilters` (optional) — whitelist accepted filters; unsupported filters throw a clear error.
|
|
281
|
+
- The engine hydrates relations transparently: joining a local `product` to a `PostHogEvent` via `defineLink()` will trigger one DB query + one resolver call.
|
|
282
|
+
|
|
283
|
+
### defineSubscriber — Event reactions
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// src/subscribers/product-created.ts
|
|
287
|
+
export default defineSubscriber('product.created', async (event, { command, log }) => {
|
|
288
|
+
await command.initializeInventory({ productId: event.data.id })
|
|
289
|
+
})
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
- Handler receives `(event, { command, log })` — can ONLY dispatch commands
|
|
293
|
+
- Event names autocomplete from codegen (MantaEventMap)
|
|
294
|
+
- `makeIdempotent(cache, handler)` for at-least-once deduplication
|
|
295
|
+
|
|
296
|
+
### defineJob — Scheduled tasks
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
// src/jobs/cleanup-drafts.ts
|
|
300
|
+
export default defineJob('cleanup-drafts', '0 3 * * *', async ({ command, log }) => {
|
|
301
|
+
await command.cleanupDraftProducts({ olderThanDays: 30 })
|
|
302
|
+
})
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
- Same `{ command, log }` scope as subscribers — forces command dispatch
|
|
306
|
+
- Cron syntax for schedule
|
|
307
|
+
- Also accepts object form: `defineJob({ name, schedule, handler })`
|
|
308
|
+
|
|
309
|
+
### defineLink — Relations (unified API)
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
// src/links/product-inventory.ts (cross-module — always creates pivot table)
|
|
313
|
+
export default defineLink('product', many('inventory_item'))
|
|
314
|
+
|
|
315
|
+
// src/modules/catalog/links/product-category.ts (intra-module — 1:N creates FK directly)
|
|
316
|
+
export default defineLink('product', many('category'))
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
- ONE API for all relations: cross-module and intra-module
|
|
320
|
+
- Cross-module (`src/links/`): always creates pivot tables
|
|
321
|
+
- Intra-module (`src/modules/{mod}/links/`): 1:1 and 1:N create FK directly, M:N creates pivot
|
|
322
|
+
- `many()` wraps for 1:N or M:N cardinality
|
|
323
|
+
- Cascade is automatic
|
|
324
|
+
|
|
325
|
+
### defineUserModel — Augmented defineModel with auth
|
|
326
|
+
|
|
327
|
+
Use instead of `defineModel()` when an entity represents a user that can log in.
|
|
328
|
+
Place it in `model.ts` like any other entity — it IS a model, with auth on top.
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
// src/modules/admin/entities/admin/model.ts
|
|
332
|
+
export default defineUserModel('admin', {
|
|
333
|
+
role: field.enum(['super_admin', 'editor', 'viewer']),
|
|
334
|
+
})
|
|
335
|
+
|
|
336
|
+
// src/modules/customer/entities/customer/model.ts
|
|
337
|
+
export default defineUserModel('customer', {
|
|
338
|
+
company_name: field.text().nullable(),
|
|
339
|
+
phone: field.text().nullable(),
|
|
340
|
+
has_account: field.boolean().default(false),
|
|
341
|
+
})
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**The entity works like any defineModel** — has a service, links, workflows, appears in the query graph. **In addition, the framework auto-generates:**
|
|
345
|
+
|
|
346
|
+
Tables: `admin_user`, `admin_invite`
|
|
347
|
+
|
|
348
|
+
Auth routes (on `/api/admin/`):
|
|
349
|
+
- `POST /login` (public) — returns JWT with `{ id, type: 'admin' }`
|
|
350
|
+
- `DELETE /logout` (public) — blacklists token
|
|
351
|
+
- `POST /refresh` (public) — refresh token
|
|
352
|
+
- `POST /forgot-password` (public) — reset flow
|
|
353
|
+
- `POST /reset-password` (public) — confirm reset
|
|
354
|
+
- `POST /accept-invite` (public) — accept invitation
|
|
355
|
+
|
|
356
|
+
Protected routes (JWT required, `type === 'admin'`):
|
|
357
|
+
- `GET /me` — current user
|
|
358
|
+
- `GET /users` — list users
|
|
359
|
+
- `POST /create-user`, `POST /update-user`, `POST /delete-user`
|
|
360
|
+
- `POST /create-invite`, `POST /refresh-invite`
|
|
361
|
+
|
|
362
|
+
Middleware: all `/api/admin/*` routes verify JWT + `type === 'admin'`
|
|
363
|
+
|
|
364
|
+
Override: create `src/commands/admin/login.ts` to replace auto-generated login.
|
|
365
|
+
Override: create `src/middleware/admin.ts` to replace auto-generated middleware.
|
|
366
|
+
|
|
367
|
+
Dev seed: `admin@manta.local` / `admin` created automatically in dev mode.
|
|
368
|
+
|
|
369
|
+
### defineAgent — AI steps
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
// src/agents/categorize-product.ts
|
|
373
|
+
export default defineAgent({
|
|
374
|
+
name: 'categorize-product',
|
|
375
|
+
description: 'Categorize a product into a department',
|
|
376
|
+
input: z.object({ title: z.string() }),
|
|
377
|
+
output: z.object({ category: z.enum(['electronics', 'clothing', 'food', 'other']) }),
|
|
378
|
+
instructions: (input) => `Categorize this product: "${input.title}"`,
|
|
379
|
+
})
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
Used in commands via `step.agent.categorizeProduct(input)`. Checkpointed — if the workflow crashes after the agent step, result is recovered.
|
|
383
|
+
|
|
384
|
+
### SPA — Single Page Applications
|
|
385
|
+
|
|
386
|
+
SPAs are auto-detected from `src/spa/{name}/`. No boilerplate needed.
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
src/spa/admin/
|
|
390
|
+
└── pages/
|
|
391
|
+
├── page.tsx # → /admin/
|
|
392
|
+
└── products/
|
|
393
|
+
└── page.tsx # → /admin/products
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
Defaults: `@mantajs/dashboard` (shell) + `@mantajs/ui` (preset). Override in config:
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
// manta.config.ts
|
|
400
|
+
export default defineConfig({
|
|
401
|
+
spa: {
|
|
402
|
+
admin: { preset: '@mantajs/ui-preset-dark' }, // change theme
|
|
403
|
+
vendor: { dashboard: null }, // no shell, custom SPA
|
|
404
|
+
},
|
|
405
|
+
})
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### SDK — Frontend hooks
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
import { useCommand, useQuery, useGraphQuery, useAuth } from '@mantajs/sdk'
|
|
412
|
+
|
|
413
|
+
// Commands (autocomplete from MantaGeneratedCommands)
|
|
414
|
+
const createProduct = useCommand('create-product')
|
|
415
|
+
await createProduct.mutateAsync({ title: 'Widget', sku: 'W-001' })
|
|
416
|
+
|
|
417
|
+
// Named queries (autocomplete from MantaGeneratedQueries)
|
|
418
|
+
const { data } = useQuery('list-products', { status: 'active', limit: 10 })
|
|
419
|
+
|
|
420
|
+
// Graph queries (only if defineQueryGraph exists for context)
|
|
421
|
+
const { data } = useGraphQuery({ entity: 'product', relations: ['inventory_item'] })
|
|
422
|
+
|
|
423
|
+
// Auth
|
|
424
|
+
const { login, logout, me, isAuthenticated } = useAuth()
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Auth context
|
|
428
|
+
|
|
429
|
+
Commands and queries receive `auth` and `headers`:
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
// auth.id — user ID (from admin_user.id, customer_user.id, etc.)
|
|
433
|
+
// auth.type — context type ('admin', 'customer')
|
|
434
|
+
// auth.email — user email
|
|
435
|
+
// headers['x-property-id'] — custom headers
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
`auth` is null on public routes. JWT is signed and verified — cannot be tampered with.
|
|
439
|
+
|
|
440
|
+
## Critical rules
|
|
441
|
+
|
|
442
|
+
1. **No API routes** — Define commands + queries. The framework generates endpoints from filesystem structure.
|
|
443
|
+
2. **1 entity = 1 service** — Each entity gets `model.ts` + optional `service.ts`. Services receive ONLY their entity's repository.
|
|
444
|
+
3. **defineWorkflow for intra-module logic** — Workflows in `src/modules/X/workflows/` orchestrate multiple entities within the same module. They receive `{ step, log }` (no auth).
|
|
445
|
+
4. **defineCommand for cross-module + HTTP** — Commands in `src/commands/` orchestrate any module and receive `{ step, log, auth, headers }`.
|
|
446
|
+
5. **Commands call workflows** — Use `step.workflow.MODULE.NAME(input)` to invoke module workflows from commands.
|
|
447
|
+
6. **Subscribers dispatch commands** — They receive `(event, { command, log })`, not direct service access.
|
|
448
|
+
7. **Jobs dispatch commands** — They receive `{ command, log }`, same scope as subscribers.
|
|
449
|
+
8. **No cross-module imports** — Modules cannot import from other modules. Use links.
|
|
450
|
+
9. **No field.relation()** — Relations are defined ONLY via `defineLink()`. No `belongsTo`, `hasMany`, `hasOne`.
|
|
451
|
+
10. **Events are at-least-once** — Use `makeIdempotent()` if duplicate processing is a problem.
|
|
452
|
+
11. **Entity names are PascalCase** — `Product`, `BlogPost`, `InventoryItem`.
|
|
453
|
+
12. **defineUserModel instead of defineModel** — When an entity represents a user that can log in, use `defineUserModel()` instead of `defineModel()`. It works like a model but adds auth routes, middleware, and invites.
|
|
454
|
+
13. **Query graph for reads** — In defineQuery, use `query.graph()`. No direct service access.
|
|
455
|
+
14. **External entities need a resolver** — Any `defineModel(...).external()` MUST be paired with `extendQueryGraph({ owns: [...], resolve })` in the same module, otherwise queries on that entity fail.
|
|
456
|
+
|
|
457
|
+
## Auto-generated from your code
|
|
458
|
+
|
|
459
|
+
| Your code | Framework generates |
|
|
460
|
+
|-----------|-------------------|
|
|
461
|
+
| `defineModel('Product', {...})` | DB table, TypeScript types, CRUD methods |
|
|
462
|
+
| `defineModel('Ext', {...}).external()` | Entity registry entry only — NO table, NO migration, NO CRUD service |
|
|
463
|
+
| `extendQueryGraph({ owns, resolve })` | Routes queries on owned external entities to the module's resolver |
|
|
464
|
+
| `defineService('product', ...)` | Custom service methods with auto-compensation |
|
|
465
|
+
| `defineCommand({ name: 'create-product', ... })` | `POST /api/{ctx}/command/create-product` |
|
|
466
|
+
| `defineQuery({ name: 'list-products', ... })` | `GET /api/{ctx}/list-products` |
|
|
467
|
+
| `defineQueryGraph('*')` | `POST /api/{ctx}/graph` |
|
|
468
|
+
| `defineUserModel('admin', {...})` | Table, auth routes, middleware, invite system, dev seed |
|
|
469
|
+
| `defineSubscriber('event', handler)` | Event subscription with typed data |
|
|
470
|
+
| `defineWorkflow({ name, input, workflow })` | Intra-module compensable workflow (no HTTP endpoint) |
|
|
471
|
+
| `defineLink('product', many('item'))` | FK (intra-module) or pivot table (cross-module) |
|
|
472
|
+
| `src/spa/admin/pages/*.tsx` | SPA with routing, dashboard shell, Vite build |
|
|
473
|
+
|
|
474
|
+
## Documentation
|
|
475
|
+
|
|
476
|
+
Complete framework documentation is in `node_modules/@mantajs/core/docs/`:
|
|
477
|
+
|
|
478
|
+
| Doc | Content |
|
|
479
|
+
|-----|---------|
|
|
480
|
+
| [00-overview](node_modules/@mantajs/core/docs/00-overview.md) | Philosophy, mental model |
|
|
481
|
+
| [01-getting-started](node_modules/@mantajs/core/docs/01-getting-started.md) | Create a project from scratch |
|
|
482
|
+
| [02-models](node_modules/@mantajs/core/docs/02-models.md) | defineModel() — properties, modifiers |
|
|
483
|
+
| [03-services](node_modules/@mantajs/core/docs/03-services.md) | defineService() — CRUD, compensation, typed repo |
|
|
484
|
+
| [04-users](node_modules/@mantajs/core/docs/04-users.md) | defineUserModel() — auth, CRUD, invites, middleware |
|
|
485
|
+
| [05-commands](node_modules/@mantajs/core/docs/05-commands.md) | defineCommand() — workflows, steps, compensation |
|
|
486
|
+
| [06-queries](node_modules/@mantajs/core/docs/06-queries.md) | defineQuery() + defineQueryGraph() |
|
|
487
|
+
| [07-events](node_modules/@mantajs/core/docs/07-events.md) | defineSubscriber() + defineJob() + defineWorkflow() |
|
|
488
|
+
| [08-links](node_modules/@mantajs/core/docs/08-links.md) | defineLink() — unified relation API (FK or pivot) |
|
|
489
|
+
| [09-agents](node_modules/@mantajs/core/docs/09-agents.md) | defineAgent() — AI steps, checkpointing |
|
|
490
|
+
| [10-spa](node_modules/@mantajs/core/docs/10-spa.md) | SPA system, dashboard, SDK |
|
|
491
|
+
| [11-config](node_modules/@mantajs/core/docs/11-config.md) | defineConfig(), CLI, presets |
|
|
492
|
+
| [12-constraints](node_modules/@mantajs/core/docs/12-constraints.md) | Validations, error messages |
|
|
493
|
+
| [13-testing](node_modules/@mantajs/core/docs/13-testing.md) | Testing guide |
|
|
494
|
+
| [14-adapters](node_modules/@mantajs/core/docs/14-adapters.md) | Custom adapters |
|
|
495
|
+
| [15-hosts](node_modules/@mantajs/core/docs/15-hosts.md) | Custom hosts |
|
|
496
|
+
| [16-reference](node_modules/@mantajs/core/docs/16-reference.md) | API reference |
|
|
497
|
+
|
|
498
|
+
**Read the relevant doc BEFORE writing code.** When in doubt, check [04-commands.md](node_modules/@mantajs/core/docs/04-commands.md) for workflow patterns.
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
export interface DevOptions {
|
|
2
|
+
port?: number;
|
|
3
|
+
noMigrate?: boolean;
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface StartOptions {
|
|
7
|
+
port?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface BuildOptions {
|
|
10
|
+
preset?: string;
|
|
11
|
+
}
|
|
12
|
+
export type InitPreset = 'nitro' | 'next';
|
|
13
|
+
export interface InitOptions {
|
|
14
|
+
dir?: string;
|
|
15
|
+
preset?: InitPreset;
|
|
16
|
+
}
|
|
17
|
+
export interface ExecOptions {
|
|
18
|
+
script: string;
|
|
19
|
+
dryRun?: boolean;
|
|
20
|
+
args?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface GenerateOptions {
|
|
23
|
+
name?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface MigrateOptions {
|
|
26
|
+
force?: boolean;
|
|
27
|
+
dryRun?: boolean;
|
|
28
|
+
json?: boolean;
|
|
29
|
+
allOrNothing?: boolean;
|
|
30
|
+
forceUnlock?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface RollbackOptions {
|
|
33
|
+
steps?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface DiffOptions {
|
|
36
|
+
json?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface LoadedConfig {
|
|
39
|
+
database?: {
|
|
40
|
+
url?: string;
|
|
41
|
+
pool?: {
|
|
42
|
+
min?: number;
|
|
43
|
+
max?: number;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
http?: {
|
|
47
|
+
port?: number;
|
|
48
|
+
cors?: Record<string, unknown>;
|
|
49
|
+
rateLimit?: {
|
|
50
|
+
enabled?: boolean;
|
|
51
|
+
windowMs?: number;
|
|
52
|
+
maxRequests?: number;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
auth?: {
|
|
56
|
+
jwtSecret?: string;
|
|
57
|
+
session?: {
|
|
58
|
+
enabled?: boolean;
|
|
59
|
+
cookieName?: string;
|
|
60
|
+
ttl?: number;
|
|
61
|
+
cookie?: Record<string, unknown>;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
modules?: unknown[];
|
|
65
|
+
plugins?: Array<string | {
|
|
66
|
+
resolve: string;
|
|
67
|
+
options?: Record<string, unknown>;
|
|
68
|
+
}>;
|
|
69
|
+
featureFlags?: Record<string, boolean>;
|
|
70
|
+
query?: {
|
|
71
|
+
maxTotalEntities?: number;
|
|
72
|
+
};
|
|
73
|
+
strict?: boolean;
|
|
74
|
+
boot?: {
|
|
75
|
+
lazyBootTimeoutMs?: number;
|
|
76
|
+
autoMigrate?: boolean;
|
|
77
|
+
};
|
|
78
|
+
events?: {
|
|
79
|
+
maxPayloadSize?: number;
|
|
80
|
+
};
|
|
81
|
+
appEnv?: string;
|
|
82
|
+
adapters?: Record<string, {
|
|
83
|
+
adapter: string;
|
|
84
|
+
options?: Record<string, unknown>;
|
|
85
|
+
}>;
|
|
86
|
+
/** Preset name ('dev', 'vercel') or inline PresetDefinition */
|
|
87
|
+
preset?: string | import('@mantajs/core').PresetDefinition;
|
|
88
|
+
/** SPA declarations — each key is a context name (e.g. 'admin', 'vendor') */
|
|
89
|
+
spa?: Record<string, {
|
|
90
|
+
dashboard?: string;
|
|
91
|
+
preset?: string;
|
|
92
|
+
}>;
|
|
93
|
+
}
|
|
94
|
+
export interface BootContext {
|
|
95
|
+
config: LoadedConfig;
|
|
96
|
+
profile: 'dev' | 'prod';
|
|
97
|
+
verbose?: boolean;
|
|
98
|
+
/** App object — created at step 3, used by all subsequent steps */
|
|
99
|
+
app?: import('@mantajs/core').MantaApp;
|
|
100
|
+
/** Resolved adapters to register — injected by the CLI before boot */
|
|
101
|
+
adapters?: Record<string, unknown>;
|
|
102
|
+
/** Working directory (defaults to process.cwd()) */
|
|
103
|
+
cwd?: string;
|
|
104
|
+
/** Discovered resources from ResourceLoader (populated before lazy boot) */
|
|
105
|
+
discoveredResources?: import('./resource-loader').DiscoveredResources;
|
|
106
|
+
/** Loaded modules — maps module name to ModuleExports (populated at step 9) */
|
|
107
|
+
loadedModules?: Map<string, import('@mantajs/core').ModuleExports>;
|
|
108
|
+
/** Event group ID for boot event buffer (set at step 7, released at step 18) */
|
|
109
|
+
bootEventGroupId?: string;
|
|
110
|
+
}
|
|
111
|
+
export interface ManifestRouteEntry {
|
|
112
|
+
path: string;
|
|
113
|
+
methods: string[];
|
|
114
|
+
file: string;
|
|
115
|
+
namespace: string;
|
|
116
|
+
middlewares: unknown[];
|
|
117
|
+
}
|
|
118
|
+
export interface ManifestSubscriberEntry {
|
|
119
|
+
id: string;
|
|
120
|
+
file: string;
|
|
121
|
+
events: string[];
|
|
122
|
+
}
|
|
123
|
+
export interface ManifestWorkflowEntry {
|
|
124
|
+
id: string;
|
|
125
|
+
file: string;
|
|
126
|
+
steps: string[];
|
|
127
|
+
}
|
|
128
|
+
export interface ManifestJobEntry {
|
|
129
|
+
id: string;
|
|
130
|
+
file: string;
|
|
131
|
+
schedule: string;
|
|
132
|
+
}
|
|
133
|
+
export interface ManifestLinkEntry {
|
|
134
|
+
id: string;
|
|
135
|
+
file: string;
|
|
136
|
+
modules: string[];
|
|
137
|
+
table: string;
|
|
138
|
+
}
|
|
139
|
+
export interface ManifestModuleEntry {
|
|
140
|
+
name: string;
|
|
141
|
+
file: string;
|
|
142
|
+
models: string[];
|
|
143
|
+
service: string;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,uCAAuC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const dim: (s: string) => string;
|
|
2
|
+
export declare const green: (s: string) => string;
|
|
3
|
+
export declare const red: (s: string) => string;
|
|
4
|
+
export declare const bold: (s: string) => string;
|
|
5
|
+
export declare const cyan: (s: string) => string;
|
|
6
|
+
export declare const yellow: (s: string) => string;
|
|
7
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/utils/colors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAAyB,CAAA;AACtD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,WAA0B,CAAA;AACzD,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAA0B,CAAA;AACvD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAAyB,CAAA;AACvD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAA0B,CAAA;AACxD,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,WAA0B,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// ANSI color helpers — no external dependencies
|
|
2
|
+
export const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
3
|
+
export const green = (s) => `\x1b[32m${s}\x1b[0m`;
|
|
4
|
+
export const red = (s) => `\x1b[31m${s}\x1b[0m`;
|
|
5
|
+
export const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
6
|
+
export const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
|
|
7
|
+
export const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
|
|
8
|
+
//# sourceMappingURL=colors.js.map
|