@rangka/core 0.0.1
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/.claude/skills/extend-core/SKILL.md +133 -0
- package/.turbo/turbo-build.log +4 -0
- package/CLAUDE.md +180 -0
- package/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/__tests__/coerce.test.d.ts +2 -0
- package/dist/__tests__/coerce.test.d.ts.map +1 -0
- package/dist/__tests__/coerce.test.js +121 -0
- package/dist/__tests__/coerce.test.js.map +1 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +99 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +3 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +21 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +7 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/widgets.test.d.ts +2 -0
- package/dist/__tests__/widgets.test.d.ts.map +1 -0
- package/dist/__tests__/widgets.test.js +171 -0
- package/dist/__tests__/widgets.test.js.map +1 -0
- package/dist/api/__tests__/handlers.test.d.ts +2 -0
- package/dist/api/__tests__/handlers.test.d.ts.map +1 -0
- package/dist/api/__tests__/handlers.test.js +349 -0
- package/dist/api/__tests__/handlers.test.js.map +1 -0
- package/dist/api/__tests__/include-resolver.test.d.ts +2 -0
- package/dist/api/__tests__/include-resolver.test.d.ts.map +1 -0
- package/dist/api/__tests__/include-resolver.test.js +338 -0
- package/dist/api/__tests__/include-resolver.test.js.map +1 -0
- package/dist/api/__tests__/middleware.test.d.ts +2 -0
- package/dist/api/__tests__/middleware.test.d.ts.map +1 -0
- package/dist/api/__tests__/middleware.test.js +83 -0
- package/dist/api/__tests__/middleware.test.js.map +1 -0
- package/dist/api/__tests__/openapi-schema.test.d.ts +2 -0
- package/dist/api/__tests__/openapi-schema.test.d.ts.map +1 -0
- package/dist/api/__tests__/openapi-schema.test.js +184 -0
- package/dist/api/__tests__/openapi-schema.test.js.map +1 -0
- package/dist/api/__tests__/query-parser.test.d.ts +2 -0
- package/dist/api/__tests__/query-parser.test.d.ts.map +1 -0
- package/dist/api/__tests__/query-parser.test.js +239 -0
- package/dist/api/__tests__/query-parser.test.js.map +1 -0
- package/dist/api/__tests__/route-generator.test.d.ts +2 -0
- package/dist/api/__tests__/route-generator.test.d.ts.map +1 -0
- package/dist/api/__tests__/route-generator.test.js +120 -0
- package/dist/api/__tests__/route-generator.test.js.map +1 -0
- package/dist/api/__tests__/server.test.d.ts +2 -0
- package/dist/api/__tests__/server.test.d.ts.map +1 -0
- package/dist/api/__tests__/server.test.js +62 -0
- package/dist/api/__tests__/server.test.js.map +1 -0
- package/dist/api/__tests__/swagger.test.d.ts +2 -0
- package/dist/api/__tests__/swagger.test.d.ts.map +1 -0
- package/dist/api/__tests__/swagger.test.js +144 -0
- package/dist/api/__tests__/swagger.test.js.map +1 -0
- package/dist/api/handlers.d.ts +23 -0
- package/dist/api/handlers.d.ts.map +1 -0
- package/dist/api/handlers.js +182 -0
- package/dist/api/handlers.js.map +1 -0
- package/dist/api/include-resolver.d.ts +6 -0
- package/dist/api/include-resolver.d.ts.map +1 -0
- package/dist/api/include-resolver.js +13 -0
- package/dist/api/include-resolver.js.map +1 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +4 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/meta-handler.d.ts +19 -0
- package/dist/api/meta-handler.d.ts.map +1 -0
- package/dist/api/meta-handler.js +188 -0
- package/dist/api/meta-handler.js.map +1 -0
- package/dist/api/openapi-schema.d.ts +25 -0
- package/dist/api/openapi-schema.d.ts.map +1 -0
- package/dist/api/openapi-schema.js +77 -0
- package/dist/api/openapi-schema.js.map +1 -0
- package/dist/api/query-parser.d.ts +81 -0
- package/dist/api/query-parser.d.ts.map +1 -0
- package/dist/api/query-parser.js +232 -0
- package/dist/api/query-parser.js.map +1 -0
- package/dist/api/route-generator.d.ts +161 -0
- package/dist/api/route-generator.d.ts.map +1 -0
- package/dist/api/route-generator.js +315 -0
- package/dist/api/route-generator.js.map +1 -0
- package/dist/api/server.d.ts +8 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +128 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +20 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/audit/__tests__/audit.test.d.ts +2 -0
- package/dist/audit/__tests__/audit.test.d.ts.map +1 -0
- package/dist/audit/__tests__/audit.test.js +127 -0
- package/dist/audit/__tests__/audit.test.js.map +1 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +3 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/record.d.ts +4 -0
- package/dist/audit/record.d.ts.map +1 -0
- package/dist/audit/record.js +52 -0
- package/dist/audit/record.js.map +1 -0
- package/dist/audit/tables.d.ts +3 -0
- package/dist/audit/tables.d.ts.map +1 -0
- package/dist/audit/tables.js +46 -0
- package/dist/audit/tables.js.map +1 -0
- package/dist/audit/types.d.ts +27 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +2 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/auth/__tests__/core-module.test.d.ts +2 -0
- package/dist/auth/__tests__/core-module.test.d.ts.map +1 -0
- package/dist/auth/__tests__/core-module.test.js +49 -0
- package/dist/auth/__tests__/core-module.test.js.map +1 -0
- package/dist/auth/__tests__/debug.test.d.ts +2 -0
- package/dist/auth/__tests__/debug.test.d.ts.map +1 -0
- package/dist/auth/__tests__/debug.test.js +42 -0
- package/dist/auth/__tests__/debug.test.js.map +1 -0
- package/dist/auth/__tests__/field-permissions.test.d.ts +2 -0
- package/dist/auth/__tests__/field-permissions.test.d.ts.map +1 -0
- package/dist/auth/__tests__/field-permissions.test.js +213 -0
- package/dist/auth/__tests__/field-permissions.test.js.map +1 -0
- package/dist/auth/__tests__/integration.test.d.ts +2 -0
- package/dist/auth/__tests__/integration.test.d.ts.map +1 -0
- package/dist/auth/__tests__/integration.test.js +186 -0
- package/dist/auth/__tests__/integration.test.js.map +1 -0
- package/dist/auth/__tests__/meta-boot.test.d.ts +2 -0
- package/dist/auth/__tests__/meta-boot.test.d.ts.map +1 -0
- package/dist/auth/__tests__/meta-boot.test.js +459 -0
- package/dist/auth/__tests__/meta-boot.test.js.map +1 -0
- package/dist/auth/__tests__/model-permissions.test.d.ts +2 -0
- package/dist/auth/__tests__/model-permissions.test.d.ts.map +1 -0
- package/dist/auth/__tests__/model-permissions.test.js +171 -0
- package/dist/auth/__tests__/model-permissions.test.js.map +1 -0
- package/dist/auth/__tests__/password.test.d.ts +2 -0
- package/dist/auth/__tests__/password.test.d.ts.map +1 -0
- package/dist/auth/__tests__/password.test.js +25 -0
- package/dist/auth/__tests__/password.test.js.map +1 -0
- package/dist/auth/__tests__/permission-registry.test.d.ts +2 -0
- package/dist/auth/__tests__/permission-registry.test.d.ts.map +1 -0
- package/dist/auth/__tests__/permission-registry.test.js +225 -0
- package/dist/auth/__tests__/permission-registry.test.js.map +1 -0
- package/dist/auth/__tests__/scope-hook.test.d.ts +2 -0
- package/dist/auth/__tests__/scope-hook.test.d.ts.map +1 -0
- package/dist/auth/__tests__/scope-hook.test.js +429 -0
- package/dist/auth/__tests__/scope-hook.test.js.map +1 -0
- package/dist/auth/__tests__/scope-registry.test.d.ts +2 -0
- package/dist/auth/__tests__/scope-registry.test.d.ts.map +1 -0
- package/dist/auth/__tests__/scope-registry.test.js +261 -0
- package/dist/auth/__tests__/scope-registry.test.js.map +1 -0
- package/dist/auth/__tests__/scopes.test.d.ts +2 -0
- package/dist/auth/__tests__/scopes.test.d.ts.map +1 -0
- package/dist/auth/__tests__/scopes.test.js +57 -0
- package/dist/auth/__tests__/scopes.test.js.map +1 -0
- package/dist/auth/__tests__/session.test.d.ts +2 -0
- package/dist/auth/__tests__/session.test.d.ts.map +1 -0
- package/dist/auth/__tests__/session.test.js +199 -0
- package/dist/auth/__tests__/session.test.js.map +1 -0
- package/dist/auth/core-models.d.ts +110 -0
- package/dist/auth/core-models.d.ts.map +1 -0
- package/dist/auth/core-models.js +48 -0
- package/dist/auth/core-models.js.map +1 -0
- package/dist/auth/core-module.d.ts +5 -0
- package/dist/auth/core-module.d.ts.map +1 -0
- package/dist/auth/core-module.js +48 -0
- package/dist/auth/core-module.js.map +1 -0
- package/dist/auth/debug.d.ts +20 -0
- package/dist/auth/debug.d.ts.map +1 -0
- package/dist/auth/debug.js +118 -0
- package/dist/auth/debug.js.map +1 -0
- package/dist/auth/field-permissions.d.ts +11 -0
- package/dist/auth/field-permissions.d.ts.map +1 -0
- package/dist/auth/field-permissions.js +82 -0
- package/dist/auth/field-permissions.js.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +12 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/model-permissions.d.ts +8 -0
- package/dist/auth/model-permissions.d.ts.map +1 -0
- package/dist/auth/model-permissions.js +35 -0
- package/dist/auth/model-permissions.js.map +1 -0
- package/dist/auth/password.d.ts +3 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +19 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/permission-registry.d.ts +27 -0
- package/dist/auth/permission-registry.d.ts.map +1 -0
- package/dist/auth/permission-registry.js +148 -0
- package/dist/auth/permission-registry.js.map +1 -0
- package/dist/auth/scope-filters.d.ts +3 -0
- package/dist/auth/scope-filters.d.ts.map +1 -0
- package/dist/auth/scope-filters.js +9 -0
- package/dist/auth/scope-filters.js.map +1 -0
- package/dist/auth/scope-registry.d.ts +31 -0
- package/dist/auth/scope-registry.d.ts.map +1 -0
- package/dist/auth/scope-registry.js +78 -0
- package/dist/auth/scope-registry.js.map +1 -0
- package/dist/auth/scopes.d.ts +16 -0
- package/dist/auth/scopes.d.ts.map +1 -0
- package/dist/auth/scopes.js +93 -0
- package/dist/auth/scopes.js.map +1 -0
- package/dist/auth/seed.d.ts +3 -0
- package/dist/auth/seed.d.ts.map +1 -0
- package/dist/auth/seed.js +40 -0
- package/dist/auth/seed.js.map +1 -0
- package/dist/auth/session.d.ts +15 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +138 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/types.d.ts +44 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/boot/__tests__/page-scanning.test.d.ts +2 -0
- package/dist/boot/__tests__/page-scanning.test.d.ts.map +1 -0
- package/dist/boot/__tests__/page-scanning.test.js +144 -0
- package/dist/boot/__tests__/page-scanning.test.js.map +1 -0
- package/dist/boot/__tests__/page-utils.test.d.ts +2 -0
- package/dist/boot/__tests__/page-utils.test.d.ts.map +1 -0
- package/dist/boot/__tests__/page-utils.test.js +204 -0
- package/dist/boot/__tests__/page-utils.test.js.map +1 -0
- package/dist/boot/__tests__/project-scanner.test.d.ts +2 -0
- package/dist/boot/__tests__/project-scanner.test.d.ts.map +1 -0
- package/dist/boot/__tests__/project-scanner.test.js +71 -0
- package/dist/boot/__tests__/project-scanner.test.js.map +1 -0
- package/dist/boot/dependency-sort.d.ts +3 -0
- package/dist/boot/dependency-sort.d.ts.map +1 -0
- package/dist/boot/dependency-sort.js +63 -0
- package/dist/boot/dependency-sort.js.map +1 -0
- package/dist/boot/discovery.d.ts +14 -0
- package/dist/boot/discovery.d.ts.map +1 -0
- package/dist/boot/discovery.js +80 -0
- package/dist/boot/discovery.js.map +1 -0
- package/dist/boot/index.d.ts +68 -0
- package/dist/boot/index.d.ts.map +1 -0
- package/dist/boot/index.js +309 -0
- package/dist/boot/index.js.map +1 -0
- package/dist/boot/page-utils.d.ts +24 -0
- package/dist/boot/page-utils.d.ts.map +1 -0
- package/dist/boot/page-utils.js +77 -0
- package/dist/boot/page-utils.js.map +1 -0
- package/dist/boot/project-scanner.d.ts +69 -0
- package/dist/boot/project-scanner.d.ts.map +1 -0
- package/dist/boot/project-scanner.js +293 -0
- package/dist/boot/project-scanner.js.map +1 -0
- package/dist/boot/schema-loader.d.ts +16 -0
- package/dist/boot/schema-loader.d.ts.map +1 -0
- package/dist/boot/schema-loader.js +15 -0
- package/dist/boot/schema-loader.js.map +1 -0
- package/dist/boot/schema-merger.d.ts +12 -0
- package/dist/boot/schema-merger.d.ts.map +1 -0
- package/dist/boot/schema-merger.js +93 -0
- package/dist/boot/schema-merger.js.map +1 -0
- package/dist/boot/traits.d.ts +6 -0
- package/dist/boot/traits.d.ts.map +1 -0
- package/dist/boot/traits.js +17 -0
- package/dist/boot/traits.js.map +1 -0
- package/dist/boot/types.d.ts +65 -0
- package/dist/boot/types.d.ts.map +1 -0
- package/dist/boot/types.js +33 -0
- package/dist/boot/types.js.map +1 -0
- package/dist/context.d.ts +34 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +70 -0
- package/dist/context.js.map +1 -0
- package/dist/db/__tests__/cascade-delete.test.d.ts +2 -0
- package/dist/db/__tests__/cascade-delete.test.d.ts.map +1 -0
- package/dist/db/__tests__/cascade-delete.test.js +136 -0
- package/dist/db/__tests__/cascade-delete.test.js.map +1 -0
- package/dist/db/__tests__/desired-state.test.d.ts +2 -0
- package/dist/db/__tests__/desired-state.test.d.ts.map +1 -0
- package/dist/db/__tests__/desired-state.test.js +119 -0
- package/dist/db/__tests__/desired-state.test.js.map +1 -0
- package/dist/db/__tests__/diff-engine.test.d.ts +2 -0
- package/dist/db/__tests__/diff-engine.test.d.ts.map +1 -0
- package/dist/db/__tests__/diff-engine.test.js +600 -0
- package/dist/db/__tests__/diff-engine.test.js.map +1 -0
- package/dist/db/__tests__/field-mapper.test.d.ts +2 -0
- package/dist/db/__tests__/field-mapper.test.d.ts.map +1 -0
- package/dist/db/__tests__/field-mapper.test.js +320 -0
- package/dist/db/__tests__/field-mapper.test.js.map +1 -0
- package/dist/db/__tests__/introspect.test.d.ts +2 -0
- package/dist/db/__tests__/introspect.test.d.ts.map +1 -0
- package/dist/db/__tests__/introspect.test.js +64 -0
- package/dist/db/__tests__/introspect.test.js.map +1 -0
- package/dist/db/__tests__/search-filter.test.d.ts +2 -0
- package/dist/db/__tests__/search-filter.test.d.ts.map +1 -0
- package/dist/db/__tests__/search-filter.test.js +41 -0
- package/dist/db/__tests__/search-filter.test.js.map +1 -0
- package/dist/db/__tests__/sequence.test.d.ts +2 -0
- package/dist/db/__tests__/sequence.test.d.ts.map +1 -0
- package/dist/db/__tests__/sequence.test.js +183 -0
- package/dist/db/__tests__/sequence.test.js.map +1 -0
- package/dist/db/auto-sync.d.ts +16 -0
- package/dist/db/auto-sync.d.ts.map +1 -0
- package/dist/db/auto-sync.js +104 -0
- package/dist/db/auto-sync.js.map +1 -0
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +116 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/desired-state.d.ts +19 -0
- package/dist/db/desired-state.d.ts.map +1 -0
- package/dist/db/desired-state.js +82 -0
- package/dist/db/desired-state.js.map +1 -0
- package/dist/db/diff-engine.d.ts +53 -0
- package/dist/db/diff-engine.d.ts.map +1 -0
- package/dist/db/diff-engine.js +234 -0
- package/dist/db/diff-engine.js.map +1 -0
- package/dist/db/field-mapper.d.ts +22 -0
- package/dist/db/field-mapper.d.ts.map +1 -0
- package/dist/db/field-mapper.js +395 -0
- package/dist/db/field-mapper.js.map +1 -0
- package/dist/db/filter-applier.d.ts +4 -0
- package/dist/db/filter-applier.d.ts.map +1 -0
- package/dist/db/filter-applier.js +86 -0
- package/dist/db/filter-applier.js.map +1 -0
- package/dist/db/include-resolver.d.ts +20 -0
- package/dist/db/include-resolver.d.ts.map +1 -0
- package/dist/db/include-resolver.js +21 -0
- package/dist/db/include-resolver.js.map +1 -0
- package/dist/db/index.d.ts +16 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +11 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/introspect.d.ts +9 -0
- package/dist/db/introspect.d.ts.map +1 -0
- package/dist/db/introspect.js +194 -0
- package/dist/db/introspect.js.map +1 -0
- package/dist/db/model-include-resolver.d.ts +14 -0
- package/dist/db/model-include-resolver.d.ts.map +1 -0
- package/dist/db/model-include-resolver.js +232 -0
- package/dist/db/model-include-resolver.js.map +1 -0
- package/dist/db/model-ops.d.ts +46 -0
- package/dist/db/model-ops.d.ts.map +1 -0
- package/dist/db/model-ops.js +220 -0
- package/dist/db/model-ops.js.map +1 -0
- package/dist/db/scope-enforcer.d.ts +8 -0
- package/dist/db/scope-enforcer.d.ts.map +1 -0
- package/dist/db/scope-enforcer.js +22 -0
- package/dist/db/scope-enforcer.js.map +1 -0
- package/dist/db/types.d.ts +76 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/__tests__/bus.test.d.ts +2 -0
- package/dist/events/__tests__/bus.test.d.ts.map +1 -0
- package/dist/events/__tests__/bus.test.js +83 -0
- package/dist/events/__tests__/bus.test.js.map +1 -0
- package/dist/events/bus.d.ts +40 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +74 -0
- package/dist/events/bus.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 +2 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +9 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/external-model/__tests__/computed-fields.test.d.ts +2 -0
- package/dist/external-model/__tests__/computed-fields.test.d.ts.map +1 -0
- package/dist/external-model/__tests__/computed-fields.test.js +94 -0
- package/dist/external-model/__tests__/computed-fields.test.js.map +1 -0
- package/dist/external-model/__tests__/field-mapper.test.d.ts +2 -0
- package/dist/external-model/__tests__/field-mapper.test.d.ts.map +1 -0
- package/dist/external-model/__tests__/field-mapper.test.js +132 -0
- package/dist/external-model/__tests__/field-mapper.test.js.map +1 -0
- package/dist/external-model/__tests__/in-memory-ops.test.d.ts +2 -0
- package/dist/external-model/__tests__/in-memory-ops.test.d.ts.map +1 -0
- package/dist/external-model/__tests__/in-memory-ops.test.js +209 -0
- package/dist/external-model/__tests__/in-memory-ops.test.js.map +1 -0
- package/dist/external-model/__tests__/mutation-executor.test.d.ts +2 -0
- package/dist/external-model/__tests__/mutation-executor.test.d.ts.map +1 -0
- package/dist/external-model/__tests__/mutation-executor.test.js +135 -0
- package/dist/external-model/__tests__/mutation-executor.test.js.map +1 -0
- package/dist/external-model/__tests__/query-executor.test.d.ts +2 -0
- package/dist/external-model/__tests__/query-executor.test.d.ts.map +1 -0
- package/dist/external-model/__tests__/query-executor.test.js +241 -0
- package/dist/external-model/__tests__/query-executor.test.js.map +1 -0
- package/dist/external-model/__tests__/schema-converter.test.d.ts +2 -0
- package/dist/external-model/__tests__/schema-converter.test.d.ts.map +1 -0
- package/dist/external-model/__tests__/schema-converter.test.js +152 -0
- package/dist/external-model/__tests__/schema-converter.test.js.map +1 -0
- package/dist/external-model/computed-fields.d.ts +3 -0
- package/dist/external-model/computed-fields.d.ts.map +1 -0
- package/dist/external-model/computed-fields.js +10 -0
- package/dist/external-model/computed-fields.js.map +1 -0
- package/dist/external-model/define.d.ts +3 -0
- package/dist/external-model/define.d.ts.map +1 -0
- package/dist/external-model/define.js +4 -0
- package/dist/external-model/define.js.map +1 -0
- package/dist/external-model/external-model-ops.d.ts +27 -0
- package/dist/external-model/external-model-ops.d.ts.map +1 -0
- package/dist/external-model/external-model-ops.js +80 -0
- package/dist/external-model/external-model-ops.js.map +1 -0
- package/dist/external-model/field-mapper.d.ts +5 -0
- package/dist/external-model/field-mapper.d.ts.map +1 -0
- package/dist/external-model/field-mapper.js +49 -0
- package/dist/external-model/field-mapper.js.map +1 -0
- package/dist/external-model/in-memory-ops.d.ts +8 -0
- package/dist/external-model/in-memory-ops.d.ts.map +1 -0
- package/dist/external-model/in-memory-ops.js +97 -0
- package/dist/external-model/in-memory-ops.js.map +1 -0
- package/dist/external-model/index.d.ts +8 -0
- package/dist/external-model/index.d.ts.map +1 -0
- package/dist/external-model/index.js +6 -0
- package/dist/external-model/index.js.map +1 -0
- package/dist/external-model/mutation-executor.d.ts +27 -0
- package/dist/external-model/mutation-executor.d.ts.map +1 -0
- package/dist/external-model/mutation-executor.js +53 -0
- package/dist/external-model/mutation-executor.js.map +1 -0
- package/dist/external-model/query-executor.d.ts +37 -0
- package/dist/external-model/query-executor.d.ts.map +1 -0
- package/dist/external-model/query-executor.js +61 -0
- package/dist/external-model/query-executor.js.map +1 -0
- package/dist/external-model/schema-converter.d.ts +8 -0
- package/dist/external-model/schema-converter.d.ts.map +1 -0
- package/dist/external-model/schema-converter.js +38 -0
- package/dist/external-model/schema-converter.js.map +1 -0
- package/dist/external-model/types.d.ts +29 -0
- package/dist/external-model/types.d.ts.map +1 -0
- package/dist/external-model/types.js +2 -0
- package/dist/external-model/types.js.map +1 -0
- package/dist/fixtures/__tests__/fixtures.test.d.ts +2 -0
- package/dist/fixtures/__tests__/fixtures.test.d.ts.map +1 -0
- package/dist/fixtures/__tests__/fixtures.test.js +180 -0
- package/dist/fixtures/__tests__/fixtures.test.js.map +1 -0
- package/dist/fixtures/index.d.ts +4 -0
- package/dist/fixtures/index.d.ts.map +1 -0
- package/dist/fixtures/index.js +3 -0
- package/dist/fixtures/index.js.map +1 -0
- package/dist/fixtures/loader.d.ts +11 -0
- package/dist/fixtures/loader.d.ts.map +1 -0
- package/dist/fixtures/loader.js +157 -0
- package/dist/fixtures/loader.js.map +1 -0
- package/dist/fixtures/registry.d.ts +27 -0
- package/dist/fixtures/registry.d.ts.map +1 -0
- package/dist/fixtures/registry.js +103 -0
- package/dist/fixtures/registry.js.map +1 -0
- package/dist/fixtures/types.d.ts +29 -0
- package/dist/fixtures/types.d.ts.map +1 -0
- package/dist/fixtures/types.js +2 -0
- package/dist/fixtures/types.js.map +1 -0
- package/dist/helpers/assert-ownership.d.ts +4 -0
- package/dist/helpers/assert-ownership.d.ts.map +1 -0
- package/dist/helpers/assert-ownership.js +11 -0
- package/dist/helpers/assert-ownership.js.map +1 -0
- package/dist/helpers/coerce.d.ts +9 -0
- package/dist/helpers/coerce.d.ts.map +1 -0
- package/dist/helpers/coerce.js +28 -0
- package/dist/helpers/coerce.js.map +1 -0
- package/dist/helpers/stamping.d.ts +12 -0
- package/dist/helpers/stamping.d.ts.map +1 -0
- package/dist/helpers/stamping.js +20 -0
- package/dist/helpers/stamping.js.map +1 -0
- package/dist/helpers/validation.d.ts +3 -0
- package/dist/helpers/validation.d.ts.map +1 -0
- package/dist/helpers/validation.js +10 -0
- package/dist/helpers/validation.js.map +1 -0
- package/dist/hooks/__tests__/context.test.d.ts +2 -0
- package/dist/hooks/__tests__/context.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/context.test.js +62 -0
- package/dist/hooks/__tests__/context.test.js.map +1 -0
- package/dist/hooks/__tests__/executor.test.d.ts +2 -0
- package/dist/hooks/__tests__/executor.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/executor.test.js +339 -0
- package/dist/hooks/__tests__/executor.test.js.map +1 -0
- package/dist/hooks/__tests__/middleware.test.d.ts +2 -0
- package/dist/hooks/__tests__/middleware.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/middleware.test.js +187 -0
- package/dist/hooks/__tests__/middleware.test.js.map +1 -0
- package/dist/hooks/__tests__/registry.test.d.ts +2 -0
- package/dist/hooks/__tests__/registry.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/registry.test.js +42 -0
- package/dist/hooks/__tests__/registry.test.js.map +1 -0
- package/dist/hooks/context.d.ts +20 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +62 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/errors.d.ts +6 -0
- package/dist/hooks/errors.d.ts.map +1 -0
- package/dist/hooks/errors.js +11 -0
- package/dist/hooks/errors.js.map +1 -0
- package/dist/hooks/executor.d.ts +27 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +72 -0
- package/dist/hooks/executor.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/middleware.d.ts +23 -0
- package/dist/hooks/middleware.d.ts.map +1 -0
- package/dist/hooks/middleware.js +137 -0
- package/dist/hooks/middleware.js.map +1 -0
- package/dist/hooks/registry.d.ts +9 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +15 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/types.d.ts +12 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/__tests__/enqueue.test.d.ts +2 -0
- package/dist/jobs/__tests__/enqueue.test.d.ts.map +1 -0
- package/dist/jobs/__tests__/enqueue.test.js +69 -0
- package/dist/jobs/__tests__/enqueue.test.js.map +1 -0
- package/dist/jobs/__tests__/integration.test.d.ts +2 -0
- package/dist/jobs/__tests__/integration.test.d.ts.map +1 -0
- package/dist/jobs/__tests__/integration.test.js +52 -0
- package/dist/jobs/__tests__/integration.test.js.map +1 -0
- package/dist/jobs/__tests__/registry.test.d.ts +2 -0
- package/dist/jobs/__tests__/registry.test.d.ts.map +1 -0
- package/dist/jobs/__tests__/registry.test.js +65 -0
- package/dist/jobs/__tests__/registry.test.js.map +1 -0
- package/dist/jobs/__tests__/scheduler.test.d.ts +2 -0
- package/dist/jobs/__tests__/scheduler.test.d.ts.map +1 -0
- package/dist/jobs/__tests__/scheduler.test.js +79 -0
- package/dist/jobs/__tests__/scheduler.test.js.map +1 -0
- package/dist/jobs/__tests__/worker-execution.test.d.ts +2 -0
- package/dist/jobs/__tests__/worker-execution.test.d.ts.map +1 -0
- package/dist/jobs/__tests__/worker-execution.test.js +171 -0
- package/dist/jobs/__tests__/worker-execution.test.js.map +1 -0
- package/dist/jobs/__tests__/worker.test.d.ts +2 -0
- package/dist/jobs/__tests__/worker.test.d.ts.map +1 -0
- package/dist/jobs/__tests__/worker.test.js +97 -0
- package/dist/jobs/__tests__/worker.test.js.map +1 -0
- package/dist/jobs/enqueue.d.ts +13 -0
- package/dist/jobs/enqueue.d.ts.map +1 -0
- package/dist/jobs/enqueue.js +58 -0
- package/dist/jobs/enqueue.js.map +1 -0
- package/dist/jobs/index.d.ts +6 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +5 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/registry.d.ts +23 -0
- package/dist/jobs/registry.d.ts.map +1 -0
- package/dist/jobs/registry.js +72 -0
- package/dist/jobs/registry.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +51 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +172 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/tables.d.ts +3 -0
- package/dist/jobs/tables.d.ts.map +1 -0
- package/dist/jobs/tables.js +128 -0
- package/dist/jobs/tables.js.map +1 -0
- package/dist/jobs/types.d.ts +55 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +2 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs/worker.d.ts +55 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +228 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/model-api/__tests__/cross-boundary-includes.test.d.ts +2 -0
- package/dist/model-api/__tests__/cross-boundary-includes.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/cross-boundary-includes.test.js +299 -0
- package/dist/model-api/__tests__/cross-boundary-includes.test.js.map +1 -0
- package/dist/model-api/__tests__/extended-api.test.d.ts +2 -0
- package/dist/model-api/__tests__/extended-api.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/extended-api.test.js +219 -0
- package/dist/model-api/__tests__/extended-api.test.js.map +1 -0
- package/dist/model-api/__tests__/filter-applier.test.d.ts +2 -0
- package/dist/model-api/__tests__/filter-applier.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/filter-applier.test.js +150 -0
- package/dist/model-api/__tests__/filter-applier.test.js.map +1 -0
- package/dist/model-api/__tests__/filter-translator.test.d.ts +2 -0
- package/dist/model-api/__tests__/filter-translator.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/filter-translator.test.js +157 -0
- package/dist/model-api/__tests__/filter-translator.test.js.map +1 -0
- package/dist/model-api/__tests__/include-resolver.test.d.ts +2 -0
- package/dist/model-api/__tests__/include-resolver.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/include-resolver.test.js +193 -0
- package/dist/model-api/__tests__/include-resolver.test.js.map +1 -0
- package/dist/model-api/__tests__/model-access.test.d.ts +2 -0
- package/dist/model-api/__tests__/model-access.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/model-access.test.js +242 -0
- package/dist/model-api/__tests__/model-access.test.js.map +1 -0
- package/dist/model-api/__tests__/query-builder.test.d.ts +2 -0
- package/dist/model-api/__tests__/query-builder.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/query-builder.test.js +190 -0
- package/dist/model-api/__tests__/query-builder.test.js.map +1 -0
- package/dist/model-api/__tests__/scope-enforcer.test.d.ts +2 -0
- package/dist/model-api/__tests__/scope-enforcer.test.d.ts.map +1 -0
- package/dist/model-api/__tests__/scope-enforcer.test.js +221 -0
- package/dist/model-api/__tests__/scope-enforcer.test.js.map +1 -0
- package/dist/model-api/field-access.d.ts +3 -0
- package/dist/model-api/field-access.d.ts.map +1 -0
- package/dist/model-api/field-access.js +25 -0
- package/dist/model-api/field-access.js.map +1 -0
- package/dist/model-api/filter-applier.d.ts +2 -0
- package/dist/model-api/filter-applier.d.ts.map +1 -0
- package/dist/model-api/filter-applier.js +2 -0
- package/dist/model-api/filter-applier.js.map +1 -0
- package/dist/model-api/filter-translator.d.ts +4 -0
- package/dist/model-api/filter-translator.d.ts.map +1 -0
- package/dist/model-api/filter-translator.js +61 -0
- package/dist/model-api/filter-translator.js.map +1 -0
- package/dist/model-api/include-resolver.d.ts +3 -0
- package/dist/model-api/include-resolver.d.ts.map +1 -0
- package/dist/model-api/include-resolver.js +2 -0
- package/dist/model-api/include-resolver.js.map +1 -0
- package/dist/model-api/index.d.ts +10 -0
- package/dist/model-api/index.d.ts.map +1 -0
- package/dist/model-api/index.js +63 -0
- package/dist/model-api/index.js.map +1 -0
- package/dist/model-api/query-builder.d.ts +35 -0
- package/dist/model-api/query-builder.d.ts.map +1 -0
- package/dist/model-api/query-builder.js +106 -0
- package/dist/model-api/query-builder.js.map +1 -0
- package/dist/model-api/scope-enforcer.d.ts +4 -0
- package/dist/model-api/scope-enforcer.d.ts.map +1 -0
- package/dist/model-api/scope-enforcer.js +3 -0
- package/dist/model-api/scope-enforcer.js.map +1 -0
- package/dist/model-api/types.d.ts +113 -0
- package/dist/model-api/types.d.ts.map +1 -0
- package/dist/model-api/types.js +2 -0
- package/dist/model-api/types.js.map +1 -0
- package/dist/plugins/__tests__/adapter-registry.test.d.ts +2 -0
- package/dist/plugins/__tests__/adapter-registry.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/adapter-registry.test.js +75 -0
- package/dist/plugins/__tests__/adapter-registry.test.js.map +1 -0
- package/dist/plugins/__tests__/lifecycle.test.d.ts +2 -0
- package/dist/plugins/__tests__/lifecycle.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/lifecycle.test.js +81 -0
- package/dist/plugins/__tests__/lifecycle.test.js.map +1 -0
- package/dist/plugins/__tests__/loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/loader.test.js +227 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/__tests__/validator.test.d.ts +2 -0
- package/dist/plugins/__tests__/validator.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/validator.test.js +227 -0
- package/dist/plugins/__tests__/validator.test.js.map +1 -0
- package/dist/plugins/adapter-registry.d.ts +20 -0
- package/dist/plugins/adapter-registry.d.ts.map +1 -0
- package/dist/plugins/adapter-registry.js +39 -0
- package/dist/plugins/adapter-registry.js.map +1 -0
- package/dist/plugins/define.d.ts +3 -0
- package/dist/plugins/define.d.ts.map +1 -0
- package/dist/plugins/define.js +4 -0
- package/dist/plugins/define.js.map +1 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +6 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/lifecycle.d.ts +9 -0
- package/dist/plugins/lifecycle.d.ts.map +1 -0
- package/dist/plugins/lifecycle.js +23 -0
- package/dist/plugins/lifecycle.js.map +1 -0
- package/dist/plugins/loader.d.ts +27 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +96 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +57 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +3 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/validator.d.ts +16 -0
- package/dist/plugins/validator.d.ts.map +1 -0
- package/dist/plugins/validator.js +92 -0
- package/dist/plugins/validator.js.map +1 -0
- package/dist/schema/__tests__/registry-models-by-module.test.d.ts +2 -0
- package/dist/schema/__tests__/registry-models-by-module.test.d.ts.map +1 -0
- package/dist/schema/__tests__/registry-models-by-module.test.js +52 -0
- package/dist/schema/__tests__/registry-models-by-module.test.js.map +1 -0
- package/dist/schema/registry.d.ts +30 -0
- package/dist/schema/registry.d.ts.map +1 -0
- package/dist/schema/registry.js +81 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/schema/relationships.d.ts +6 -0
- package/dist/schema/relationships.d.ts.map +1 -0
- package/dist/schema/relationships.js +81 -0
- package/dist/schema/relationships.js.map +1 -0
- package/dist/schema/types.d.ts +39 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/services/__tests__/integration.test.d.ts +2 -0
- package/dist/services/__tests__/integration.test.d.ts.map +1 -0
- package/dist/services/__tests__/integration.test.js +53 -0
- package/dist/services/__tests__/integration.test.js.map +1 -0
- package/dist/services/__tests__/registry.test.d.ts +2 -0
- package/dist/services/__tests__/registry.test.d.ts.map +1 -0
- package/dist/services/__tests__/registry.test.js +143 -0
- package/dist/services/__tests__/registry.test.js.map +1 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/registry.d.ts +48 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +133 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/types.d.ts +23 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +2 -0
- package/dist/services/types.js.map +1 -0
- package/dist/validation/__tests__/field-validator.test.d.ts +2 -0
- package/dist/validation/__tests__/field-validator.test.d.ts.map +1 -0
- package/dist/validation/__tests__/field-validator.test.js +161 -0
- package/dist/validation/__tests__/field-validator.test.js.map +1 -0
- package/dist/validation/field-validator.d.ts +8 -0
- package/dist/validation/field-validator.d.ts.map +1 -0
- package/dist/validation/field-validator.js +85 -0
- package/dist/validation/field-validator.js.map +1 -0
- package/dist/validation/index.d.ts +2 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +2 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/widgets/index.d.ts +4 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +3 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/slot-validator.d.ts +8 -0
- package/dist/widgets/slot-validator.d.ts.map +1 -0
- package/dist/widgets/slot-validator.js +69 -0
- package/dist/widgets/slot-validator.js.map +1 -0
- package/dist/widgets/widget-registry.d.ts +11 -0
- package/dist/widgets/widget-registry.d.ts.map +1 -0
- package/dist/widgets/widget-registry.js +25 -0
- package/dist/widgets/widget-registry.js.map +1 -0
- package/package.json +35 -0
- package/src/__tests__/coerce.test.ts +154 -0
- package/src/__tests__/context.test.ts +111 -0
- package/src/__tests__/helpers.ts +21 -0
- package/src/__tests__/index.test.ts +7 -0
- package/src/__tests__/widgets.test.ts +197 -0
- package/src/api/__tests__/handlers.test.ts +389 -0
- package/src/api/__tests__/include-resolver.test.ts +393 -0
- package/src/api/__tests__/middleware.test.ts +100 -0
- package/src/api/__tests__/openapi-schema.test.ts +210 -0
- package/src/api/__tests__/query-parser.test.ts +291 -0
- package/src/api/__tests__/route-generator.test.ts +137 -0
- package/src/api/__tests__/server.test.ts +73 -0
- package/src/api/__tests__/swagger.test.ts +166 -0
- package/src/api/handlers.ts +274 -0
- package/src/api/include-resolver.ts +27 -0
- package/src/api/index.ts +4 -0
- package/src/api/meta-handler.ts +254 -0
- package/src/api/openapi-schema.ts +99 -0
- package/src/api/query-parser.ts +315 -0
- package/src/api/route-generator.ts +448 -0
- package/src/api/server.ts +147 -0
- package/src/api/types.ts +16 -0
- package/src/audit/__tests__/audit.test.ts +144 -0
- package/src/audit/index.ts +3 -0
- package/src/audit/record.ts +69 -0
- package/src/audit/tables.ts +48 -0
- package/src/audit/types.ts +26 -0
- package/src/auth/__tests__/core-module.test.ts +54 -0
- package/src/auth/__tests__/debug.test.ts +47 -0
- package/src/auth/__tests__/field-permissions.test.ts +245 -0
- package/src/auth/__tests__/integration.test.ts +208 -0
- package/src/auth/__tests__/meta-boot.test.ts +538 -0
- package/src/auth/__tests__/model-permissions.test.ts +205 -0
- package/src/auth/__tests__/password.test.ts +29 -0
- package/src/auth/__tests__/permission-registry.test.ts +313 -0
- package/src/auth/__tests__/scope-hook.test.ts +509 -0
- package/src/auth/__tests__/scope-registry.test.ts +297 -0
- package/src/auth/__tests__/scopes.test.ts +66 -0
- package/src/auth/__tests__/session.test.ts +214 -0
- package/src/auth/core-models.ts +52 -0
- package/src/auth/core-module.ts +59 -0
- package/src/auth/debug.ts +157 -0
- package/src/auth/field-permissions.ts +116 -0
- package/src/auth/index.ts +37 -0
- package/src/auth/model-permissions.ts +59 -0
- package/src/auth/password.ts +22 -0
- package/src/auth/permission-registry.ts +171 -0
- package/src/auth/scope-filters.ts +11 -0
- package/src/auth/scope-registry.ts +121 -0
- package/src/auth/scopes.ts +146 -0
- package/src/auth/seed.ts +44 -0
- package/src/auth/session.ts +178 -0
- package/src/auth/types.ts +50 -0
- package/src/boot/__tests__/page-scanning.test.ts +170 -0
- package/src/boot/__tests__/page-utils.test.ts +225 -0
- package/src/boot/__tests__/project-scanner.test.ts +88 -0
- package/src/boot/dependency-sort.ts +82 -0
- package/src/boot/discovery.ts +85 -0
- package/src/boot/index.ts +457 -0
- package/src/boot/page-utils.ts +110 -0
- package/src/boot/project-scanner.ts +397 -0
- package/src/boot/schema-loader.ts +26 -0
- package/src/boot/schema-merger.ts +125 -0
- package/src/boot/traits.ts +25 -0
- package/src/boot/types.ts +73 -0
- package/src/context.ts +105 -0
- package/src/db/__tests__/cascade-delete.test.ts +182 -0
- package/src/db/__tests__/desired-state.test.ts +136 -0
- package/src/db/__tests__/diff-engine.test.ts +635 -0
- package/src/db/__tests__/field-mapper.test.ts +355 -0
- package/src/db/__tests__/introspect.test.ts +70 -0
- package/src/db/__tests__/search-filter.test.ts +45 -0
- package/src/db/__tests__/sequence.test.ts +221 -0
- package/src/db/auto-sync.ts +133 -0
- package/src/db/client.ts +147 -0
- package/src/db/desired-state.ts +98 -0
- package/src/db/diff-engine.ts +305 -0
- package/src/db/field-mapper.ts +504 -0
- package/src/db/filter-applier.ts +89 -0
- package/src/db/include-resolver.ts +40 -0
- package/src/db/index.ts +23 -0
- package/src/db/introspect.ts +265 -0
- package/src/db/model-include-resolver.ts +327 -0
- package/src/db/model-ops.ts +281 -0
- package/src/db/scope-enforcer.ts +37 -0
- package/src/db/types.ts +98 -0
- package/src/errors.ts +41 -0
- package/src/events/__tests__/bus.test.ts +105 -0
- package/src/events/bus.ts +89 -0
- package/src/events/index.ts +2 -0
- package/src/events/types.ts +9 -0
- package/src/external-model/__tests__/computed-fields.test.ts +106 -0
- package/src/external-model/__tests__/field-mapper.test.ts +160 -0
- package/src/external-model/__tests__/in-memory-ops.test.ts +247 -0
- package/src/external-model/__tests__/mutation-executor.test.ts +160 -0
- package/src/external-model/__tests__/query-executor.test.ts +284 -0
- package/src/external-model/__tests__/schema-converter.test.ts +174 -0
- package/src/external-model/computed-fields.ts +15 -0
- package/src/external-model/define.ts +5 -0
- package/src/external-model/external-model-ops.ts +108 -0
- package/src/external-model/field-mapper.ts +66 -0
- package/src/external-model/in-memory-ops.ts +107 -0
- package/src/external-model/index.ts +7 -0
- package/src/external-model/mutation-executor.ts +71 -0
- package/src/external-model/query-executor.ts +100 -0
- package/src/external-model/schema-converter.ts +53 -0
- package/src/external-model/types.ts +32 -0
- package/src/fixtures/__tests__/fixtures.test.ts +203 -0
- package/src/fixtures/index.ts +10 -0
- package/src/fixtures/loader.ts +196 -0
- package/src/fixtures/registry.ts +125 -0
- package/src/fixtures/types.ts +33 -0
- package/src/helpers/assert-ownership.ts +19 -0
- package/src/helpers/coerce.ts +28 -0
- package/src/helpers/stamping.ts +28 -0
- package/src/helpers/validation.ts +14 -0
- package/src/hooks/__tests__/context.test.ts +73 -0
- package/src/hooks/__tests__/executor.test.ts +433 -0
- package/src/hooks/__tests__/middleware.test.ts +224 -0
- package/src/hooks/__tests__/registry.test.ts +50 -0
- package/src/hooks/context.ts +89 -0
- package/src/hooks/errors.ts +11 -0
- package/src/hooks/executor.ts +115 -0
- package/src/hooks/index.ts +10 -0
- package/src/hooks/middleware.ts +220 -0
- package/src/hooks/registry.ts +20 -0
- package/src/hooks/types.ts +32 -0
- package/src/index.ts +172 -0
- package/src/jobs/__tests__/enqueue.test.ts +77 -0
- package/src/jobs/__tests__/integration.test.ts +71 -0
- package/src/jobs/__tests__/registry.test.ts +103 -0
- package/src/jobs/__tests__/scheduler.test.ts +92 -0
- package/src/jobs/__tests__/worker-execution.test.ts +202 -0
- package/src/jobs/__tests__/worker.test.ts +119 -0
- package/src/jobs/enqueue.ts +93 -0
- package/src/jobs/index.ts +14 -0
- package/src/jobs/registry.ts +92 -0
- package/src/jobs/scheduler.ts +205 -0
- package/src/jobs/tables.ts +132 -0
- package/src/jobs/types.ts +62 -0
- package/src/jobs/worker.ts +272 -0
- package/src/model-api/__tests__/cross-boundary-includes.test.ts +366 -0
- package/src/model-api/__tests__/extended-api.test.ts +244 -0
- package/src/model-api/__tests__/filter-applier.test.ts +177 -0
- package/src/model-api/__tests__/filter-translator.test.ts +186 -0
- package/src/model-api/__tests__/include-resolver.test.ts +226 -0
- package/src/model-api/__tests__/model-access.test.ts +284 -0
- package/src/model-api/__tests__/query-builder.test.ts +224 -0
- package/src/model-api/__tests__/scope-enforcer.test.ts +268 -0
- package/src/model-api/field-access.ts +28 -0
- package/src/model-api/filter-applier.ts +1 -0
- package/src/model-api/filter-translator.ts +67 -0
- package/src/model-api/include-resolver.ts +2 -0
- package/src/model-api/index.ts +86 -0
- package/src/model-api/query-builder.ts +155 -0
- package/src/model-api/scope-enforcer.ts +3 -0
- package/src/model-api/types.ts +139 -0
- package/src/plugins/__tests__/adapter-registry.test.ts +92 -0
- package/src/plugins/__tests__/lifecycle.test.ts +96 -0
- package/src/plugins/__tests__/loader.test.ts +273 -0
- package/src/plugins/__tests__/validator.test.ts +275 -0
- package/src/plugins/adapter-registry.ts +42 -0
- package/src/plugins/define.ts +5 -0
- package/src/plugins/index.ts +28 -0
- package/src/plugins/lifecycle.ts +27 -0
- package/src/plugins/loader.ts +126 -0
- package/src/plugins/types.ts +76 -0
- package/src/plugins/validator.ts +141 -0
- package/src/schema/__tests__/registry-models-by-module.test.ts +58 -0
- package/src/schema/registry.ts +93 -0
- package/src/schema/relationships.ts +93 -0
- package/src/schema/types.ts +43 -0
- package/src/services/__tests__/integration.test.ts +63 -0
- package/src/services/__tests__/registry.test.ts +175 -0
- package/src/services/index.ts +13 -0
- package/src/services/registry.ts +156 -0
- package/src/services/types.ts +27 -0
- package/src/validation/__tests__/field-validator.test.ts +195 -0
- package/src/validation/field-validator.ts +113 -0
- package/src/validation/index.ts +1 -0
- package/src/widgets/index.ts +3 -0
- package/src/widgets/slot-validator.ts +87 -0
- package/src/widgets/widget-registry.ts +32 -0
- package/tests/boot.test.ts +323 -0
- package/tests/dependency-sort.test.ts +99 -0
- package/tests/discovery.test.ts +126 -0
- package/tests/registry.test.ts +216 -0
- package/tests/schema-loader.test.ts +52 -0
- package/tests/schema-merger.test.ts +180 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: extend-core
|
|
3
|
+
description: Extending or modifying @rangka/core internals (registries, handlers, boot, context). Use when contributing to the framework itself.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Before you write any code
|
|
7
|
+
|
|
8
|
+
You are modifying framework internals. App developers depend on the public API staying stable. Every change must preserve existing behavior unless intentionally breaking (with migration path).
|
|
9
|
+
|
|
10
|
+
1. Identify what you are changing:
|
|
11
|
+
- A registry (SchemaRegistry, HookRegistry, PermissionRegistry, etc.)
|
|
12
|
+
- The boot sequence (`src/boot/index.ts`)
|
|
13
|
+
- The route generator (`src/api/route-generator.ts`)
|
|
14
|
+
- The hook pipeline (`src/hooks/executor.ts`, `src/hooks/middleware.ts`)
|
|
15
|
+
- FrameworkContext (`@rangka/shared` types/context.ts + `src/hooks/context.ts`)
|
|
16
|
+
- Model access layer (`src/model-api/`)
|
|
17
|
+
|
|
18
|
+
2. Read the public API surface that consumers use:
|
|
19
|
+
- `FrameworkContext` in `@rangka/shared/src/types/context.ts` — hooks, services, and jobs receive this
|
|
20
|
+
- `ModelAccessInterface` / `ModelQueryInterface` in the same file — the query API app devs call
|
|
21
|
+
- `defineHooks`, `defineService`, `defineJob` in `@rangka/shared/src/define.ts` — app definition API
|
|
22
|
+
- `BootPayload` in `@rangka/shared/src/types/boot.ts` — what the client receives at startup
|
|
23
|
+
|
|
24
|
+
3. Search for all consumers before modifying:
|
|
25
|
+
```bash
|
|
26
|
+
grep -r "ctx.models" packages/core/src/
|
|
27
|
+
grep -r "FrameworkContext" packages/
|
|
28
|
+
grep -r "SchemaRegistry" packages/core/src/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Extending a registry
|
|
32
|
+
|
|
33
|
+
Registries are singleton objects created during boot. They hold runtime state.
|
|
34
|
+
|
|
35
|
+
Pattern for adding a method:
|
|
36
|
+
|
|
37
|
+
1. Add the method to the registry class (e.g., `src/schema/registry.ts`)
|
|
38
|
+
2. If the method is exposed to app devs via FrameworkContext, update the interface in `@rangka/shared`
|
|
39
|
+
3. Verify all existing tests still pass
|
|
40
|
+
4. Add a test for the new method
|
|
41
|
+
|
|
42
|
+
Pattern for adding a new registry:
|
|
43
|
+
|
|
44
|
+
1. Create in its own file under the relevant domain (e.g., `src/notifications/registry.ts`)
|
|
45
|
+
2. Instantiate in `src/boot/index.ts` during the boot sequence
|
|
46
|
+
3. Wire into `FrameworkContext` if app devs need access
|
|
47
|
+
4. Update `@rangka/shared` types if the interface is public
|
|
48
|
+
|
|
49
|
+
## Modifying FrameworkContext
|
|
50
|
+
|
|
51
|
+
This is the most sensitive change. Every hook, service, and job receives this object.
|
|
52
|
+
|
|
53
|
+
Adding a new field:
|
|
54
|
+
|
|
55
|
+
1. Add the field to `FrameworkContext` in `@rangka/shared/src/types/context.ts`
|
|
56
|
+
2. Make it optional if not all consumers need it (backward compatible)
|
|
57
|
+
3. Build it in `src/hooks/context.ts` (`createHookContext`) AND `src/context.ts` (`createFrameworkContext`)
|
|
58
|
+
4. Rebuild shared first, then core: `pnpm --filter @rangka/shared build && pnpm --filter @rangka/core build`
|
|
59
|
+
5. Verify no type errors across the monorepo: `pnpm build`
|
|
60
|
+
|
|
61
|
+
Modifying an existing field's type:
|
|
62
|
+
|
|
63
|
+
- Breaking change. Grep all usages across the monorepo. Update every consumer in the same PR.
|
|
64
|
+
|
|
65
|
+
## Modifying the hook pipeline
|
|
66
|
+
|
|
67
|
+
The hook pipeline is in `src/hooks/executor.ts` and `src/hooks/middleware.ts`.
|
|
68
|
+
|
|
69
|
+
- `executor.ts` — runs hook chains (validate → before → after) in sequence
|
|
70
|
+
- `middleware.ts` — Fastify request handlers that orchestrate the full CRUD + hooks flow
|
|
71
|
+
|
|
72
|
+
Rules:
|
|
73
|
+
|
|
74
|
+
- Hook phases are fixed: validate, beforeCreate, beforeUpdate, beforeSave, afterCreate, afterUpdate, afterSave, beforeDelete, afterDelete
|
|
75
|
+
- Do NOT add new phases without updating `HookLifecycle` type in `src/hooks/types.ts` AND the executor
|
|
76
|
+
- The middleware functions (`withHooksCreate`, `withHooksUpdate`, `withHooksDelete`) are the authoritative CRUD handlers. Never create a parallel CRUD path.
|
|
77
|
+
|
|
78
|
+
## Modifying the route generator
|
|
79
|
+
|
|
80
|
+
`src/api/route-generator.ts` auto-generates REST routes for all models.
|
|
81
|
+
|
|
82
|
+
- It uses `withHooksCreate/Update/Delete` from `src/hooks/middleware.ts` for mutations
|
|
83
|
+
- It uses `listHandler/getHandler` from `src/api/handlers.ts` for reads
|
|
84
|
+
- Auth/scope/permission guards are applied as Fastify preHandler hooks
|
|
85
|
+
|
|
86
|
+
To add a new capability to all model routes (e.g., new query parameter, new response field):
|
|
87
|
+
|
|
88
|
+
1. Modify the relevant handler in `src/api/handlers.ts`
|
|
89
|
+
2. Update OpenAPI schema generation if applicable (`src/api/openapi-schema.ts`)
|
|
90
|
+
3. Test with integration tests
|
|
91
|
+
|
|
92
|
+
To add a non-model route (e.g., `/api/meta/...`):
|
|
93
|
+
|
|
94
|
+
- Add it inside `generateRoutes()` alongside the existing meta/session routes
|
|
95
|
+
|
|
96
|
+
## Modifying model-api
|
|
97
|
+
|
|
98
|
+
The model access layer (`src/model-api/`) is the query engine.
|
|
99
|
+
|
|
100
|
+
- `query-builder.ts` — ModelQueryBuilder (fluent API for filtering/sorting/pagination)
|
|
101
|
+
- `filter-translator.ts` — converts API filter syntax to Kysely where clauses
|
|
102
|
+
- `filter-applier.ts` — applies filter conditions to a query
|
|
103
|
+
- `scope-enforcer.ts` — enforces tenant/scope/field-level permissions
|
|
104
|
+
- `include-resolver.ts` — resolves relationship includes
|
|
105
|
+
- `field-access.ts` — strips hidden fields, enforces readOnly
|
|
106
|
+
|
|
107
|
+
Rules:
|
|
108
|
+
|
|
109
|
+
- New filter operators go in `filter-translator.ts`
|
|
110
|
+
- New query capabilities go as methods on `ModelQueryBuilder`
|
|
111
|
+
- Never bypass scope enforcement — if you need unscoped access, use `.unscoped()` explicitly
|
|
112
|
+
- The `ModelAccessInterface` in `@rangka/shared` is the public contract. Adding a method there is fine (additive). Changing signatures is breaking.
|
|
113
|
+
|
|
114
|
+
## Anti-patterns
|
|
115
|
+
|
|
116
|
+
| Anti-pattern | Correct approach |
|
|
117
|
+
| ------------------------------------------------------------------ | -------------------------------------------------- |
|
|
118
|
+
| New CRUD handler that skips hooks | Use `withHooksCreate/Update/Delete` |
|
|
119
|
+
| Custom filter logic in a route handler | Add to `filter-translator.ts` |
|
|
120
|
+
| Direct Kysely queries for model CRUD in handlers | Use model-api through the existing handler pattern |
|
|
121
|
+
| New singleton that duplicates a registry's purpose | Extend the existing registry |
|
|
122
|
+
| Modifying `FrameworkContext` in core without updating shared types | Always update `@rangka/shared` first |
|
|
123
|
+
| Adding a field to `BootPayload` without updating client consumer | Check `packages/client/src/boot/` |
|
|
124
|
+
|
|
125
|
+
## Checklist
|
|
126
|
+
|
|
127
|
+
- [ ] Identified all consumers of the changed API (grep across monorepo)
|
|
128
|
+
- [ ] Public interfaces in `@rangka/shared` updated if needed
|
|
129
|
+
- [ ] `createHookContext()` and `createFrameworkContext()` both updated if FrameworkContext changed
|
|
130
|
+
- [ ] No parallel code paths introduced (no duplicate CRUD, no duplicate registries)
|
|
131
|
+
- [ ] Existing tests pass: `pnpm test`
|
|
132
|
+
- [ ] Integration tests pass: `pnpm test:integration`
|
|
133
|
+
- [ ] Full monorepo builds: `pnpm build`
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# CLAUDE.md — @rangka/core
|
|
2
|
+
|
|
3
|
+
## Package overview
|
|
4
|
+
|
|
5
|
+
The Rangka server runtime. Handles boot, schema resolution, database sync, API routing, authentication, hooks, services, jobs, events, and plugins. This is the single source of truth for all server-side behavior.
|
|
6
|
+
|
|
7
|
+
## Tech stack
|
|
8
|
+
|
|
9
|
+
- Node.js >= 20, TypeScript 5
|
|
10
|
+
- Fastify (HTTP server, routing, plugins)
|
|
11
|
+
- Kysely (query builder, migrations, transactions)
|
|
12
|
+
- PostgreSQL (only supported database)
|
|
13
|
+
|
|
14
|
+
## Project structure
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
src/
|
|
18
|
+
├── api/ — Fastify server creation, route generation, request handling
|
|
19
|
+
├── audit/ — Audit trail recording
|
|
20
|
+
├── auth/ — JWT sessions, permissions, scopes, field-level access, seed
|
|
21
|
+
├── boot/ — Boot sequence: discovery, schema loading, merging, registry init
|
|
22
|
+
├── db/ — DatabaseClient, auto-sync (DiffEngine), model-ops (Kysely CRUD)
|
|
23
|
+
├── events/ — EventBus (in-process pub/sub with transaction support)
|
|
24
|
+
├── external-model/ — Adapter-based external data sources
|
|
25
|
+
├── fixtures/ — Seed data loading
|
|
26
|
+
├── helpers/ — Shared utilities
|
|
27
|
+
├── hooks/ — Hook registry, executor, middleware pipeline, context builder
|
|
28
|
+
├── jobs/ — Job registry, worker, scheduler, enqueue
|
|
29
|
+
├── model-api/ — Model access layer (query builder, filters, scopes, includes)
|
|
30
|
+
├── plugins/ — Plugin lifecycle, adapter registry, loader
|
|
31
|
+
├── schema/ — SchemaRegistry, relationship resolution, types
|
|
32
|
+
├── services/ — ServiceRegistry, service definitions
|
|
33
|
+
├── validation/ — Model-level validation rules
|
|
34
|
+
├── widgets/ — Server-side widget registry (for studio)
|
|
35
|
+
├── context.ts — FrameworkContext builder
|
|
36
|
+
├── errors.ts — AppError base class
|
|
37
|
+
└── index.ts — Public exports
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Key registries (MUST reuse, never recreate)
|
|
41
|
+
|
|
42
|
+
| Registry | Location | Purpose |
|
|
43
|
+
| -------------------- | ----------------------------- | ----------------------------------------------------------------------------------- |
|
|
44
|
+
| `SchemaRegistry` | `schema/registry.ts` | Holds all resolved models, relationships, field metadata. Single instance per boot. |
|
|
45
|
+
| `PermissionRegistry` | `auth/permission-registry.ts` | Maps roles to model/field permissions. |
|
|
46
|
+
| `ScopeRegistry` | `auth/scope-registry.ts` | Defines scope filters per role (tenant isolation, ownership). |
|
|
47
|
+
| `HookRegistry` | `hooks/registry.ts` | Stores validate/beforeSave/afterSave/beforeDelete/afterDelete hooks per model. |
|
|
48
|
+
| `ServiceRegistry` | `services/registry.ts` | Named service definitions, instantiated with context on call. |
|
|
49
|
+
| `JobRegistry` | `jobs/registry.ts` | Background job handlers. |
|
|
50
|
+
| `EventBus` | `events/bus.ts` | In-process event pub/sub with transaction-scoped emit. |
|
|
51
|
+
| `AdapterRegistry` | `plugins/adapter-registry.ts` | External data source adapters (REST, GraphQL, etc). |
|
|
52
|
+
| `WidgetRegistry` | `widgets/widget-registry.ts` | Server-side widget definitions for studio. |
|
|
53
|
+
|
|
54
|
+
## Model access layer
|
|
55
|
+
|
|
56
|
+
All CRUD operations go through `createModelAccess()` in `model-api/index.ts`. This provides:
|
|
57
|
+
|
|
58
|
+
- `models.get(model, id)` — fetch single record
|
|
59
|
+
- `models.query(model)` — returns a `ModelQueryBuilder` with filter/sort/paginate/include
|
|
60
|
+
- `models.create(model, data)` — insert with auth context
|
|
61
|
+
- `models.update(model, id, data)` — update with auth context
|
|
62
|
+
- `models.delete(model, id)` — delete with auth context
|
|
63
|
+
|
|
64
|
+
The query builder handles:
|
|
65
|
+
|
|
66
|
+
- Scope enforcement (`scope-enforcer.ts`) — auto-applies tenant/ownership filters
|
|
67
|
+
- Field-level access (`field-access.ts`) — strips hidden fields, enforces readOnly
|
|
68
|
+
- Filter translation (`filter-translator.ts`) — converts API filter syntax to Kysely where clauses
|
|
69
|
+
- Include resolution (`include-resolver.ts`) — resolves relationships and external model joins
|
|
70
|
+
|
|
71
|
+
Never write raw Kysely queries for model CRUD. Use `createModelAccess` or the existing `KyselyModelOps`.
|
|
72
|
+
|
|
73
|
+
## Hook pipeline
|
|
74
|
+
|
|
75
|
+
Hooks run inside a transaction via `hooks/executor.ts`:
|
|
76
|
+
|
|
77
|
+
1. `validate` — can throw to reject the operation
|
|
78
|
+
2. `beforeCreate` / `beforeUpdate` / `beforeSave` — can mutate the data before write
|
|
79
|
+
3. (database write happens here)
|
|
80
|
+
4. `afterCreate` / `afterUpdate` / `afterSave` — side effects after successful write
|
|
81
|
+
5. `beforeDelete` / `afterDelete` — same pattern for deletes
|
|
82
|
+
|
|
83
|
+
Hooks receive a `FrameworkContext` built by `hooks/context.ts`. This context provides: `db` (transaction), `schema`, `auth`, `models`, `events`, `config`, `service`, `enqueue`.
|
|
84
|
+
|
|
85
|
+
Never create a parallel context builder. Use `createHookContext()`.
|
|
86
|
+
|
|
87
|
+
## FrameworkContext (quick reference)
|
|
88
|
+
|
|
89
|
+
This is the single object passed to all hooks, services, and jobs. Defined in `@rangka/shared/src/types/context.ts`, built by `src/hooks/context.ts`.
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
interface FrameworkContext {
|
|
93
|
+
db: Kysely<unknown>; // transaction-scoped connection
|
|
94
|
+
schema: SchemaRegistryInterface; // model/field/relationship lookups
|
|
95
|
+
scope: unknown; // current tenant/scope value
|
|
96
|
+
models: ModelAccessInterface; // CRUD with scopes + permissions
|
|
97
|
+
events: { emit; on }; // transaction-scoped pub/sub
|
|
98
|
+
auth: { user; roles }; // current user identity
|
|
99
|
+
config: Record<string, unknown>; // app configuration
|
|
100
|
+
service: (name) => ServiceInstance; // call other services
|
|
101
|
+
enqueue: (job, data, opts?) => Promise<void>; // background jobs
|
|
102
|
+
notify: (channel, message) => void;
|
|
103
|
+
email: { send: (template, options) => Promise<void> };
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Rules:
|
|
108
|
+
|
|
109
|
+
- All data access goes through `ctx.models` (not raw Kysely for CRUD)
|
|
110
|
+
- All events go through `ctx.events.emit` (not custom pub/sub)
|
|
111
|
+
- All background work goes through `ctx.enqueue` (not custom dispatchers)
|
|
112
|
+
- All cross-service calls go through `ctx.service(name)` (not direct imports)
|
|
113
|
+
- Use `ctx.db` directly ONLY for queries ModelQueryInterface cannot express (aggregations, complex joins)
|
|
114
|
+
|
|
115
|
+
## Helper utilities (MUST reuse)
|
|
116
|
+
|
|
117
|
+
| Utility | Location | Purpose |
|
|
118
|
+
| ----------------------------------- | ------------------------------- | --------------------------------------------- |
|
|
119
|
+
| `stampCreate` | `helpers/stamping.ts` | Adds `created_at`, `created_by` fields |
|
|
120
|
+
| `stampUpdate` | `helpers/stamping.ts` | Adds `updated_at`, `updated_by` fields |
|
|
121
|
+
| `assertOwnership` | `helpers/assert-ownership.ts` | Verifies record belongs to current user/scope |
|
|
122
|
+
| `findMissingRequiredFields` | `helpers/validation.ts` | Checks required fields before write |
|
|
123
|
+
| `validateFields` | `validation/field-validator.ts` | Validates field values against schema |
|
|
124
|
+
| `BadRequestError` / `NotFoundError` | `errors.ts` | Standard error classes for API responses |
|
|
125
|
+
| `AppError` | `errors.ts` | Base error class with code + status |
|
|
126
|
+
|
|
127
|
+
Never recreate validation, stamping, or ownership logic. These helpers are used by the middleware layer and must be consistent.
|
|
128
|
+
|
|
129
|
+
## Boot sequence
|
|
130
|
+
|
|
131
|
+
`boot/index.ts` orchestrates startup:
|
|
132
|
+
|
|
133
|
+
1. Discover apps (file system or programmatic)
|
|
134
|
+
2. Load and merge schemas (YAML model definitions)
|
|
135
|
+
3. Build SchemaRegistry with resolved relationships
|
|
136
|
+
4. Create DatabaseClient, run autoSync (DDL diff)
|
|
137
|
+
5. Create Fastify server
|
|
138
|
+
6. Register all registries (hooks, services, jobs, permissions, scopes, events)
|
|
139
|
+
7. Generate API routes from resolved models
|
|
140
|
+
8. Load and initialize plugins
|
|
141
|
+
|
|
142
|
+
## API route generation
|
|
143
|
+
|
|
144
|
+
`api/route-generator.ts` auto-generates REST endpoints for every model:
|
|
145
|
+
|
|
146
|
+
- `GET /api/{module}/{model}` — list with filters, sort, pagination
|
|
147
|
+
- `GET /api/{module}/{model}/:id` — get by ID
|
|
148
|
+
- `POST /api/{module}/{model}` — create
|
|
149
|
+
- `PATCH /api/{module}/{model}/:id` — update
|
|
150
|
+
- `DELETE /api/{module}/{model}/:id` — delete
|
|
151
|
+
|
|
152
|
+
Custom routes are added via services or plugins. Never duplicate the auto-generated CRUD pattern.
|
|
153
|
+
|
|
154
|
+
## Commands
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
pnpm --filter @rangka/core build # Build → dist/
|
|
158
|
+
pnpm --filter @rangka/core test # Unit tests
|
|
159
|
+
pnpm test:integration # Integration tests (from repo root, needs PostgreSQL)
|
|
160
|
+
pnpm test:integration -- tests/integration/path/to/file.test.ts # Single integration test
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Skills available
|
|
164
|
+
|
|
165
|
+
- **`extend-core`** — step-by-step for modifying core internals (registries, hook pipeline, route generator, FrameworkContext)
|
|
166
|
+
|
|
167
|
+
Read this skill before modifying any core internal.
|
|
168
|
+
|
|
169
|
+
## Don'ts
|
|
170
|
+
|
|
171
|
+
- Don't write raw SQL — use Kysely query builder via `DatabaseClient` or `KyselyModelOps`
|
|
172
|
+
- Don't bypass `createModelAccess` for CRUD — it enforces scopes and permissions
|
|
173
|
+
- Don't create new registries — extend existing ones or add methods to them
|
|
174
|
+
- Don't build a new context object — use `createHookContext()` or `createFrameworkContext()`
|
|
175
|
+
- Don't add Fastify routes manually — use the route generator or service system
|
|
176
|
+
- Don't duplicate filter/sort/pagination logic — use `ModelQueryBuilder`
|
|
177
|
+
- Don't access `SchemaRegistry` fields directly — use its methods (`getModel`, `getRelationships`, etc.)
|
|
178
|
+
- Don't add new hook phases — use the existing validate/beforeSave/afterSave/beforeDelete/afterDelete
|
|
179
|
+
- Don't create new transaction boundaries inside hooks — hooks already run in a transaction
|
|
180
|
+
- Don't import from `@rangka/client` — this is a server package, client is browser-only
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rangka
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# @rangka/core
|
|
2
|
+
|
|
3
|
+
Server-side runtime engine for the Rangka framework.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
This package boots a complete Fastify server from declarative model/page definitions. It handles module discovery, schema resolution, database sync, REST API generation, authentication, lifecycle hooks, background jobs, and events. All server-side behavior lives here.
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
src/
|
|
13
|
+
├── api/ — Fastify server, route generation, handlers, OpenAPI schema
|
|
14
|
+
├── audit/ — Audit trail recording
|
|
15
|
+
├── auth/ — JWT sessions, permissions, scopes, field-level access
|
|
16
|
+
├── boot/ — Boot sequence: discovery, schema loading, merging, registry init
|
|
17
|
+
├── db/ — DatabaseClient, auto-sync (DiffEngine), model-ops (Kysely CRUD)
|
|
18
|
+
├── events/ — EventBus (transaction-scoped pub/sub)
|
|
19
|
+
├── external-model/ — Adapter-based external data sources
|
|
20
|
+
├── fixtures/ — Seed data loading
|
|
21
|
+
├── helpers/ — Stamping, ownership checks, validation utilities
|
|
22
|
+
├── hooks/ — Hook registry, executor, middleware, context builder
|
|
23
|
+
├── jobs/ — Job registry, worker, scheduler, enqueue
|
|
24
|
+
├── model-api/ — Query builder, filter translation, scope enforcement, includes
|
|
25
|
+
├── plugins/ — Plugin lifecycle, adapter registry, loader
|
|
26
|
+
├── schema/ — SchemaRegistry, relationship resolution
|
|
27
|
+
├── services/ — ServiceRegistry, service factory
|
|
28
|
+
├── validation/ — Field-level validation engine
|
|
29
|
+
├── widgets/ — Server-side widget registry (for studio)
|
|
30
|
+
├── context.ts — FrameworkContext builder
|
|
31
|
+
├── errors.ts — AppError, BadRequestError, NotFoundError
|
|
32
|
+
└── index.ts — Public exports
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Key internal systems
|
|
36
|
+
|
|
37
|
+
| System | Entry point | Purpose |
|
|
38
|
+
| ----------- | ----------------------------- | ---------------------------------------------- |
|
|
39
|
+
| Boot | `boot/index.ts` | Orchestrates full server startup |
|
|
40
|
+
| Schema | `schema/registry.ts` | Holds resolved models and relationships |
|
|
41
|
+
| Model API | `model-api/index.ts` | CRUD with scopes, permissions, filters |
|
|
42
|
+
| Hooks | `hooks/executor.ts` | Lifecycle pipeline (validate → before → after) |
|
|
43
|
+
| Middleware | `hooks/middleware.ts` | Wraps hooks into Fastify request handlers |
|
|
44
|
+
| Routes | `api/route-generator.ts` | Auto-generates REST endpoints per model |
|
|
45
|
+
| Auth | `auth/session.ts` | JWT session management |
|
|
46
|
+
| Permissions | `auth/permission-registry.ts` | Role-based model/field access |
|
|
47
|
+
| Scopes | `auth/scope-registry.ts` | Row-level tenant isolation |
|
|
48
|
+
| Services | `services/registry.ts` | Named business logic with DI |
|
|
49
|
+
| Jobs | `jobs/registry.ts` | Background job processing |
|
|
50
|
+
| Events | `events/bus.ts` | Transaction-scoped pub/sub |
|
|
51
|
+
|
|
52
|
+
## Commands
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
pnpm --filter @rangka/core build # Compile TypeScript
|
|
56
|
+
pnpm --filter @rangka/core test # Unit tests
|
|
57
|
+
pnpm test:integration # Integration tests (from repo root)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Contributing
|
|
61
|
+
|
|
62
|
+
- All data access in hooks/services goes through `ctx.models` (the ModelAccess interface). Never write raw Kysely for basic CRUD.
|
|
63
|
+
- All hooks/services/jobs receive `FrameworkContext`. Use it. Don't build parallel context objects.
|
|
64
|
+
- The hook pipeline is fixed: validate → beforeSave → (write) → afterSave. Don't add new phases.
|
|
65
|
+
- Route handlers are auto-generated by `route-generator.ts`. Don't duplicate CRUD routes manually.
|
|
66
|
+
- Registries are singletons created at boot. Extend existing ones, don't create new ones for the same purpose.
|
|
67
|
+
- Helper utilities (`helpers/stamping.ts`, `helpers/validation.ts`, `helpers/assert-ownership.ts`) must be reused. Don't recreate stamping or ownership logic.
|
|
68
|
+
- This package imports from `@rangka/shared` only. Never import from `@rangka/client`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerce.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/coerce.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { toBool, toInt, isNil, toCount } from '../helpers/coerce.js';
|
|
3
|
+
describe('toBool', () => {
|
|
4
|
+
it('returns true for boolean true', () => {
|
|
5
|
+
expect(toBool(true)).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
it('returns true for string "true"', () => {
|
|
8
|
+
expect(toBool('true')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('returns true for number 1', () => {
|
|
11
|
+
expect(toBool(1)).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it('returns true for string "1"', () => {
|
|
14
|
+
expect(toBool('1')).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it('returns false for boolean false', () => {
|
|
17
|
+
expect(toBool(false)).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
it('returns false for string "false"', () => {
|
|
20
|
+
expect(toBool('false')).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it('returns false for 0', () => {
|
|
23
|
+
expect(toBool(0)).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it('returns false for null', () => {
|
|
26
|
+
expect(toBool(null)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('returns false for undefined', () => {
|
|
29
|
+
expect(toBool(undefined)).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it('returns false for empty string', () => {
|
|
32
|
+
expect(toBool('')).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
it('returns false for arbitrary string', () => {
|
|
35
|
+
expect(toBool('yes')).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('toInt', () => {
|
|
39
|
+
it('returns the integer for a number', () => {
|
|
40
|
+
expect(toInt(42)).toBe(42);
|
|
41
|
+
});
|
|
42
|
+
it('truncates floating point numbers', () => {
|
|
43
|
+
expect(toInt(3.9)).toBe(3);
|
|
44
|
+
expect(toInt(-2.7)).toBe(-2);
|
|
45
|
+
});
|
|
46
|
+
it('parses numeric strings', () => {
|
|
47
|
+
expect(toInt('10')).toBe(10);
|
|
48
|
+
expect(toInt(' 5 ')).toBe(5);
|
|
49
|
+
});
|
|
50
|
+
it('returns fallback for NaN values', () => {
|
|
51
|
+
expect(toInt('abc')).toBe(0);
|
|
52
|
+
expect(toInt('abc', -1)).toBe(-1);
|
|
53
|
+
});
|
|
54
|
+
it('returns fallback for null', () => {
|
|
55
|
+
expect(toInt(null)).toBe(0);
|
|
56
|
+
expect(toInt(null, 99)).toBe(99);
|
|
57
|
+
});
|
|
58
|
+
it('returns fallback for undefined', () => {
|
|
59
|
+
expect(toInt(undefined)).toBe(0);
|
|
60
|
+
});
|
|
61
|
+
it('returns fallback for Infinity', () => {
|
|
62
|
+
expect(toInt(Infinity)).toBe(0);
|
|
63
|
+
expect(toInt(-Infinity, 5)).toBe(5);
|
|
64
|
+
});
|
|
65
|
+
it('returns fallback for empty string', () => {
|
|
66
|
+
expect(toInt('')).toBe(0);
|
|
67
|
+
});
|
|
68
|
+
it('handles string with leading zeros', () => {
|
|
69
|
+
expect(toInt('007')).toBe(7);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('isNil', () => {
|
|
73
|
+
it('returns true for null', () => {
|
|
74
|
+
expect(isNil(null)).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it('returns true for undefined', () => {
|
|
77
|
+
expect(isNil(undefined)).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('returns false for 0', () => {
|
|
80
|
+
expect(isNil(0)).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
it('returns false for empty string', () => {
|
|
83
|
+
expect(isNil('')).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('returns false for false', () => {
|
|
86
|
+
expect(isNil(false)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
it('returns false for NaN', () => {
|
|
89
|
+
expect(isNil(NaN)).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it('returns false for objects', () => {
|
|
92
|
+
expect(isNil({})).toBe(false);
|
|
93
|
+
expect(isNil([])).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('toCount', () => {
|
|
97
|
+
it('extracts count from object', () => {
|
|
98
|
+
expect(toCount({ count: '5' })).toBe(5);
|
|
99
|
+
expect(toCount({ count: 10 })).toBe(10);
|
|
100
|
+
});
|
|
101
|
+
it('returns 0 for null', () => {
|
|
102
|
+
expect(toCount(null)).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
it('returns 0 for undefined', () => {
|
|
105
|
+
expect(toCount(undefined)).toBe(0);
|
|
106
|
+
});
|
|
107
|
+
it('returns 0 when count is missing', () => {
|
|
108
|
+
expect(toCount({})).toBe(0);
|
|
109
|
+
});
|
|
110
|
+
it('returns 0 when count is not a number', () => {
|
|
111
|
+
expect(toCount({ count: 'abc' })).toBe(0);
|
|
112
|
+
});
|
|
113
|
+
it('handles bigint-style string from database', () => {
|
|
114
|
+
expect(toCount({ count: '12345' })).toBe(12345);
|
|
115
|
+
});
|
|
116
|
+
it('handles raw numeric value without object wrapper', () => {
|
|
117
|
+
expect(toCount(7)).toBe(7);
|
|
118
|
+
expect(toCount('3')).toBe(3);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=coerce.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerce.test.js","sourceRoot":"","sources":["../../src/__tests__/coerce.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { createFrameworkContext, createRequestContext } from '../context.js';
|
|
3
|
+
import { ServiceRegistry } from '../services/registry.js';
|
|
4
|
+
import { EventBus } from '../events/bus.js';
|
|
5
|
+
import { SchemaRegistry } from '../schema/registry.js';
|
|
6
|
+
describe('createFrameworkContext', () => {
|
|
7
|
+
function setup() {
|
|
8
|
+
const kysely = { fake: 'db' };
|
|
9
|
+
const db = {
|
|
10
|
+
kysely,
|
|
11
|
+
selectFrom: () => { },
|
|
12
|
+
insertInto: () => { },
|
|
13
|
+
updateTable: () => { },
|
|
14
|
+
deleteFrom: () => { },
|
|
15
|
+
};
|
|
16
|
+
const schema = new SchemaRegistry([]);
|
|
17
|
+
const eventBus = new EventBus();
|
|
18
|
+
const serviceRegistry = new ServiceRegistry();
|
|
19
|
+
return { db, kysely, schema, eventBus, serviceRegistry };
|
|
20
|
+
}
|
|
21
|
+
it('returns context with all fields populated', () => {
|
|
22
|
+
const { db, kysely, schema, eventBus, serviceRegistry } = setup();
|
|
23
|
+
const ctx = createFrameworkContext({
|
|
24
|
+
db,
|
|
25
|
+
schema,
|
|
26
|
+
eventBus,
|
|
27
|
+
serviceRegistry,
|
|
28
|
+
config: { env: 'test' },
|
|
29
|
+
});
|
|
30
|
+
expect(ctx.db).toBe(kysely);
|
|
31
|
+
expect(ctx.schema).toBe(schema);
|
|
32
|
+
expect(ctx.events.emit).toBeTypeOf('function');
|
|
33
|
+
expect(ctx.events.on).toBeTypeOf('function');
|
|
34
|
+
expect(ctx.auth).toEqual({ user: null, roles: [] });
|
|
35
|
+
expect(ctx.config).toEqual({ env: 'test' });
|
|
36
|
+
expect(ctx.service).toBeTypeOf('function');
|
|
37
|
+
expect(ctx.enqueue).toBeTypeOf('function');
|
|
38
|
+
expect(ctx.notify).toBeTypeOf('function');
|
|
39
|
+
expect(ctx.email.send).toBeTypeOf('function');
|
|
40
|
+
});
|
|
41
|
+
it('service() resolves registered services', () => {
|
|
42
|
+
const { db, schema, eventBus, serviceRegistry } = setup();
|
|
43
|
+
serviceRegistry.register({
|
|
44
|
+
name: 'pricing',
|
|
45
|
+
factory: () => ({ calculate: (x) => x }),
|
|
46
|
+
});
|
|
47
|
+
const ctx = createFrameworkContext({ db, schema, eventBus, serviceRegistry });
|
|
48
|
+
const pricing = ctx.service('pricing');
|
|
49
|
+
expect(pricing.calculate(100)).toBe(100);
|
|
50
|
+
});
|
|
51
|
+
it('defaults config to empty object', () => {
|
|
52
|
+
const { db, schema, eventBus, serviceRegistry } = setup();
|
|
53
|
+
const ctx = createFrameworkContext({ db, schema, eventBus, serviceRegistry });
|
|
54
|
+
expect(ctx.config).toEqual({});
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('createRequestContext', () => {
|
|
58
|
+
function setup() {
|
|
59
|
+
const kysely = { fake: 'db' };
|
|
60
|
+
const db = {
|
|
61
|
+
kysely,
|
|
62
|
+
selectFrom: () => { },
|
|
63
|
+
insertInto: () => { },
|
|
64
|
+
updateTable: () => { },
|
|
65
|
+
deleteFrom: () => { },
|
|
66
|
+
};
|
|
67
|
+
const schema = new SchemaRegistry([]);
|
|
68
|
+
const eventBus = new EventBus();
|
|
69
|
+
const serviceRegistry = new ServiceRegistry();
|
|
70
|
+
const base = createFrameworkContext({ db, schema, eventBus, serviceRegistry });
|
|
71
|
+
return { base, kysely };
|
|
72
|
+
}
|
|
73
|
+
it('inherits from base context', () => {
|
|
74
|
+
const { base } = setup();
|
|
75
|
+
const auth = { user: { id: '1', email: 'admin@test.com' } };
|
|
76
|
+
const reqCtx = createRequestContext({ base, auth, roles: ['Administrator'] });
|
|
77
|
+
expect(reqCtx.schema).toBe(base.schema);
|
|
78
|
+
expect(reqCtx.service).toBe(base.service);
|
|
79
|
+
expect(reqCtx.auth).toEqual({
|
|
80
|
+
user: { id: '1', email: 'admin@test.com' },
|
|
81
|
+
roles: ['Administrator'],
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it('uses transaction db when provided', () => {
|
|
85
|
+
const { base } = setup();
|
|
86
|
+
const trx = { fake: 'trx' };
|
|
87
|
+
const auth = {};
|
|
88
|
+
const reqCtx = createRequestContext({ base, auth, trx });
|
|
89
|
+
expect(reqCtx.db).toBe(trx);
|
|
90
|
+
expect(reqCtx.db).not.toBe(base.db);
|
|
91
|
+
});
|
|
92
|
+
it('uses base db when no transaction provided', () => {
|
|
93
|
+
const { base } = setup();
|
|
94
|
+
const auth = {};
|
|
95
|
+
const reqCtx = createRequestContext({ base, auth });
|
|
96
|
+
expect(reqCtx.db).toBe(base.db);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=context.test.js.map
|