@mantajs/core 0.1.7 → 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/dist/adapters/auth-mock.d.ts +44 -0
- package/dist/adapters/auth-mock.d.ts.map +1 -0
- package/dist/adapters/auth-mock.js +160 -0
- package/dist/adapters/auth-mock.js.map +1 -0
- package/dist/adapters/cache-memory.d.ts +11 -0
- package/dist/adapters/cache-memory.d.ts.map +1 -0
- package/dist/adapters/cache-memory.js +32 -0
- package/dist/adapters/cache-memory.js.map +1 -0
- package/dist/adapters/database-memory.d.ts +24 -0
- package/dist/adapters/database-memory.d.ts.map +1 -0
- package/dist/adapters/database-memory.js +141 -0
- package/dist/adapters/database-memory.js.map +1 -0
- package/dist/adapters/eventbus-memory.d.ts +37 -0
- package/dist/adapters/eventbus-memory.d.ts.map +1 -0
- package/dist/adapters/eventbus-memory.js +166 -0
- package/dist/adapters/eventbus-memory.js.map +1 -0
- package/dist/adapters/file-memory.d.ts +24 -0
- package/dist/adapters/file-memory.d.ts.map +1 -0
- package/dist/adapters/file-memory.js +77 -0
- package/dist/adapters/file-memory.js.map +1 -0
- package/dist/adapters/http-memory.d.ts +23 -0
- package/dist/adapters/http-memory.d.ts.map +1 -0
- package/dist/adapters/http-memory.js +149 -0
- package/dist/adapters/http-memory.js.map +1 -0
- package/dist/adapters/index.d.ts +14 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +15 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/job-scheduler-memory.d.ts +20 -0
- package/dist/adapters/job-scheduler-memory.d.ts.map +1 -0
- package/dist/adapters/job-scheduler-memory.js +103 -0
- package/dist/adapters/job-scheduler-memory.js.map +1 -0
- package/dist/adapters/locking-memory.d.ts +20 -0
- package/dist/adapters/locking-memory.d.ts.map +1 -0
- package/dist/adapters/locking-memory.js +85 -0
- package/dist/adapters/locking-memory.js.map +1 -0
- package/dist/adapters/logger-test.d.ts +30 -0
- package/dist/adapters/logger-test.d.ts.map +1 -0
- package/dist/adapters/logger-test.js +77 -0
- package/dist/adapters/logger-test.js.map +1 -0
- package/dist/adapters/notification-memory.d.ts +27 -0
- package/dist/adapters/notification-memory.d.ts.map +1 -0
- package/dist/adapters/notification-memory.js +69 -0
- package/dist/adapters/notification-memory.js.map +1 -0
- package/dist/adapters/relational-query-memory.d.ts +47 -0
- package/dist/adapters/relational-query-memory.d.ts.map +1 -0
- package/dist/adapters/relational-query-memory.js +263 -0
- package/dist/adapters/relational-query-memory.js.map +1 -0
- package/dist/adapters/repository-factory-memory.d.ts +17 -0
- package/dist/adapters/repository-factory-memory.d.ts.map +1 -0
- package/dist/adapters/repository-factory-memory.js +32 -0
- package/dist/adapters/repository-factory-memory.js.map +1 -0
- package/dist/adapters/repository-memory.d.ts +30 -0
- package/dist/adapters/repository-memory.d.ts.map +1 -0
- package/dist/adapters/repository-memory.js +183 -0
- package/dist/adapters/repository-memory.js.map +1 -0
- package/dist/ai/index.d.ts +53 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +48 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/app/index.d.ts +97 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +217 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/request-context.d.ts +35 -0
- package/dist/app/request-context.d.ts.map +1 -0
- package/dist/app/request-context.js +32 -0
- package/dist/app/request-context.js.map +1 -0
- package/dist/auth/auth-module-service.d.ts +62 -0
- package/dist/auth/auth-module-service.d.ts.map +1 -0
- package/dist/auth/auth-module-service.js +210 -0
- package/dist/auth/auth-module-service.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +19 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +61 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/models/auth-identity.d.ts +11 -0
- package/dist/auth/models/auth-identity.d.ts.map +1 -0
- package/dist/auth/models/auth-identity.js +12 -0
- package/dist/auth/models/auth-identity.js.map +1 -0
- package/dist/auth/providers/emailpass.d.ts +7 -0
- package/dist/auth/providers/emailpass.d.ts.map +1 -0
- package/dist/auth/providers/emailpass.js +94 -0
- package/dist/auth/providers/emailpass.js.map +1 -0
- package/dist/auth/providers/types.d.ts +66 -0
- package/dist/auth/providers/types.d.ts.map +1 -0
- package/dist/auth/providers/types.js +3 -0
- package/dist/auth/providers/types.js.map +1 -0
- package/dist/auth/types.d.ts +36 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +3 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/command/define-command-graph.d.ts +63 -0
- package/dist/command/define-command-graph.d.ts.map +1 -0
- package/dist/command/define-command-graph.js +80 -0
- package/dist/command/define-command-graph.js.map +1 -0
- package/dist/command/dml-to-zod.d.ts +34 -0
- package/dist/command/dml-to-zod.d.ts.map +1 -0
- package/dist/command/dml-to-zod.js +140 -0
- package/dist/command/dml-to-zod.js.map +1 -0
- package/dist/command/generate-entity-commands.d.ts +68 -0
- package/dist/command/generate-entity-commands.d.ts.map +1 -0
- package/dist/command/generate-entity-commands.js +350 -0
- package/dist/command/generate-entity-commands.js.map +1 -0
- package/dist/command/index.d.ts +54 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +338 -0
- package/dist/command/index.js.map +1 -0
- package/dist/command/types.d.ts +131 -0
- package/dist/command/types.d.ts.map +1 -0
- package/dist/command/types.js +2 -0
- package/dist/command/types.js.map +1 -0
- package/dist/config/built-in-presets.d.ts +20 -0
- package/dist/config/built-in-presets.d.ts.map +1 -0
- package/dist/config/built-in-presets.js +70 -0
- package/dist/config/built-in-presets.js.map +1 -0
- package/dist/config/config-manager.d.ts +117 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +245 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/define-config.d.ts +20 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +64 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/feature-flags.d.ts +48 -0
- package/dist/config/feature-flags.d.ts.map +1 -0
- package/dist/config/feature-flags.js +97 -0
- package/dist/config/feature-flags.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/presets.d.ts +38 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/presets.js +29 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/config/types.d.ts +707 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +112 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/index.d.ts +95 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/registry.d.ts +32 -0
- package/dist/context/registry.d.ts.map +1 -0
- package/dist/context/registry.js +142 -0
- package/dist/context/registry.js.map +1 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +839 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +106 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/dml/entity.d.ts +132 -0
- package/dist/dml/entity.d.ts.map +1 -0
- package/dist/dml/entity.js +110 -0
- package/dist/dml/entity.js.map +1 -0
- package/dist/dml/from-zod.d.ts +13 -0
- package/dist/dml/from-zod.d.ts.map +1 -0
- package/dist/dml/from-zod.js +81 -0
- package/dist/dml/from-zod.js.map +1 -0
- package/dist/dml/generator/index.d.ts +62 -0
- package/dist/dml/generator/index.d.ts.map +1 -0
- package/dist/dml/generator/index.js +208 -0
- package/dist/dml/generator/index.js.map +1 -0
- package/dist/dml/index.d.ts +11 -0
- package/dist/dml/index.d.ts.map +1 -0
- package/dist/dml/index.js +13 -0
- package/dist/dml/index.js.map +1 -0
- package/dist/dml/infer.d.ts +36 -0
- package/dist/dml/infer.d.ts.map +1 -0
- package/dist/dml/infer.js +5 -0
- package/dist/dml/infer.js.map +1 -0
- package/dist/dml/model.d.ts +58 -0
- package/dist/dml/model.d.ts.map +1 -0
- package/dist/dml/model.js +95 -0
- package/dist/dml/model.js.map +1 -0
- package/dist/dml/modifiers.d.ts +9 -0
- package/dist/dml/modifiers.d.ts.map +1 -0
- package/dist/dml/modifiers.js +25 -0
- package/dist/dml/modifiers.js.map +1 -0
- package/dist/dml/properties/array.d.ts +7 -0
- package/dist/dml/properties/array.d.ts.map +1 -0
- package/dist/dml/properties/array.js +5 -0
- package/dist/dml/properties/array.js.map +1 -0
- package/dist/dml/properties/autoincrement.d.ts +7 -0
- package/dist/dml/properties/autoincrement.d.ts.map +1 -0
- package/dist/dml/properties/autoincrement.js +5 -0
- package/dist/dml/properties/autoincrement.js.map +1 -0
- package/dist/dml/properties/base.d.ts +124 -0
- package/dist/dml/properties/base.d.ts.map +1 -0
- package/dist/dml/properties/base.js +76 -0
- package/dist/dml/properties/base.js.map +1 -0
- package/dist/dml/properties/big-number.d.ts +7 -0
- package/dist/dml/properties/big-number.d.ts.map +1 -0
- package/dist/dml/properties/big-number.js +5 -0
- package/dist/dml/properties/big-number.js.map +1 -0
- package/dist/dml/properties/boolean.d.ts +7 -0
- package/dist/dml/properties/boolean.d.ts.map +1 -0
- package/dist/dml/properties/boolean.js +5 -0
- package/dist/dml/properties/boolean.js.map +1 -0
- package/dist/dml/properties/computed.d.ts +9 -0
- package/dist/dml/properties/computed.d.ts.map +1 -0
- package/dist/dml/properties/computed.js +22 -0
- package/dist/dml/properties/computed.js.map +1 -0
- package/dist/dml/properties/date-time.d.ts +7 -0
- package/dist/dml/properties/date-time.d.ts.map +1 -0
- package/dist/dml/properties/date-time.js +5 -0
- package/dist/dml/properties/date-time.js.map +1 -0
- package/dist/dml/properties/enum.d.ts +12 -0
- package/dist/dml/properties/enum.d.ts.map +1 -0
- package/dist/dml/properties/enum.js +14 -0
- package/dist/dml/properties/enum.js.map +1 -0
- package/dist/dml/properties/float.d.ts +7 -0
- package/dist/dml/properties/float.d.ts.map +1 -0
- package/dist/dml/properties/float.js +5 -0
- package/dist/dml/properties/float.js.map +1 -0
- package/dist/dml/properties/index.d.ts +15 -0
- package/dist/dml/properties/index.d.ts.map +1 -0
- package/dist/dml/properties/index.js +15 -0
- package/dist/dml/properties/index.js.map +1 -0
- package/dist/dml/properties/json.d.ts +7 -0
- package/dist/dml/properties/json.d.ts.map +1 -0
- package/dist/dml/properties/json.js +6 -0
- package/dist/dml/properties/json.js.map +1 -0
- package/dist/dml/properties/nullable.d.ts +23 -0
- package/dist/dml/properties/nullable.d.ts.map +1 -0
- package/dist/dml/properties/nullable.js +46 -0
- package/dist/dml/properties/nullable.js.map +1 -0
- package/dist/dml/properties/number.d.ts +10 -0
- package/dist/dml/properties/number.d.ts.map +1 -0
- package/dist/dml/properties/number.js +13 -0
- package/dist/dml/properties/number.js.map +1 -0
- package/dist/dml/properties/primary-key.d.ts +14 -0
- package/dist/dml/properties/primary-key.d.ts.map +1 -0
- package/dist/dml/properties/primary-key.js +23 -0
- package/dist/dml/properties/primary-key.js.map +1 -0
- package/dist/dml/properties/text.d.ts +15 -0
- package/dist/dml/properties/text.d.ts.map +1 -0
- package/dist/dml/properties/text.js +19 -0
- package/dist/dml/properties/text.js.map +1 -0
- package/dist/dml/relations/belongs-to.d.ts +20 -0
- package/dist/dml/relations/belongs-to.d.ts.map +1 -0
- package/dist/dml/relations/belongs-to.js +29 -0
- package/dist/dml/relations/belongs-to.js.map +1 -0
- package/dist/dml/relations/has-many.d.ts +16 -0
- package/dist/dml/relations/has-many.d.ts.map +1 -0
- package/dist/dml/relations/has-many.js +25 -0
- package/dist/dml/relations/has-many.js.map +1 -0
- package/dist/dml/relations/has-one.d.ts +26 -0
- package/dist/dml/relations/has-one.d.ts.map +1 -0
- package/dist/dml/relations/has-one.js +46 -0
- package/dist/dml/relations/has-one.js.map +1 -0
- package/dist/dml/relations/many-to-many.d.ts +9 -0
- package/dist/dml/relations/many-to-many.d.ts.map +1 -0
- package/dist/dml/relations/many-to-many.js +11 -0
- package/dist/dml/relations/many-to-many.js.map +1 -0
- package/dist/errors/manta-error.d.ts +68 -0
- package/dist/errors/manta-error.d.ts.map +1 -0
- package/dist/errors/manta-error.js +80 -0
- package/dist/errors/manta-error.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/message-aggregator.d.ts +25 -0
- package/dist/events/message-aggregator.d.ts.map +1 -0
- package/dist/events/message-aggregator.js +35 -0
- package/dist/events/message-aggregator.js.map +1 -0
- package/dist/events/types.d.ts +42 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +3 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/job/index.d.ts +52 -0
- package/dist/job/index.d.ts.map +1 -0
- package/dist/job/index.js +31 -0
- package/dist/job/index.js.map +1 -0
- package/dist/link/index.d.ts +97 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +185 -0
- package/dist/link/index.js.map +1 -0
- package/dist/middleware/define-middleware.d.ts +54 -0
- package/dist/middleware/define-middleware.d.ts.map +1 -0
- package/dist/middleware/define-middleware.js +40 -0
- package/dist/middleware/define-middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +56 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +50 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/module/index.d.ts +56 -0
- package/dist/module/index.d.ts.map +1 -0
- package/dist/module/index.js +52 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/versioning.d.ts +27 -0
- package/dist/module/versioning.d.ts.map +1 -0
- package/dist/module/versioning.js +64 -0
- package/dist/module/versioning.js.map +1 -0
- package/dist/naming.d.ts +39 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +95 -0
- package/dist/naming.js.map +1 -0
- package/dist/ports/analytics.d.ts +7 -0
- package/dist/ports/analytics.d.ts.map +1 -0
- package/dist/ports/analytics.js +3 -0
- package/dist/ports/analytics.js.map +1 -0
- package/dist/ports/auth.d.ts +27 -0
- package/dist/ports/auth.d.ts.map +1 -0
- package/dist/ports/auth.js +3 -0
- package/dist/ports/auth.js.map +1 -0
- package/dist/ports/cache.d.ts +35 -0
- package/dist/ports/cache.d.ts.map +1 -0
- package/dist/ports/cache.js +3 -0
- package/dist/ports/cache.js.map +1 -0
- package/dist/ports/database.d.ts +40 -0
- package/dist/ports/database.d.ts.map +1 -0
- package/dist/ports/database.js +3 -0
- package/dist/ports/database.js.map +1 -0
- package/dist/ports/event-bus.d.ts +85 -0
- package/dist/ports/event-bus.d.ts.map +1 -0
- package/dist/ports/event-bus.js +3 -0
- package/dist/ports/event-bus.js.map +1 -0
- package/dist/ports/file.d.ts +62 -0
- package/dist/ports/file.d.ts.map +1 -0
- package/dist/ports/file.js +3 -0
- package/dist/ports/file.js.map +1 -0
- package/dist/ports/http.d.ts +20 -0
- package/dist/ports/http.d.ts.map +1 -0
- package/dist/ports/http.js +3 -0
- package/dist/ports/http.js.map +1 -0
- package/dist/ports/in-memory-progress-channel.d.ts +9 -0
- package/dist/ports/in-memory-progress-channel.d.ts.map +1 -0
- package/dist/ports/in-memory-progress-channel.js +19 -0
- package/dist/ports/in-memory-progress-channel.js.map +1 -0
- package/dist/ports/in-memory-queue.d.ts +24 -0
- package/dist/ports/in-memory-queue.d.ts.map +1 -0
- package/dist/ports/in-memory-queue.js +63 -0
- package/dist/ports/in-memory-queue.js.map +1 -0
- package/dist/ports/index.d.ts +27 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +6 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/job-scheduler.d.ts +42 -0
- package/dist/ports/job-scheduler.d.ts.map +1 -0
- package/dist/ports/job-scheduler.js +3 -0
- package/dist/ports/job-scheduler.js.map +1 -0
- package/dist/ports/locking.d.ts +43 -0
- package/dist/ports/locking.d.ts.map +1 -0
- package/dist/ports/locking.js +3 -0
- package/dist/ports/locking.js.map +1 -0
- package/dist/ports/logger.d.ts +65 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +3 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/notification.d.ts +71 -0
- package/dist/ports/notification.d.ts.map +1 -0
- package/dist/ports/notification.js +3 -0
- package/dist/ports/notification.js.map +1 -0
- package/dist/ports/progress-channel.d.ts +46 -0
- package/dist/ports/progress-channel.d.ts.map +1 -0
- package/dist/ports/progress-channel.js +6 -0
- package/dist/ports/progress-channel.js.map +1 -0
- package/dist/ports/queue.d.ts +21 -0
- package/dist/ports/queue.d.ts.map +1 -0
- package/dist/ports/queue.js +15 -0
- package/dist/ports/queue.js.map +1 -0
- package/dist/ports/relational-query.d.ts +37 -0
- package/dist/ports/relational-query.d.ts.map +1 -0
- package/dist/ports/relational-query.js +3 -0
- package/dist/ports/relational-query.js.map +1 -0
- package/dist/ports/repository-factory.d.ts +21 -0
- package/dist/ports/repository-factory.d.ts.map +1 -0
- package/dist/ports/repository-factory.js +4 -0
- package/dist/ports/repository-factory.js.map +1 -0
- package/dist/ports/repository.d.ts +73 -0
- package/dist/ports/repository.d.ts.map +1 -0
- package/dist/ports/repository.js +3 -0
- package/dist/ports/repository.js.map +1 -0
- package/dist/ports/schema-generator.d.ts +15 -0
- package/dist/ports/schema-generator.d.ts.map +1 -0
- package/dist/ports/schema-generator.js +4 -0
- package/dist/ports/schema-generator.js.map +1 -0
- package/dist/ports/search.d.ts +7 -0
- package/dist/ports/search.d.ts.map +1 -0
- package/dist/ports/search.js +3 -0
- package/dist/ports/search.js.map +1 -0
- package/dist/ports/types.d.ts +112 -0
- package/dist/ports/types.d.ts.map +1 -0
- package/dist/ports/types.js +26 -0
- package/dist/ports/types.js.map +1 -0
- package/dist/ports/workflow-store.d.ts +111 -0
- package/dist/ports/workflow-store.d.ts.map +1 -0
- package/dist/ports/workflow-store.js +5 -0
- package/dist/ports/workflow-store.js.map +1 -0
- package/dist/query/define-query-graph.d.ts +55 -0
- package/dist/query/define-query-graph.d.ts.map +1 -0
- package/dist/query/define-query-graph.js +59 -0
- package/dist/query/define-query-graph.js.map +1 -0
- package/dist/query/define-query.d.ts +79 -0
- package/dist/query/define-query.d.ts.map +1 -0
- package/dist/query/define-query.js +77 -0
- package/dist/query/define-query.js.map +1 -0
- package/dist/query/extend-query-graph.d.ts +36 -0
- package/dist/query/extend-query-graph.d.ts.map +1 -0
- package/dist/query/extend-query-graph.js +34 -0
- package/dist/query/extend-query-graph.js.map +1 -0
- package/dist/query/index.d.ts +181 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +288 -0
- package/dist/query/index.js.map +1 -0
- package/dist/service/define.d.ts +97 -0
- package/dist/service/define.d.ts.map +1 -0
- package/dist/service/define.js +45 -0
- package/dist/service/define.js.map +1 -0
- package/dist/service/index.d.ts +52 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +281 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/instantiate.d.ts +15 -0
- package/dist/service/instantiate.d.ts.map +1 -0
- package/dist/service/instantiate.js +143 -0
- package/dist/service/instantiate.js.map +1 -0
- package/dist/service/snapshot-repository.d.ts +31 -0
- package/dist/service/snapshot-repository.d.ts.map +1 -0
- package/dist/service/snapshot-repository.js +114 -0
- package/dist/service/snapshot-repository.js.map +1 -0
- package/dist/service/types.d.ts +39 -0
- package/dist/service/types.d.ts.map +1 -0
- package/dist/service/types.js +3 -0
- package/dist/service/types.js.map +1 -0
- package/dist/strict-mode/index.d.ts +42 -0
- package/dist/strict-mode/index.d.ts.map +1 -0
- package/dist/strict-mode/index.js +84 -0
- package/dist/strict-mode/index.js.map +1 -0
- package/dist/subscriber/index.d.ts +117 -0
- package/dist/subscriber/index.d.ts.map +1 -0
- package/dist/subscriber/index.js +76 -0
- package/dist/subscriber/index.js.map +1 -0
- package/dist/testing/relational-query-suite.d.ts +22 -0
- package/dist/testing/relational-query-suite.d.ts.map +1 -0
- package/dist/testing/relational-query-suite.js +233 -0
- package/dist/testing/relational-query-suite.js.map +1 -0
- package/dist/user/auto-routes.d.ts +32 -0
- package/dist/user/auto-routes.d.ts.map +1 -0
- package/dist/user/auto-routes.js +424 -0
- package/dist/user/auto-routes.js.map +1 -0
- package/dist/user/define-user.d.ts +54 -0
- package/dist/user/define-user.d.ts.map +1 -0
- package/dist/user/define-user.js +103 -0
- package/dist/user/define-user.js.map +1 -0
- package/dist/user/index.d.ts +7 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +5 -0
- package/dist/user/index.js.map +1 -0
- package/dist/user/models/user.d.ts +15 -0
- package/dist/user/models/user.d.ts.map +1 -0
- package/dist/user/models/user.js +16 -0
- package/dist/user/models/user.js.map +1 -0
- package/dist/user/user-module-service.d.ts +55 -0
- package/dist/user/user-module-service.d.ts.map +1 -0
- package/dist/user/user-module-service.js +100 -0
- package/dist/user/user-module-service.js.map +1 -0
- package/dist/workflows/ai-step.d.ts +2 -0
- package/dist/workflows/ai-step.d.ts.map +1 -0
- package/dist/workflows/ai-step.js +54 -0
- package/dist/workflows/ai-step.js.map +1 -0
- package/dist/workflows/create-step.d.ts +16 -0
- package/dist/workflows/create-step.d.ts.map +1 -0
- package/dist/workflows/create-step.js +194 -0
- package/dist/workflows/create-step.js.map +1 -0
- package/dist/workflows/create-workflow.d.ts +16 -0
- package/dist/workflows/create-workflow.d.ts.map +1 -0
- package/dist/workflows/create-workflow.js +21 -0
- package/dist/workflows/create-workflow.js.map +1 -0
- package/dist/workflows/define-workflow.d.ts +55 -0
- package/dist/workflows/define-workflow.d.ts.map +1 -0
- package/dist/workflows/define-workflow.js +72 -0
- package/dist/workflows/define-workflow.js.map +1 -0
- package/dist/workflows/emit-event-step.d.ts +17 -0
- package/dist/workflows/emit-event-step.d.ts.map +1 -0
- package/dist/workflows/emit-event-step.js +46 -0
- package/dist/workflows/emit-event-step.js.map +1 -0
- package/dist/workflows/for-each.d.ts +6 -0
- package/dist/workflows/for-each.d.ts.map +1 -0
- package/dist/workflows/for-each.js +79 -0
- package/dist/workflows/for-each.js.map +1 -0
- package/dist/workflows/index.d.ts +15 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +12 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/manager.d.ts +99 -0
- package/dist/workflows/manager.d.ts.map +1 -0
- package/dist/workflows/manager.js +450 -0
- package/dist/workflows/manager.js.map +1 -0
- package/dist/workflows/orphan-reaper.d.ts +50 -0
- package/dist/workflows/orphan-reaper.d.ts.map +1 -0
- package/dist/workflows/orphan-reaper.js +69 -0
- package/dist/workflows/orphan-reaper.js.map +1 -0
- package/dist/workflows/progress-helper.d.ts +20 -0
- package/dist/workflows/progress-helper.d.ts.map +1 -0
- package/dist/workflows/progress-helper.js +48 -0
- package/dist/workflows/progress-helper.js.map +1 -0
- package/dist/workflows/step.d.ts +103 -0
- package/dist/workflows/step.d.ts.map +1 -0
- package/dist/workflows/step.js +949 -0
- package/dist/workflows/step.js.map +1 -0
- package/dist/workflows/types.d.ts +215 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +9 -0
- package/dist/workflows/types.js.map +1 -0
- package/dist/workflows/yield.d.ts +12 -0
- package/dist/workflows/yield.d.ts.map +1 -0
- package/dist/workflows/yield.js +29 -0
- package/dist/workflows/yield.js.map +1 -0
- package/docs/00-overview.md +254 -0
- package/docs/01-getting-started.md +224 -0
- package/docs/02-models.md +163 -0
- package/docs/03-services.md +208 -0
- package/docs/04-users.md +165 -0
- package/docs/05-commands.md +501 -0
- package/docs/06-queries.md +342 -0
- package/docs/07-events.md +248 -0
- package/docs/08-links.md +182 -0
- package/docs/09-agents.md +142 -0
- package/docs/10-spa.md +327 -0
- package/docs/11-config.md +481 -0
- package/docs/12-constraints.md +183 -0
- package/docs/13-testing.md +345 -0
- package/docs/14-adapters.md +204 -0
- package/docs/15-hosts.md +163 -0
- package/docs/16-reference.md +274 -0
- package/docs/17-dashboard.md +619 -0
- package/docs/AGENT.md +501 -0
- package/package.json +49 -52
- package/.medusa/server/src/admin/index.js +0 -5493
- package/.medusa/server/src/admin/index.mjs +0 -5491
- package/.medusa/server/src/api/admin/companies/[id]/route.js +0 -39
- package/.medusa/server/src/api/admin/companies/middlewares.js +0 -41
- package/.medusa/server/src/api/admin/companies/route.js +0 -37
- package/.medusa/server/src/api/admin/companies/validators.js +0 -29
- package/.medusa/server/src/api/admin/employees/middlewares.js +0 -15
- package/.medusa/server/src/api/admin/employees/route.js +0 -21
- package/.medusa/server/src/api/middlewares.js +0 -9
- package/.medusa/server/src/index.js +0 -5
- package/.medusa/server/src/modules/company/index.js +0 -13
- package/.medusa/server/src/modules/company/migrations/Migration20260126141741.js +0 -26
- package/.medusa/server/src/modules/company/models/company.js +0 -24
- package/.medusa/server/src/modules/company/models/employee.js +0 -15
- package/.medusa/server/src/modules/company/models/index.js +0 -11
- package/.medusa/server/src/modules/company/service.js +0 -11
- package/.medusa/server/src/workflows/create-company.js +0 -10
- package/.medusa/server/src/workflows/delete-company.js +0 -10
- package/.medusa/server/src/workflows/steps/create-company.js +0 -16
- package/.medusa/server/src/workflows/steps/delete-company.js +0 -30
- package/.medusa/server/src/workflows/steps/update-company.js +0 -30
- package/.medusa/server/src/workflows/update-company.js +0 -10
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
# Dashboard — defineSpa(), definePage() & defineForm()
|
|
2
|
+
|
|
3
|
+
## Philosophy
|
|
4
|
+
|
|
5
|
+
The backend is fast because it's constrained: `defineModel()` + `defineService()` leave no room for error. The dashboard follows the same principle: **declarative specs, not React pages.**
|
|
6
|
+
|
|
7
|
+
Three primitives:
|
|
8
|
+
|
|
9
|
+
- `defineSpa()` — SPA configuration (navigation, branding, settings)
|
|
10
|
+
- `definePage()` — display page (listing, detail, dashboard, anything)
|
|
11
|
+
- `defineForm()` — form overlay (create, edit)
|
|
12
|
+
|
|
13
|
+
Pages are composed of **blocks** — reusable components provided by the framework or created by the developer. Blocks are standard React components. The framework provides ~10 built-in blocks. Developers can add their own.
|
|
14
|
+
|
|
15
|
+
**The AI never writes React.** It writes `defineSpa()`, `definePage()` and `defineForm()` specs using a finite vocabulary of blocks. The result is consistent, error-free, and maintainable.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## SPA — Auto-detected from filesystem
|
|
20
|
+
|
|
21
|
+
SPAs are auto-detected from `src/spa/{name}/`. Everything is auto-discovered:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
src/spa/admin/
|
|
25
|
+
├── config.ts # defineSpa() — navigation, title, branding
|
|
26
|
+
├── pages/
|
|
27
|
+
│ ├── page.tsx # → /admin/ (React page, for custom home)
|
|
28
|
+
│ ├── products/
|
|
29
|
+
│ │ └── page.ts # → /admin/products (listing)
|
|
30
|
+
│ ├── products/[id]/
|
|
31
|
+
│ │ └── page.ts # → /admin/products/:id (detail)
|
|
32
|
+
│ │ └── edit/
|
|
33
|
+
│ │ └── page.ts # → /admin/products/:id/edit (form overlay)
|
|
34
|
+
│ ├── products/create/
|
|
35
|
+
│ │ └── page.ts # → /admin/products/create (form overlay)
|
|
36
|
+
│ └── dashboard/
|
|
37
|
+
│ └── page.ts # → /admin/dashboard
|
|
38
|
+
├── blocks/ # Custom blocks (auto-discovered)
|
|
39
|
+
│ ├── inventory-matrix.tsx
|
|
40
|
+
│ └── pricing-editor.tsx
|
|
41
|
+
└── components/ # Local React components (not blocks)
|
|
42
|
+
└── product-card.tsx
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Auto-discovered:**
|
|
46
|
+
- `config.ts` → SPA configuration (navigation, branding)
|
|
47
|
+
- `pages/` → file-based routing (`.ts` for specs, `.tsx` for React pages)
|
|
48
|
+
- `blocks/` → custom blocks (kebab-case filename → PascalCase type)
|
|
49
|
+
|
|
50
|
+
**Route = filesystem path.** No route declaration in `definePage()`.
|
|
51
|
+
|
|
52
|
+
**`.ts` not `.tsx`** — pages export `definePage()` or `defineForm()` specs (pure data), not JSX. Only files in `blocks/` and `components/` are `.tsx`.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## defineSpa()
|
|
57
|
+
|
|
58
|
+
Defines the SPA's configuration: navigation, branding, settings. Auto-discovered from `src/spa/{name}/config.ts`.
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
// src/spa/admin/config.ts
|
|
62
|
+
import { defineSpa } from '@mantajs/dashboard'
|
|
63
|
+
|
|
64
|
+
export default defineSpa({
|
|
65
|
+
title: 'Commerce Admin',
|
|
66
|
+
logo: '/logo.svg',
|
|
67
|
+
favicon: '/favicon.ico',
|
|
68
|
+
primaryColor: '#6366f1',
|
|
69
|
+
|
|
70
|
+
navigation: [
|
|
71
|
+
{ icon: 'LayoutGrid', label: 'Dashboard', to: '/dashboard' },
|
|
72
|
+
{ icon: 'Tag', label: 'Products', to: '/products', items: [
|
|
73
|
+
{ label: 'Categories', to: '/categories' },
|
|
74
|
+
{ label: 'Collections', to: '/collections' },
|
|
75
|
+
]},
|
|
76
|
+
{ icon: 'ShoppingCart', label: 'Orders', to: '/orders' },
|
|
77
|
+
{ icon: 'Users', label: 'Customers', to: '/customers', items: [
|
|
78
|
+
{ label: 'Groups', to: '/customer-groups' },
|
|
79
|
+
]},
|
|
80
|
+
],
|
|
81
|
+
|
|
82
|
+
settings: [
|
|
83
|
+
{ icon: 'Store', label: 'Store Details', to: '/settings/store' },
|
|
84
|
+
{ icon: 'Users', label: 'Team', to: '/settings/team' },
|
|
85
|
+
{ icon: 'Key', label: 'API Keys', to: '/settings/api-keys' },
|
|
86
|
+
],
|
|
87
|
+
|
|
88
|
+
defaultRedirect: '/dashboard',
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Navigation
|
|
93
|
+
|
|
94
|
+
| Property | Type | Description |
|
|
95
|
+
|----------|------|-------------|
|
|
96
|
+
| `icon` | `string` | Lucide icon name (`'Users'`, `'Tag'`, `'ShoppingCart'`, etc.) |
|
|
97
|
+
| `label` | `string` | Display label in the sidebar |
|
|
98
|
+
| `to` | `string` | Route path |
|
|
99
|
+
| `items` | `Array<{ label, to }>` | Nested sub-items (one level) |
|
|
100
|
+
|
|
101
|
+
### Branding
|
|
102
|
+
|
|
103
|
+
| Property | Type | Description |
|
|
104
|
+
|----------|------|-------------|
|
|
105
|
+
| `title` | `string` | App name in sidebar header |
|
|
106
|
+
| `logo` | `string` | Path to logo image |
|
|
107
|
+
| `favicon` | `string` | Path to favicon |
|
|
108
|
+
| `primaryColor` | `string` | Brand color (CSS value) |
|
|
109
|
+
|
|
110
|
+
### Settings
|
|
111
|
+
|
|
112
|
+
`settings` defines a separate navigation section at the bottom of the sidebar (gear icon). Same interface as `navigation` items.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## definePage()
|
|
117
|
+
|
|
118
|
+
A page is a composition of blocks with optional layout.
|
|
119
|
+
|
|
120
|
+
### Listing page
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// src/spa/admin/pages/products/page.ts
|
|
124
|
+
export default definePage({
|
|
125
|
+
header: { title: 'Products', actions: ['create'] },
|
|
126
|
+
main: [
|
|
127
|
+
{
|
|
128
|
+
type: 'DataTable',
|
|
129
|
+
query: {
|
|
130
|
+
graph: {
|
|
131
|
+
entity: 'product',
|
|
132
|
+
fields: ['title', 'status', 'price', 'created_at'],
|
|
133
|
+
pagination: { limit: 20 },
|
|
134
|
+
sort: { field: 'created_at', order: 'desc' },
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
columns: [
|
|
138
|
+
{ key: 'title', label: 'Product' },
|
|
139
|
+
{ key: 'price', label: 'Price', format: 'currency' },
|
|
140
|
+
{ key: 'status', label: 'Status', format: 'badge' },
|
|
141
|
+
{ key: 'created_at', label: 'Created', format: 'date' },
|
|
142
|
+
],
|
|
143
|
+
searchable: ['title'],
|
|
144
|
+
navigateTo: '/admin/products/:id',
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
})
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Detail page
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
// src/spa/admin/pages/products/[id]/page.ts
|
|
154
|
+
export default definePage({
|
|
155
|
+
header: { titleField: 'title', statusField: 'status', actions: ['edit', 'delete'] },
|
|
156
|
+
main: [
|
|
157
|
+
{
|
|
158
|
+
type: 'InfoCard',
|
|
159
|
+
title: 'General',
|
|
160
|
+
query: {
|
|
161
|
+
graph: {
|
|
162
|
+
entity: 'product',
|
|
163
|
+
fields: ['title', 'description', 'handle', 'price'],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'RelationTable',
|
|
169
|
+
title: 'Variants',
|
|
170
|
+
query: {
|
|
171
|
+
graph: {
|
|
172
|
+
entity: 'product',
|
|
173
|
+
relations: ['variant'],
|
|
174
|
+
fields: ['variant.sku', 'variant.price', 'variant.stock'],
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
columns: [
|
|
178
|
+
{ key: 'sku', label: 'SKU' },
|
|
179
|
+
{ key: 'price', label: 'Price', format: 'currency' },
|
|
180
|
+
{ key: 'stock', label: 'Stock', format: 'number' },
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'MediaCard',
|
|
185
|
+
query: {
|
|
186
|
+
graph: {
|
|
187
|
+
entity: 'product',
|
|
188
|
+
relations: ['image'],
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
sidebar: [
|
|
194
|
+
{
|
|
195
|
+
type: 'InfoCard',
|
|
196
|
+
title: 'Status',
|
|
197
|
+
query: {
|
|
198
|
+
graph: {
|
|
199
|
+
entity: 'product',
|
|
200
|
+
fields: ['status'],
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
type: 'InfoCard',
|
|
206
|
+
title: 'Dates',
|
|
207
|
+
query: {
|
|
208
|
+
graph: {
|
|
209
|
+
entity: 'product',
|
|
210
|
+
fields: ['created_at', 'updated_at'],
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
})
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Dashboard page (multiple entities, no shared entity)
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
// src/spa/admin/pages/dashboard/page.ts
|
|
222
|
+
export default definePage({
|
|
223
|
+
header: { title: 'Dashboard' },
|
|
224
|
+
main: [
|
|
225
|
+
{
|
|
226
|
+
type: 'StatsCard',
|
|
227
|
+
query: { name: 'dashboard-stats', input: { period: 'month' } },
|
|
228
|
+
metrics: [
|
|
229
|
+
{ key: 'orders_count', label: 'Orders', format: 'number' },
|
|
230
|
+
{ key: 'revenue', label: 'Revenue', format: 'currency' },
|
|
231
|
+
{ key: 'new_customers', label: 'New Customers', format: 'number' },
|
|
232
|
+
],
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
type: 'DataTable',
|
|
236
|
+
title: 'Recent Orders',
|
|
237
|
+
query: {
|
|
238
|
+
graph: {
|
|
239
|
+
entity: 'order',
|
|
240
|
+
fields: ['number', 'total', 'status', 'created_at'],
|
|
241
|
+
pagination: { limit: 5 },
|
|
242
|
+
sort: { field: 'created_at', order: 'desc' },
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
columns: [
|
|
246
|
+
{ key: 'number', label: 'Order' },
|
|
247
|
+
{ key: 'total', label: 'Total', format: 'currency' },
|
|
248
|
+
{ key: 'status', label: 'Status', format: 'badge' },
|
|
249
|
+
],
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
})
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Layout rules
|
|
256
|
+
|
|
257
|
+
- **`sidebar` present** → two-column layout (main + sidebar)
|
|
258
|
+
- **`sidebar` absent** → single-column layout
|
|
259
|
+
- **No layout declaration needed** — inferred from structure
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## defineForm()
|
|
264
|
+
|
|
265
|
+
Forms render as overlays (FocusModal by default) on top of the parent route.
|
|
266
|
+
|
|
267
|
+
### Simple create form
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
// src/spa/admin/pages/products/create/page.ts
|
|
271
|
+
export default defineForm({
|
|
272
|
+
title: 'Create Product',
|
|
273
|
+
command: 'create-product',
|
|
274
|
+
fields: [
|
|
275
|
+
{ key: 'title', label: 'Title', type: 'text', required: true },
|
|
276
|
+
{ key: 'description', label: 'Description', type: 'textarea' },
|
|
277
|
+
{ key: 'handle', label: 'Handle', type: 'text' },
|
|
278
|
+
{ key: 'price', label: 'Price', type: 'currency' },
|
|
279
|
+
{ key: 'status', label: 'Status', type: 'select', options: ['draft', 'active', 'archived'] },
|
|
280
|
+
],
|
|
281
|
+
})
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Edit form
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
// src/spa/admin/pages/products/[id]/edit/page.ts
|
|
288
|
+
export default defineForm({
|
|
289
|
+
title: 'Edit Product',
|
|
290
|
+
command: 'update-product',
|
|
291
|
+
query: {
|
|
292
|
+
graph: {
|
|
293
|
+
entity: 'product',
|
|
294
|
+
fields: ['title', 'description', 'handle', 'price', 'status'],
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
fields: [
|
|
298
|
+
{ key: 'title', label: 'Title', type: 'text', required: true },
|
|
299
|
+
{ key: 'description', label: 'Description', type: 'textarea' },
|
|
300
|
+
{ key: 'handle', label: 'Handle', type: 'text' },
|
|
301
|
+
{ key: 'price', label: 'Price', type: 'currency' },
|
|
302
|
+
{ key: 'status', label: 'Status', type: 'select', options: ['draft', 'active', 'archived'] },
|
|
303
|
+
],
|
|
304
|
+
})
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
The framework detects edit mode from the route (`:id` param) and pre-fills the form with data from the `query`.
|
|
308
|
+
|
|
309
|
+
### Multi-step form
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
// src/spa/admin/pages/products/create/page.ts
|
|
313
|
+
export default defineForm({
|
|
314
|
+
title: 'Create Product',
|
|
315
|
+
command: 'create-product',
|
|
316
|
+
steps: [
|
|
317
|
+
{
|
|
318
|
+
name: 'General',
|
|
319
|
+
fields: [
|
|
320
|
+
{ key: 'title', label: 'Title', type: 'text', required: true },
|
|
321
|
+
{ key: 'description', label: 'Description', type: 'textarea' },
|
|
322
|
+
{ key: 'price', label: 'Price', type: 'currency' },
|
|
323
|
+
],
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: 'Media',
|
|
327
|
+
blocks: [
|
|
328
|
+
{ type: 'MediaUpload', relation: 'images', multiple: true },
|
|
329
|
+
],
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
name: 'Inventory',
|
|
333
|
+
blocks: [
|
|
334
|
+
{ type: 'InventoryMatrix', warehouses: ['paris', 'lyon'] },
|
|
335
|
+
],
|
|
336
|
+
},
|
|
337
|
+
],
|
|
338
|
+
})
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Each step contains either `fields` (auto-rendered form fields) or `blocks` (custom block components).
|
|
342
|
+
|
|
343
|
+
### Form field types
|
|
344
|
+
|
|
345
|
+
| Type | Renders as | Deduced from model |
|
|
346
|
+
|------|-----------|-------------------|
|
|
347
|
+
| `text` | Input | `field.text()` |
|
|
348
|
+
| `textarea` | Textarea | `field.text()` with long content |
|
|
349
|
+
| `number` | Number input | `field.number()` |
|
|
350
|
+
| `currency` | Currency input | `field.number()` with currency context |
|
|
351
|
+
| `select` | Select dropdown | `field.enum([...])` |
|
|
352
|
+
| `boolean` | Toggle switch | `field.boolean()` |
|
|
353
|
+
| `date` | Date picker | `field.dateTime()` |
|
|
354
|
+
| `entity-select` | EntitySelect modal | From `defineLink()` |
|
|
355
|
+
| `media` | File upload | Relation to file entity |
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## Query in blocks
|
|
360
|
+
|
|
361
|
+
Every block that needs data declares a `query` prop. Two modes, matching the backend exactly:
|
|
362
|
+
|
|
363
|
+
### Graph query — `useGraphQuery()` under the hood
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
query: {
|
|
367
|
+
graph: {
|
|
368
|
+
entity: 'product',
|
|
369
|
+
fields: ['title', 'status', 'price'],
|
|
370
|
+
filters: { status: 'active' },
|
|
371
|
+
relations: ['variant', 'image'],
|
|
372
|
+
pagination: { limit: 20, offset: 0 },
|
|
373
|
+
sort: { field: 'created_at', order: 'desc' },
|
|
374
|
+
},
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
This is the exact same contract as `query.graph()` in the backend and `useGraphQuery()` in `@mantajs/sdk`. The block calls `useGraphQuery()` internally with this config.
|
|
379
|
+
|
|
380
|
+
**Requires** `defineQueryGraph()` in the SPA's context. If the context has `defineQueryGraph('*')`, all entities are available. If scoped, only listed entities work. If no `defineQueryGraph` exists, graph queries are not available — use named queries instead.
|
|
381
|
+
|
|
382
|
+
### Named query — `useQuery()` under the hood
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
query: {
|
|
386
|
+
name: 'dashboard-stats',
|
|
387
|
+
input: { period: 'month' },
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
Calls the `defineQuery()` endpoint. The input matches the Zod schema defined in the backend.
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Query consolidation (automatic)
|
|
396
|
+
|
|
397
|
+
The framework reads all `query` props from all blocks on a page. When multiple blocks query the same entity, the framework consolidates them into a single prefetch:
|
|
398
|
+
|
|
399
|
+
```
|
|
400
|
+
Page: products/[id]
|
|
401
|
+
|
|
402
|
+
Block 1 (InfoCard): graph: { entity: 'product', fields: ['title', 'description'] }
|
|
403
|
+
Block 2 (RelationTable): graph: { entity: 'product', relations: ['variant'] }
|
|
404
|
+
Block 3 (MediaCard): graph: { entity: 'product', relations: ['image'] }
|
|
405
|
+
Block 4 (InfoCard): graph: { entity: 'product', fields: ['status', 'created_at'] }
|
|
406
|
+
|
|
407
|
+
Framework consolidates → 1 prefetch:
|
|
408
|
+
entity: 'product'
|
|
409
|
+
fields: ['title', 'description', 'status', 'created_at']
|
|
410
|
+
relations: ['variant', 'image']
|
|
411
|
+
|
|
412
|
+
Each block calls useGraphQuery() → TanStack Query cache hit → no extra request.
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**This is transparent.** Blocks don't know about the consolidation. They call `useGraphQuery()` with their own query. The framework pre-populated the cache. If a block queries a different entity, it gets its own request — no consolidation attempted.
|
|
416
|
+
|
|
417
|
+
**Consolidation is a performance optimization, not a requirement.** If a block does its own fetch internally (autonomous block), it works — just with an extra request.
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Blocks
|
|
422
|
+
|
|
423
|
+
Blocks are the building blocks of pages. Three categories:
|
|
424
|
+
|
|
425
|
+
### 1. Framework blocks (built-in)
|
|
426
|
+
|
|
427
|
+
Provided by `@mantajs/dashboard`. Generic, configurable via props. They receive `query` as a prop and call `useGraphQuery()` or `useQuery()` internally.
|
|
428
|
+
|
|
429
|
+
| Block | Purpose |
|
|
430
|
+
|-------|---------|
|
|
431
|
+
| `DataTable` | List with columns, search, sort, filter, pagination, row actions |
|
|
432
|
+
| `InfoCard` | Key-value display (title + fields) |
|
|
433
|
+
| `RelationTable` | Related entities table |
|
|
434
|
+
| `RelationList` | Related entities as a list (display variant) |
|
|
435
|
+
| `MediaCard` | Image/file gallery |
|
|
436
|
+
| `StatsCard` | Metric cards |
|
|
437
|
+
| `ActivityCard` | Event timeline |
|
|
438
|
+
| `JsonCard` | Raw JSON display |
|
|
439
|
+
| `TreeList` | Hierarchical list |
|
|
440
|
+
| `PageHeader` | Title, status badge, action buttons (used via `header` shortcut) |
|
|
441
|
+
|
|
442
|
+
### 2. Autonomous blocks (custom, self-contained)
|
|
443
|
+
|
|
444
|
+
A developer creates a standard React component. It handles its own data fetching, state, and rendering. No framework contract to follow.
|
|
445
|
+
|
|
446
|
+
```tsx
|
|
447
|
+
// src/spa/admin/blocks/product-quick-stats.tsx
|
|
448
|
+
import { useGraphQuery } from '@mantajs/sdk'
|
|
449
|
+
import { useParams } from 'react-router-dom'
|
|
450
|
+
|
|
451
|
+
export default function ProductQuickStats() {
|
|
452
|
+
const { id } = useParams()
|
|
453
|
+
const { data } = useGraphQuery({
|
|
454
|
+
entity: 'product',
|
|
455
|
+
filters: { id },
|
|
456
|
+
relations: ['variant', 'order'],
|
|
457
|
+
})
|
|
458
|
+
|
|
459
|
+
const product = data?.[0]
|
|
460
|
+
if (!product) return null
|
|
461
|
+
|
|
462
|
+
return (
|
|
463
|
+
<div>
|
|
464
|
+
<span>{product.variant?.length ?? 0} variants</span>
|
|
465
|
+
<span>{product.order?.length ?? 0} orders</span>
|
|
466
|
+
</div>
|
|
467
|
+
)
|
|
468
|
+
}
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Usage in `definePage()`:
|
|
472
|
+
|
|
473
|
+
```typescript
|
|
474
|
+
main: [
|
|
475
|
+
{ type: 'ProductQuickStats' }, // no query prop — it fetches its own data
|
|
476
|
+
]
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
**Trade-off:** Does not benefit from query consolidation. Makes its own request.
|
|
480
|
+
|
|
481
|
+
### 3. Custom generic blocks (reusable, optimized)
|
|
482
|
+
|
|
483
|
+
A developer creates a reusable block that accepts `query` as a prop — same pattern as framework blocks. Benefits from query consolidation.
|
|
484
|
+
|
|
485
|
+
```tsx
|
|
486
|
+
// src/spa/admin/blocks/inventory-matrix.tsx
|
|
487
|
+
import { useGraphQuery } from '@mantajs/sdk'
|
|
488
|
+
|
|
489
|
+
interface InventoryMatrixProps {
|
|
490
|
+
query: Parameters<typeof useGraphQuery>[0]
|
|
491
|
+
warehouses?: string[]
|
|
492
|
+
editable?: boolean
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
export default function InventoryMatrix({ query, warehouses = ['default'], editable = true }: InventoryMatrixProps) {
|
|
496
|
+
const { data } = useGraphQuery(query)
|
|
497
|
+
// ... render matrix from data
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
Usage in `definePage()`:
|
|
502
|
+
|
|
503
|
+
```typescript
|
|
504
|
+
main: [
|
|
505
|
+
{
|
|
506
|
+
type: 'InventoryMatrix',
|
|
507
|
+
query: { graph: { entity: 'product', relations: ['variant'] } },
|
|
508
|
+
warehouses: ['paris', 'lyon'],
|
|
509
|
+
},
|
|
510
|
+
]
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
**Benefits from consolidation** because the framework sees the `query` prop in the spec and includes it in the prefetch.
|
|
514
|
+
|
|
515
|
+
### Block resolution
|
|
516
|
+
|
|
517
|
+
| Priority | Source |
|
|
518
|
+
|----------|--------|
|
|
519
|
+
| 1 | `src/spa/{name}/blocks/` (app blocks — overrides framework blocks if same name) |
|
|
520
|
+
| 2 | `@mantajs/dashboard` built-in blocks |
|
|
521
|
+
|
|
522
|
+
A block in `blocks/info-card.tsx` overrides the framework's `InfoCard`. All pages using `{ type: 'InfoCard' }` will use the app's version.
|
|
523
|
+
|
|
524
|
+
### Block discovery
|
|
525
|
+
|
|
526
|
+
Blocks in `src/spa/{name}/blocks/` are auto-discovered by filename:
|
|
527
|
+
|
|
528
|
+
```
|
|
529
|
+
blocks/
|
|
530
|
+
inventory-matrix.tsx → type: 'InventoryMatrix'
|
|
531
|
+
pricing-editor.tsx → type: 'PricingEditor'
|
|
532
|
+
info-card.tsx → type: 'InfoCard' (overrides framework)
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
Filename is kebab-case, block type is PascalCase. The `export default` must be a React component.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## Header shortcut
|
|
540
|
+
|
|
541
|
+
`header` is a shortcut — not a block in `main`. It renders a `PageHeader` at the top of the page.
|
|
542
|
+
|
|
543
|
+
```typescript
|
|
544
|
+
// Simple listing
|
|
545
|
+
header: { title: 'Products', actions: ['create'] }
|
|
546
|
+
|
|
547
|
+
// Detail page with dynamic title
|
|
548
|
+
header: { titleField: 'title', statusField: 'status', actions: ['edit', 'delete'] }
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
`actions` are predefined behaviors:
|
|
552
|
+
|
|
553
|
+
| Action | Behavior |
|
|
554
|
+
|--------|----------|
|
|
555
|
+
| `'create'` | Navigate to `./create` |
|
|
556
|
+
| `'edit'` | Navigate to `./edit` |
|
|
557
|
+
| `'delete'` | Confirm dialog → execute `delete-{entity}` command |
|
|
558
|
+
|
|
559
|
+
For custom actions:
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
header: {
|
|
563
|
+
title: 'Products',
|
|
564
|
+
actions: [
|
|
565
|
+
'create',
|
|
566
|
+
{ label: 'Export', command: 'export-products' },
|
|
567
|
+
{ label: 'Import', to: '/admin/products/import' },
|
|
568
|
+
],
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## Typing
|
|
575
|
+
|
|
576
|
+
The framework generates types from backend definitions. In `definePage()` and `defineForm()`:
|
|
577
|
+
|
|
578
|
+
- **Graph queries** — entity names, field names, and relation names are autocompleted based on the `defineQueryGraph()` access rules of the SPA's context
|
|
579
|
+
- **Named queries** — query names and input schemas are autocompleted based on `defineQuery()` definitions in the SPA's context
|
|
580
|
+
- **Commands** — command names in `defineForm()` and header actions are autocompleted based on `defineCommand()` definitions
|
|
581
|
+
- **Block types** — autocompleted from framework blocks + discovered custom blocks
|
|
582
|
+
|
|
583
|
+
If the context has `defineQueryGraph('*')`, all entities and fields are available. If scoped (`defineQueryGraph({ product: true })`), only allowed entities appear. If no `defineQueryGraph`, graph queries are not available — only named queries.
|
|
584
|
+
|
|
585
|
+
```typescript
|
|
586
|
+
// ✅ TypeScript OK — 'product' is allowed in admin context
|
|
587
|
+
query: { graph: { entity: 'product', fields: ['title', 'status'] } }
|
|
588
|
+
|
|
589
|
+
// ❌ TypeScript error — 'banana' is not a field of 'product'
|
|
590
|
+
query: { graph: { entity: 'product', fields: ['banana'] } }
|
|
591
|
+
|
|
592
|
+
// ❌ TypeScript error — 'secret-data' query does not exist in admin context
|
|
593
|
+
query: { name: 'secret-data' }
|
|
594
|
+
|
|
595
|
+
// ❌ TypeScript error — graph queries not available (no defineQueryGraph in this context)
|
|
596
|
+
query: { graph: { entity: 'product' } }
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
## Summary
|
|
602
|
+
|
|
603
|
+
| Primitive | Purpose | File | Contains React? |
|
|
604
|
+
|-----------|---------|------|----------------|
|
|
605
|
+
| `defineSpa()` | SPA config (navigation, branding) | `config.ts` | No |
|
|
606
|
+
| `definePage()` | Display page (listing, detail, dashboard) | `pages/**/page.ts` | No |
|
|
607
|
+
| `defineForm()` | Form overlay (create, edit) | `pages/**/page.ts` | No |
|
|
608
|
+
| Custom block | Reusable UI component | `blocks/*.tsx` | Yes |
|
|
609
|
+
|
|
610
|
+
| Concept | Rule |
|
|
611
|
+
|---------|------|
|
|
612
|
+
| SPA config | `src/spa/{name}/config.ts` — auto-discovered |
|
|
613
|
+
| Route | Filesystem path (no declaration) |
|
|
614
|
+
| Layout | Inferred: `sidebar` present → two-column, absent → single-column |
|
|
615
|
+
| Form display | FocusModal by default |
|
|
616
|
+
| Data fetching | Each block owns its query (prop or internal) |
|
|
617
|
+
| Query consolidation | Automatic — framework prefetches, blocks get cache hits |
|
|
618
|
+
| Block override | Same filename in `blocks/` → overrides framework block |
|
|
619
|
+
| Block discovery | `blocks/` folder, auto-discovered, kebab-case filename → PascalCase type |
|