@jantstack/adonis-authz 2.5.0-alpha.3 → 2.5.0-rc.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/README.md +437 -48
- package/build/commands/authz_catalog_diff.d.ts +0 -1
- package/build/commands/authz_catalog_diff.js +0 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts +17 -3
- package/build/commands/authz_catalog_prune_orphans.js +28 -6
- package/build/commands/authz_catalog_sync.d.ts +0 -1
- package/build/commands/authz_catalog_sync.js +0 -1
- package/build/commands/authz_freeze.d.ts +0 -1
- package/build/commands/authz_freeze.js +0 -1
- package/build/commands/authz_reconcile.d.ts +0 -1
- package/build/commands/authz_reconcile.js +0 -1
- package/build/commands/authz_relations_reconcile.d.ts +0 -1
- package/build/commands/authz_relations_reconcile.js +56 -8
- package/build/commands/authz_scopes_relay.d.ts +0 -1
- package/build/commands/authz_scopes_relay.js +54 -6
- package/build/commands/authz_scopes_requeue.d.ts +0 -1
- package/build/commands/authz_scopes_requeue.js +16 -3
- package/build/commands/authz_unfreeze.d.ts +0 -1
- package/build/commands/authz_unfreeze.js +0 -1
- package/build/commands/main.d.ts +0 -1
- package/build/commands/main.js +0 -1
- package/build/commands/openfga_provision.d.ts +10 -1
- package/build/commands/openfga_provision.js +43 -3
- package/build/configure.d.ts +0 -1
- package/build/configure.js +0 -1
- package/build/index.d.ts +9 -7
- package/build/index.js +10 -3
- package/build/providers/authz_provider.d.ts +0 -1
- package/build/providers/authz_provider.js +0 -1
- package/build/services/main.d.ts +0 -1
- package/build/services/main.js +0 -1
- package/build/services/relations.d.ts +0 -1
- package/build/services/relations.js +0 -1
- package/build/src/catalog/catalog.d.ts +0 -1
- package/build/src/catalog/catalog.js +0 -1
- package/build/src/catalog/catalog_cache.d.ts +13 -1
- package/build/src/catalog/catalog_cache.js +27 -2
- package/build/src/clock.d.ts +0 -1
- package/build/src/clock.js +0 -1
- package/build/src/define_config.d.ts +0 -1
- package/build/src/define_config.js +24 -1
- package/build/src/drivers/database_driver.d.ts +60 -3
- package/build/src/drivers/database_driver.js +160 -25
- package/build/src/drivers/database_relations_driver.d.ts +11 -5
- package/build/src/drivers/database_relations_driver.js +115 -33
- package/build/src/drivers/openfga_driver.d.ts +159 -26
- package/build/src/drivers/openfga_driver.js +882 -199
- package/build/src/drivers/openfga_facts.d.ts +91 -1
- package/build/src/drivers/openfga_facts.js +277 -3
- package/build/src/drivers/openfga_relations_driver.d.ts +41 -13
- package/build/src/drivers/openfga_relations_driver.js +422 -228
- package/build/src/errors.d.ts +160 -1
- package/build/src/errors.js +161 -1
- package/build/src/expiry.d.ts +51 -2
- package/build/src/expiry.js +96 -2
- package/build/src/freeze.d.ts +0 -1
- package/build/src/freeze.js +0 -1
- package/build/src/hierarchical_resolver.d.ts +0 -1
- package/build/src/hierarchical_resolver.js +0 -1
- package/build/src/http/app_access_middleware.d.ts +0 -1
- package/build/src/http/app_access_middleware.js +0 -1
- package/build/src/http/resource_access_middleware.d.ts +0 -1
- package/build/src/http/resource_access_middleware.js +0 -1
- package/build/src/identity.d.ts +9 -2
- package/build/src/identity.js +33 -1
- package/build/src/manager.d.ts +24 -1
- package/build/src/manager.js +381 -85
- package/build/src/memoize_ancestors.d.ts +0 -1
- package/build/src/memoize_ancestors.js +0 -1
- package/build/src/models/authz_assignment.d.ts +5 -6
- package/build/src/models/authz_assignment.js +0 -1
- package/build/src/models/authz_deny.d.ts +5 -6
- package/build/src/models/authz_deny.js +0 -1
- package/build/src/models/authz_permission.d.ts +5 -6
- package/build/src/models/authz_permission.js +0 -1
- package/build/src/models/authz_role.d.ts +5 -6
- package/build/src/models/authz_role.js +0 -1
- package/build/src/models/authz_role_permission.d.ts +5 -6
- package/build/src/models/authz_role_permission.js +0 -1
- package/build/src/openfga.d.ts +2 -3
- package/build/src/openfga.js +4 -2
- package/build/src/reconcile.d.ts +0 -1
- package/build/src/reconcile.js +0 -1
- package/build/src/relation_partition_trigger.d.ts +0 -1
- package/build/src/relation_partition_trigger.js +0 -1
- package/build/src/relations/check_many.d.ts +0 -1
- package/build/src/relations/check_many.js +0 -1
- package/build/src/relations/define_relations_config.d.ts +25 -3
- package/build/src/relations/define_relations_config.js +8 -3
- package/build/src/relations/deny_reach.d.ts +102 -0
- package/build/src/relations/deny_reach.js +230 -0
- package/build/src/relations/group_depth.d.ts +215 -0
- package/build/src/relations/group_depth.js +453 -0
- package/build/src/relations/manager.d.ts +14 -7
- package/build/src/relations/manager.js +60 -15
- package/build/src/relations/page.d.ts +19 -0
- package/build/src/relations/page.js +74 -0
- package/build/src/relations/reconcile.d.ts +58 -4
- package/build/src/relations/reconcile.js +266 -12
- package/build/src/relations/tuple_key.d.ts +0 -1
- package/build/src/relations/tuple_key.js +0 -1
- package/build/src/relations/tuple_order.d.ts +5 -4
- package/build/src/relations/tuple_order.js +5 -4
- package/build/src/relations_config_store.d.ts +57 -2
- package/build/src/relations_config_store.js +155 -5
- package/build/src/relations_reconcile.d.ts +0 -1
- package/build/src/relations_reconcile.js +0 -1
- package/build/src/scope_outbox.d.ts +36 -3
- package/build/src/scope_outbox.js +78 -18
- package/build/src/shared/backend_guard.d.ts +52 -1
- package/build/src/shared/backend_guard.js +164 -2
- package/build/src/shared/sql_expiry.d.ts +0 -1
- package/build/src/shared/sql_expiry.js +0 -1
- package/build/src/shared/transaction_guard.d.ts +0 -1
- package/build/src/shared/transaction_guard.js +0 -1
- package/build/src/sql_descendants.d.ts +0 -1
- package/build/src/sql_descendants.js +0 -1
- package/build/src/testing/contract.d.ts +26 -3
- package/build/src/testing/contract.js +258 -20
- package/build/src/testing/main.d.ts +0 -1
- package/build/src/testing/main.js +0 -1
- package/build/src/testing/migration_contract.d.ts +0 -1
- package/build/src/testing/migration_contract.js +0 -1
- package/build/src/testing/relations_contract.d.ts +7 -1
- package/build/src/testing/relations_contract.js +174 -7
- package/build/src/testing/relations_reconcile_contract.d.ts +0 -1
- package/build/src/testing/relations_reconcile_contract.js +0 -1
- package/build/src/testing/scope_outbox_contract.d.ts +0 -1
- package/build/src/testing/scope_outbox_contract.js +0 -1
- package/build/src/testing/scope_tree.d.ts +0 -1
- package/build/src/testing/scope_tree.js +0 -1
- package/build/src/testing/test_clock.d.ts +0 -1
- package/build/src/testing/test_clock.js +0 -1
- package/build/src/traits/authz_scopes.d.ts +0 -1
- package/build/src/traits/authz_scopes.js +0 -1
- package/build/src/traits/has_uuid.d.ts +5 -6
- package/build/src/traits/has_uuid.js +0 -1
- package/build/src/types.d.ts +138 -14
- package/build/src/types.js +6 -1
- package/build/stubs/config/authorization.stub +22 -6
- package/build/stubs/main.d.ts +0 -1
- package/build/stubs/main.js +0 -1
- package/package.json +4 -3
- package/build/commands/authz_catalog_diff.d.ts.map +0 -1
- package/build/commands/authz_catalog_diff.js.map +0 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts.map +0 -1
- package/build/commands/authz_catalog_prune_orphans.js.map +0 -1
- package/build/commands/authz_catalog_sync.d.ts.map +0 -1
- package/build/commands/authz_catalog_sync.js.map +0 -1
- package/build/commands/authz_freeze.d.ts.map +0 -1
- package/build/commands/authz_freeze.js.map +0 -1
- package/build/commands/authz_reconcile.d.ts.map +0 -1
- package/build/commands/authz_reconcile.js.map +0 -1
- package/build/commands/authz_relations_reconcile.d.ts.map +0 -1
- package/build/commands/authz_relations_reconcile.js.map +0 -1
- package/build/commands/authz_scopes_relay.d.ts.map +0 -1
- package/build/commands/authz_scopes_relay.js.map +0 -1
- package/build/commands/authz_scopes_requeue.d.ts.map +0 -1
- package/build/commands/authz_scopes_requeue.js.map +0 -1
- package/build/commands/authz_unfreeze.d.ts.map +0 -1
- package/build/commands/authz_unfreeze.js.map +0 -1
- package/build/commands/main.d.ts.map +0 -1
- package/build/commands/main.js.map +0 -1
- package/build/commands/openfga_provision.d.ts.map +0 -1
- package/build/commands/openfga_provision.js.map +0 -1
- package/build/configure.d.ts.map +0 -1
- package/build/configure.js.map +0 -1
- package/build/index.d.ts.map +0 -1
- package/build/index.js.map +0 -1
- package/build/providers/authz_provider.d.ts.map +0 -1
- package/build/providers/authz_provider.js.map +0 -1
- package/build/services/main.d.ts.map +0 -1
- package/build/services/main.js.map +0 -1
- package/build/services/relations.d.ts.map +0 -1
- package/build/services/relations.js.map +0 -1
- package/build/src/catalog/catalog.d.ts.map +0 -1
- package/build/src/catalog/catalog.js.map +0 -1
- package/build/src/catalog/catalog_cache.d.ts.map +0 -1
- package/build/src/catalog/catalog_cache.js.map +0 -1
- package/build/src/clock.d.ts.map +0 -1
- package/build/src/clock.js.map +0 -1
- package/build/src/define_config.d.ts.map +0 -1
- package/build/src/define_config.js.map +0 -1
- package/build/src/drivers/database_driver.d.ts.map +0 -1
- package/build/src/drivers/database_driver.js.map +0 -1
- package/build/src/drivers/database_relations_driver.d.ts.map +0 -1
- package/build/src/drivers/database_relations_driver.js.map +0 -1
- package/build/src/drivers/openfga_driver.d.ts.map +0 -1
- package/build/src/drivers/openfga_driver.js.map +0 -1
- package/build/src/drivers/openfga_facts.d.ts.map +0 -1
- package/build/src/drivers/openfga_facts.js.map +0 -1
- package/build/src/drivers/openfga_relations_driver.d.ts.map +0 -1
- package/build/src/drivers/openfga_relations_driver.js.map +0 -1
- package/build/src/errors.d.ts.map +0 -1
- package/build/src/errors.js.map +0 -1
- package/build/src/expiry.d.ts.map +0 -1
- package/build/src/expiry.js.map +0 -1
- package/build/src/freeze.d.ts.map +0 -1
- package/build/src/freeze.js.map +0 -1
- package/build/src/hierarchical_resolver.d.ts.map +0 -1
- package/build/src/hierarchical_resolver.js.map +0 -1
- package/build/src/http/app_access_middleware.d.ts.map +0 -1
- package/build/src/http/app_access_middleware.js.map +0 -1
- package/build/src/http/resource_access_middleware.d.ts.map +0 -1
- package/build/src/http/resource_access_middleware.js.map +0 -1
- package/build/src/identity.d.ts.map +0 -1
- package/build/src/identity.js.map +0 -1
- package/build/src/manager.d.ts.map +0 -1
- package/build/src/manager.js.map +0 -1
- package/build/src/memoize_ancestors.d.ts.map +0 -1
- package/build/src/memoize_ancestors.js.map +0 -1
- package/build/src/models/authz_assignment.d.ts.map +0 -1
- package/build/src/models/authz_assignment.js.map +0 -1
- package/build/src/models/authz_deny.d.ts.map +0 -1
- package/build/src/models/authz_deny.js.map +0 -1
- package/build/src/models/authz_permission.d.ts.map +0 -1
- package/build/src/models/authz_permission.js.map +0 -1
- package/build/src/models/authz_role.d.ts.map +0 -1
- package/build/src/models/authz_role.js.map +0 -1
- package/build/src/models/authz_role_permission.d.ts.map +0 -1
- package/build/src/models/authz_role_permission.js.map +0 -1
- package/build/src/openfga.d.ts.map +0 -1
- package/build/src/openfga.js.map +0 -1
- package/build/src/reconcile.d.ts.map +0 -1
- package/build/src/reconcile.js.map +0 -1
- package/build/src/relation_partition_trigger.d.ts.map +0 -1
- package/build/src/relation_partition_trigger.js.map +0 -1
- package/build/src/relations/check_many.d.ts.map +0 -1
- package/build/src/relations/check_many.js.map +0 -1
- package/build/src/relations/define_relations_config.d.ts.map +0 -1
- package/build/src/relations/define_relations_config.js.map +0 -1
- package/build/src/relations/manager.d.ts.map +0 -1
- package/build/src/relations/manager.js.map +0 -1
- package/build/src/relations/reconcile.d.ts.map +0 -1
- package/build/src/relations/reconcile.js.map +0 -1
- package/build/src/relations/tuple_key.d.ts.map +0 -1
- package/build/src/relations/tuple_key.js.map +0 -1
- package/build/src/relations/tuple_order.d.ts.map +0 -1
- package/build/src/relations/tuple_order.js.map +0 -1
- package/build/src/relations_config_store.d.ts.map +0 -1
- package/build/src/relations_config_store.js.map +0 -1
- package/build/src/relations_reconcile.d.ts.map +0 -1
- package/build/src/relations_reconcile.js.map +0 -1
- package/build/src/scope_outbox.d.ts.map +0 -1
- package/build/src/scope_outbox.js.map +0 -1
- package/build/src/shared/backend_guard.d.ts.map +0 -1
- package/build/src/shared/backend_guard.js.map +0 -1
- package/build/src/shared/sql_expiry.d.ts.map +0 -1
- package/build/src/shared/sql_expiry.js.map +0 -1
- package/build/src/shared/transaction_guard.d.ts.map +0 -1
- package/build/src/shared/transaction_guard.js.map +0 -1
- package/build/src/sql_descendants.d.ts.map +0 -1
- package/build/src/sql_descendants.js.map +0 -1
- package/build/src/testing/contract.d.ts.map +0 -1
- package/build/src/testing/contract.js.map +0 -1
- package/build/src/testing/main.d.ts.map +0 -1
- package/build/src/testing/main.js.map +0 -1
- package/build/src/testing/migration_contract.d.ts.map +0 -1
- package/build/src/testing/migration_contract.js.map +0 -1
- package/build/src/testing/relations_contract.d.ts.map +0 -1
- package/build/src/testing/relations_contract.js.map +0 -1
- package/build/src/testing/relations_reconcile_contract.d.ts.map +0 -1
- package/build/src/testing/relations_reconcile_contract.js.map +0 -1
- package/build/src/testing/scope_outbox_contract.d.ts.map +0 -1
- package/build/src/testing/scope_outbox_contract.js.map +0 -1
- package/build/src/testing/scope_tree.d.ts.map +0 -1
- package/build/src/testing/scope_tree.js.map +0 -1
- package/build/src/testing/test_clock.d.ts.map +0 -1
- package/build/src/testing/test_clock.js.map +0 -1
- package/build/src/traits/authz_scopes.d.ts.map +0 -1
- package/build/src/traits/authz_scopes.js.map +0 -1
- package/build/src/traits/has_uuid.d.ts.map +0 -1
- package/build/src/traits/has_uuid.js.map +0 -1
- package/build/src/types.d.ts.map +0 -1
- package/build/src/types.js.map +0 -1
- package/build/stubs/main.d.ts.map +0 -1
- package/build/stubs/main.js.map +0 -1
|
@@ -77,6 +77,11 @@ declare const AuthzAssignment_base: {
|
|
|
77
77
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
|
|
78
78
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
79
79
|
};
|
|
80
|
+
before: {
|
|
81
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
82
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
83
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
84
|
+
};
|
|
80
85
|
readonly booted: boolean;
|
|
81
86
|
$columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
|
|
82
87
|
$relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
|
|
@@ -113,11 +118,6 @@ declare const AuthzAssignment_base: {
|
|
|
113
118
|
};
|
|
114
119
|
$defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
|
|
115
120
|
boot: () => void;
|
|
116
|
-
before: {
|
|
117
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
118
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
119
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
120
|
-
};
|
|
121
121
|
create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
122
122
|
createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
123
123
|
createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
@@ -163,4 +163,3 @@ export default class AuthzAssignment extends AuthzAssignment_base {
|
|
|
163
163
|
createdAt: DateTime;
|
|
164
164
|
}
|
|
165
165
|
export {};
|
|
166
|
-
//# sourceMappingURL=authz_assignment.d.ts.map
|
|
@@ -75,6 +75,11 @@ declare const AuthzDeny_base: {
|
|
|
75
75
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
|
|
76
76
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
77
77
|
};
|
|
78
|
+
before: {
|
|
79
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
80
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
81
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
82
|
+
};
|
|
78
83
|
readonly booted: boolean;
|
|
79
84
|
$columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
|
|
80
85
|
$relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
|
|
@@ -111,11 +116,6 @@ declare const AuthzDeny_base: {
|
|
|
111
116
|
};
|
|
112
117
|
$defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
|
|
113
118
|
boot: () => void;
|
|
114
|
-
before: {
|
|
115
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
116
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
117
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
118
|
-
};
|
|
119
119
|
create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
120
120
|
createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
121
121
|
createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
@@ -158,4 +158,3 @@ export default class AuthzDeny extends AuthzDeny_base {
|
|
|
158
158
|
createdAt: DateTime;
|
|
159
159
|
}
|
|
160
160
|
export {};
|
|
161
|
-
//# sourceMappingURL=authz_deny.d.ts.map
|
|
@@ -75,6 +75,11 @@ declare const AuthzPermission_base: {
|
|
|
75
75
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
|
|
76
76
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
77
77
|
};
|
|
78
|
+
before: {
|
|
79
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
80
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
81
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
82
|
+
};
|
|
78
83
|
readonly booted: boolean;
|
|
79
84
|
$columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
|
|
80
85
|
$relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
|
|
@@ -111,11 +116,6 @@ declare const AuthzPermission_base: {
|
|
|
111
116
|
};
|
|
112
117
|
$defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
|
|
113
118
|
boot: () => void;
|
|
114
|
-
before: {
|
|
115
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
116
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
117
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
118
|
-
};
|
|
119
119
|
create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
120
120
|
createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
121
121
|
createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
@@ -162,4 +162,3 @@ export default class AuthzPermission extends AuthzPermission_base {
|
|
|
162
162
|
updatedAt: DateTime;
|
|
163
163
|
}
|
|
164
164
|
export {};
|
|
165
|
-
//# sourceMappingURL=authz_permission.d.ts.map
|
|
@@ -77,6 +77,11 @@ declare const AuthzRole_base: {
|
|
|
77
77
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
|
|
78
78
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
79
79
|
};
|
|
80
|
+
before: {
|
|
81
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
82
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
83
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
84
|
+
};
|
|
80
85
|
readonly booted: boolean;
|
|
81
86
|
$columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
|
|
82
87
|
$relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
|
|
@@ -113,11 +118,6 @@ declare const AuthzRole_base: {
|
|
|
113
118
|
};
|
|
114
119
|
$defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
|
|
115
120
|
boot: () => void;
|
|
116
|
-
before: {
|
|
117
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
118
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
119
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
120
|
-
};
|
|
121
121
|
create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
122
122
|
createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
123
123
|
createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
@@ -170,4 +170,3 @@ export default class AuthzRole extends AuthzRole_base {
|
|
|
170
170
|
updatedAt: DateTime;
|
|
171
171
|
}
|
|
172
172
|
export {};
|
|
173
|
-
//# sourceMappingURL=authz_role.d.ts.map
|
|
@@ -75,6 +75,11 @@ declare const AuthzRolePermission_base: {
|
|
|
75
75
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
|
|
76
76
|
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
77
77
|
};
|
|
78
|
+
before: {
|
|
79
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
80
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
81
|
+
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
82
|
+
};
|
|
78
83
|
readonly booted: boolean;
|
|
79
84
|
$columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
|
|
80
85
|
$relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
|
|
@@ -111,11 +116,6 @@ declare const AuthzRolePermission_base: {
|
|
|
111
116
|
};
|
|
112
117
|
$defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
|
|
113
118
|
boot: () => void;
|
|
114
|
-
before: {
|
|
115
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
|
|
116
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
|
|
117
|
-
<Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
|
|
118
|
-
};
|
|
119
119
|
create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
120
120
|
createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
121
121
|
createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
@@ -152,4 +152,3 @@ export default class AuthzRolePermission extends AuthzRolePermission_base {
|
|
|
152
152
|
createdAt: DateTime;
|
|
153
153
|
}
|
|
154
154
|
export {};
|
|
155
|
-
//# sourceMappingURL=authz_role_permission.d.ts.map
|
package/build/src/openfga.d.ts
CHANGED
|
@@ -24,6 +24,5 @@ export type { OpenFgaRelationsDriverOptions } from './drivers/openfga_relations_
|
|
|
24
24
|
* JSON y cadenas—, pero se publica por esta misma puerta: es material de
|
|
25
25
|
* OpenFGA y solo lo usa quien lo elige.
|
|
26
26
|
*/
|
|
27
|
-
export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION, } from './drivers/openfga_facts.js';
|
|
28
|
-
export type { FactsRelations, FactsCatalogTuple, FactsTuple, FactsRelationsConfig, RelationObjectType, RelationObjectRelation, } from './drivers/openfga_facts.js';
|
|
29
|
-
//# sourceMappingURL=openfga.d.ts.map
|
|
27
|
+
export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION, factsModelDifferences, } from './drivers/openfga_facts.js';
|
|
28
|
+
export type { FactsModelComparison, FactsModelDifference, FactsModelSlice, FactsRelations, FactsCatalogTuple, FactsTuple, FactsRelationsConfig, RelationObjectType, RelationObjectRelation, } from './drivers/openfga_facts.js';
|
package/build/src/openfga.js
CHANGED
|
@@ -22,5 +22,7 @@ export { OpenFgaRelationsDriver, DEFAULT_LIST_OBJECTS_DEADLINE_MS, LIST_OBJECTS_
|
|
|
22
22
|
* JSON y cadenas—, pero se publica por esta misma puerta: es material de
|
|
23
23
|
* OpenFGA y solo lo usa quien lo elige.
|
|
24
24
|
*/
|
|
25
|
-
export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION,
|
|
26
|
-
|
|
25
|
+
export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION,
|
|
26
|
+
// L11 (lote «antes de RC»): la comparación modelo servido ↔ config, la que usan las dos puertas y la relectura de
|
|
27
|
+
// `openfga:provision`.
|
|
28
|
+
factsModelDifferences, } from './drivers/openfga_facts.js';
|
package/build/src/reconcile.d.ts
CHANGED
|
@@ -34,4 +34,3 @@ export declare function reconcileMaxTuples(value: number | undefined): number;
|
|
|
34
34
|
export declare function emptyReconcileCounts(): ReconcileCounts;
|
|
35
35
|
export declare function emptyReconcilePhases(): Record<ReconcileFamily, ReconcileCounts>;
|
|
36
36
|
export declare function sumReconcilePhases(phases: Record<ReconcileFamily, ReconcileCounts>): ReconcileCounts;
|
|
37
|
-
//# sourceMappingURL=reconcile.d.ts.map
|
package/build/src/reconcile.js
CHANGED
|
@@ -5,4 +5,3 @@ export declare function relationPartitionTrigger(dialect: string): string[];
|
|
|
5
5
|
/** Las sentencias para soltar el trigger (y, en PG, su función) en el `down()`. */
|
|
6
6
|
export declare function relationPartitionTriggerDrops(dialect: string): string[];
|
|
7
7
|
export {};
|
|
8
|
-
//# sourceMappingURL=relation_partition_trigger.d.ts.map
|
|
@@ -14,4 +14,3 @@ export declare function distinctObjects(objects: RelObject[]): {
|
|
|
14
14
|
};
|
|
15
15
|
/** Reparte las respuestas de los objetos DISTINTOS a las posiciones del lote. */
|
|
16
16
|
export declare function expandByPosition(index: number[], answers: boolean[]): boolean[];
|
|
17
|
-
//# sourceMappingURL=check_many.d.ts.map
|
|
@@ -48,10 +48,10 @@ export type RelationDenyPhase = 'read' | 'write';
|
|
|
48
48
|
* Las claves del lote D entran AQUÍ, en el mismo commit que su efecto.
|
|
49
49
|
*/
|
|
50
50
|
export declare const RELATIONS_SPEC_KEYS: Readonly<{
|
|
51
|
-
root: readonly ["objectTypes", "holderTypes", "database"];
|
|
51
|
+
root: readonly ["objectTypes", "holderTypes", "database", "maxGroupDepth"];
|
|
52
52
|
objectType: readonly ["type", "relations", "deny"];
|
|
53
53
|
relation: readonly ["name", "includes"];
|
|
54
|
-
database: readonly ["membersOf"];
|
|
54
|
+
database: readonly ["membersOf", "enforceGroupDepth"];
|
|
55
55
|
}>;
|
|
56
56
|
/** Una relación de un tipo de objeto (`document#viewer`), con sus `includes` de un nivel. */
|
|
57
57
|
export interface RelationObjectRelationSpec {
|
|
@@ -87,6 +87,15 @@ export interface RelationsDatabaseOptions {
|
|
|
87
87
|
* `database`.
|
|
88
88
|
*/
|
|
89
89
|
membersOf?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* **El límite de anidación de grupos en `database`, OPT-IN** (lote «antes de RC» · R1, decisión del dueño 2026-10-17
|
|
92
|
+
* (5): «`database` SIN límite por defecto —no tiene techo técnico—, opt-in con mando explícito aparte del número»).
|
|
93
|
+
* `true` ⇒ el driver `database` rechaza con 422 `E_AUTHZ_GROUP_DEPTH_LIMIT` la arista `group#member` que deje una
|
|
94
|
+
* cadena más larga que `maxGroupDepth` (que entonces es OBLIGATORIO y numérico: 500 al arrancar si no). Mando aparte
|
|
95
|
+
* a propósito (V2-4 del auditor): el `maxGroupDepth` que pones para tu CI `openfga` NO activa el gate en tu producción
|
|
96
|
+
* `database`. Default `false`.
|
|
97
|
+
*/
|
|
98
|
+
enforceGroupDepth?: boolean;
|
|
90
99
|
}
|
|
91
100
|
/** La config que declara el consumidor. */
|
|
92
101
|
export interface RelationsConfigSpec {
|
|
@@ -100,12 +109,26 @@ export interface RelationsConfigSpec {
|
|
|
100
109
|
holderTypes?: readonly string[];
|
|
101
110
|
/** Opciones del driver `database` (donde vive `membersOf`). */
|
|
102
111
|
database?: RelationsDatabaseOptions;
|
|
112
|
+
/**
|
|
113
|
+
* **El techo de anidación de grupos que declara la APP** (lote «antes de RC» · R1, decisiones del dueño 2026-10-17 (5)
|
|
114
|
+
* y (5-bis)): saltos `group⊂group` del camino MÁS LARGO. Cada driver declara su techo — `openfga` lo CALIBRA contra
|
|
115
|
+
* el servidor al primer uso (22 en OpenFGA v1.19 por defecto) y lo aplica SIEMPRE; `database` no tiene ninguno salvo
|
|
116
|
+
* `database.enforceGroupDepth` —; este valor solo puede BAJAR el de `openfga` (uno mayor que el calibrado ⇒ 500
|
|
117
|
+
* `E_AUTHZ_CONFIG` al calibrar, con las dos cifras) y es EL número en `database` con el opt-in. Entero 1..97 o `false`
|
|
118
|
+
* (apaga el de `openfga`, de forma explícita); cualquier otro valor ⇒ 500 al ARRANCAR. El paquete no lee variables de
|
|
119
|
+
* entorno: valida la tuya (`Env.schema.number.optional()`) y pásala aquí.
|
|
120
|
+
*/
|
|
121
|
+
maxGroupDepth?: number | false;
|
|
103
122
|
}
|
|
104
123
|
/** La config ya validada y CONGELADA que consulta el manager de relaciones. */
|
|
105
124
|
export interface RelationsConfig {
|
|
106
125
|
readonly objectTypes: readonly RelationObjectTypeSpec[];
|
|
107
126
|
/** ¿`membersOf` está habilitado (opción de `database`)? */
|
|
108
127
|
readonly membersOf: boolean;
|
|
128
|
+
/** R1: el techo de anidación de grupos declarado por la app (`undefined` = el del driver; `false` = apagado explícito). */
|
|
129
|
+
readonly maxGroupDepth?: number | false;
|
|
130
|
+
/** R1: ¿el driver `database` aplica `maxGroupDepth`? (opt-in, `database.enforceGroupDepth`). */
|
|
131
|
+
readonly enforceGroupDepth?: boolean;
|
|
109
132
|
/** ¿Existe el tipo de objeto? (F-05, cara del tipo). */
|
|
110
133
|
hasType(objectType: string): boolean;
|
|
111
134
|
/** ¿La relación está declarada para ese tipo? (F-05, cara de la relación). */
|
|
@@ -292,4 +315,3 @@ export declare function assertDenySubject(subject: unknown): void;
|
|
|
292
315
|
* versión la lea como «permanente» sin que nadie lo decidiera.
|
|
293
316
|
*/
|
|
294
317
|
export declare function assertDenyNoExpiry(options: unknown): void;
|
|
295
|
-
//# sourceMappingURL=define_relations_config.d.ts.map
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { RelationConfigError, RelationConfigUnknownKeyError, RelationNotDenyableError, RelationDenyExpiryError, RelationTypeUnknownError, RelationUnknownError, RelationUsersetUnsupportedError, } from '../errors.js';
|
|
20
20
|
import { RESERVED_FACTS_TYPES, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES } from '../identity.js';
|
|
21
|
+
import { assertGroupDepthSettings } from './group_depth.js';
|
|
21
22
|
/**
|
|
22
23
|
* **El ÚNICO userset que el modelo admite como sujeto** (plan 2.5 · lote B · B3):
|
|
23
24
|
* `group#member`. El generador del modelo fusionado emite, para CADA relación de
|
|
@@ -58,10 +59,10 @@ const FGA_NAME_FORMAT = /^[a-z0-9][a-z0-9._-]*$/;
|
|
|
58
59
|
* Las claves del lote D entran AQUÍ, en el mismo commit que su efecto.
|
|
59
60
|
*/
|
|
60
61
|
export const RELATIONS_SPEC_KEYS = Object.freeze({
|
|
61
|
-
root: Object.freeze(['objectTypes', 'holderTypes', 'database']),
|
|
62
|
+
root: Object.freeze(['objectTypes', 'holderTypes', 'database', 'maxGroupDepth']),
|
|
62
63
|
objectType: Object.freeze(['type', 'relations', 'deny']),
|
|
63
64
|
relation: Object.freeze(['name', 'includes']),
|
|
64
|
-
database: Object.freeze(['membersOf']),
|
|
65
|
+
database: Object.freeze(['membersOf', 'enforceGroupDepth']),
|
|
65
66
|
});
|
|
66
67
|
const _exhaustiveRelationsRoot = {};
|
|
67
68
|
const _exhaustiveRelationsObjectType = {};
|
|
@@ -431,9 +432,14 @@ export function defineRelationsConfig(spec) {
|
|
|
431
432
|
? Object.freeze({ type: objectType.type, relations: Object.freeze(relations) })
|
|
432
433
|
: Object.freeze({ type: objectType.type, relations: Object.freeze(relations), deny: objectType.deny });
|
|
433
434
|
});
|
|
435
|
+
// R1 (decisión del dueño 2026-10-17 (5); V2-1 del auditor): el techo se valida AL ARRANCAR, 500 y no 422 — un valor
|
|
436
|
+
// así no es una pregunta mal hecha, es un despliegue que apagaría el límite en silencio.
|
|
437
|
+
const { maxGroupDepth, enforceGroupDepth } = assertGroupDepthSettings(spec.maxGroupDepth, spec.database?.enforceGroupDepth);
|
|
434
438
|
return Object.freeze({
|
|
435
439
|
objectTypes: Object.freeze(frozenTypes),
|
|
436
440
|
membersOf: spec.database?.membersOf === true,
|
|
441
|
+
...(maxGroupDepth === undefined ? {} : { maxGroupDepth }),
|
|
442
|
+
...(enforceGroupDepth === true ? { enforceGroupDepth: true } : {}),
|
|
437
443
|
hasType: (objectType) => declared.has(objectType),
|
|
438
444
|
isDeclared: (objectType, relation) => declared.get(objectType)?.has(relation) ?? false,
|
|
439
445
|
});
|
|
@@ -596,4 +602,3 @@ export function assertDenyNoExpiry(options) {
|
|
|
596
602
|
`caduca el GRANT (relate con expiresAt), no el deny. No se ha escrito nada.`);
|
|
597
603
|
}
|
|
598
604
|
}
|
|
599
|
-
//# sourceMappingURL=define_relations_config.js.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { RelationsConfig } from './define_relations_config.js';
|
|
2
|
+
type ConfigLike = Pick<RelationsConfig, 'objectTypes'>;
|
|
3
|
+
/** Un deny vivo, agregado por tipo y relación PÚBLICA (`editor`, no `denied_editor`). */
|
|
4
|
+
export interface LiveDenyGroup {
|
|
5
|
+
objectType: string;
|
|
6
|
+
relation: string;
|
|
7
|
+
/**
|
|
8
|
+
* Cuántos denies vivos hay sobre `objectType#relation`: filas de `authz_relations` en la guarda; en el detector de
|
|
9
|
+
* reconcile, CLAVES DE TUPLA DISTINTAS (firma (8 · `count`): un deny espejado en origen y destino cuenta una vez).
|
|
10
|
+
*/
|
|
11
|
+
count: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Por qué un grupo de denies vivos es un hallazgo: `shrunk`/`orphan` (la config nueva encoge su alcance), `no-baseline`
|
|
15
|
+
* (sin línea base utilizable no se puede juzgar) o `stale` (la línea base es más estrecha que lo servido; solo el detector).
|
|
16
|
+
*/
|
|
17
|
+
export type DenyReachReason = 'shrunk' | 'orphan' | 'no-baseline' | 'stale';
|
|
18
|
+
/** Un grupo de denies vivos cuyo alcance encoge con la config nueva, con su receta. */
|
|
19
|
+
export interface DenyReachFinding {
|
|
20
|
+
objectType: string;
|
|
21
|
+
relation: string;
|
|
22
|
+
reason: DenyReachReason;
|
|
23
|
+
count: number;
|
|
24
|
+
/**
|
|
25
|
+
* El alcance con la config VIEJA (`down*` en la línea base); `null` = sin línea base o ya huérfano allí. Con `stale`, el
|
|
26
|
+
* alcance que CREE la línea base (`null` si no declara la relación).
|
|
27
|
+
*/
|
|
28
|
+
before: string[] | null;
|
|
29
|
+
/** El alcance con la config NUEVA; `[]` si quedó huérfano. Con `stale`, el de la config SERVIDA. */
|
|
30
|
+
after: string[];
|
|
31
|
+
/**
|
|
32
|
+
* Lo que deja de cortar (`before \ after`); con `orphan` sin línea base, `[relation]`; con `no-baseline`, `[]` (no se
|
|
33
|
+
* sabe); con `stale`, lo que el deny corta con lo servido y la línea base no sabe (`after \ before`).
|
|
34
|
+
*/
|
|
35
|
+
lost: string[];
|
|
36
|
+
/** La receta (español, como el resto de la letra del paquete). */
|
|
37
|
+
recipe: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* **El alcance de un deny sobre `objectType#relation`** con `config`: `down*(relation)` ordenado, o `null` si la config no
|
|
41
|
+
* declara ese tipo o esa relación (huérfano).
|
|
42
|
+
*/
|
|
43
|
+
export declare function denyReachOf(config: ConfigLike, objectType: string, relation: string): string[] | null;
|
|
44
|
+
/** La relación ALMACENADA `denied_<rel>` ⇒ `<rel>`; cualquier otra ⇒ `null` (no es un deny). */
|
|
45
|
+
export declare function deniedPublicRelation(stored: string): string | null;
|
|
46
|
+
/** La clave `tipo#relación` de un grupo o hallazgo: la que nombra la salida forzada acotada (`allowDenyReachShrink`). */
|
|
47
|
+
export declare function denyReachKey(group: {
|
|
48
|
+
objectType: string;
|
|
49
|
+
relation: string;
|
|
50
|
+
}): string;
|
|
51
|
+
/** La forma de una clave `tipo#relación` que acepta la salida forzada acotada (dos nombres no vacíos, sin `#` ni blancos). */
|
|
52
|
+
export declare const DENY_REACH_KEY_PATTERN: RegExp;
|
|
53
|
+
/**
|
|
54
|
+
* **La lectura de la LÍNEA BASE, TODO O NADA y tipada** (firma (8 · línea base); conflicto 6 del juez del panel): de la spec
|
|
55
|
+
* persistida (el JSON ya parseado) lee SOLO lo que decide un alcance —`objectTypes[].{type, relations[].{name, includes}}`—,
|
|
56
|
+
* sin pasar por `defineRelationsConfig` (una fila de 2.4/alpha.3 con una clave que 2.5 no conoce sigue siendo una línea
|
|
57
|
+
* base: la receta de B5, re-guardar la misma spec corregida, entra sin forzar). Cualquier forma rota EN LO QUE LEE —un
|
|
58
|
+
* objeto que no lo es, `objectTypes`/`relations` que no son arrays, un `type`/`name` que no es string, un `includes`
|
|
59
|
+
* presente que no es un array de strings— deja la línea base como NO UTILIZABLE (`null`): **nunca se filtra** (filtrar
|
|
60
|
+
* subestima el alcance viejo y deja pasar el estrechamiento: S-D3 del tester del panel). Un `includes` ausente es `[]`
|
|
61
|
+
* (la spec lo permite).
|
|
62
|
+
*/
|
|
63
|
+
export declare function denyReachBaselineOf(parsed: unknown): ConfigLike | null;
|
|
64
|
+
/**
|
|
65
|
+
* **La propiedad de (8)**: para cada grupo de denies vivos, ¿`alcance(after) ⊇ alcance(before)`? Devuelve los que la
|
|
66
|
+
* violan (`shrunk` | `orphan`, orden estable por tipo y relación), vacío si ninguno. `before = null` = sin línea base: solo
|
|
67
|
+
* `orphan` (el motivo `no-baseline` lo añade `judgeDenyReach`).
|
|
68
|
+
*/
|
|
69
|
+
export declare function denyReachFindings(before: ConfigLike | null, after: ConfigLike, denies: Iterable<LiveDenyGroup>): DenyReachFinding[];
|
|
70
|
+
/**
|
|
71
|
+
* **El juicio de la guarda (y la mitad «persistida → servida» de los detectores)**: `denyReachFindings` más, SIN línea base
|
|
72
|
+
* utilizable (`baseline === null`), un hallazgo `no-baseline` por cada grupo de denies vivos que no sea ya `orphan` (de un
|
|
73
|
+
* huérfano sí se sabe que encoge: su alcance es ∅). Sin denies vivos no hay hallazgo alguno: la primera fila se crea sin
|
|
74
|
+
* forzar. Orden estable por tipo, relación y motivo.
|
|
75
|
+
*/
|
|
76
|
+
export declare function judgeDenyReach(baseline: ConfigLike | null, next: ConfigLike, denies: Iterable<LiveDenyGroup>): DenyReachFinding[];
|
|
77
|
+
/**
|
|
78
|
+
* **La línea base RANCIA** (firma (8 · rancia); conflicto 3 del juez): la dirección inversa, `denyReachFindings(servida,
|
|
79
|
+
* persistida)`. Un grupo de denies vivos cuyo alcance con lo SERVIDO no cabe en el de la línea base (la fila no declara la
|
|
80
|
+
* relación que se sirve, o la declara más estrecha) es un hallazgo `stale`: la flota sirvió (o sirve) algo que la fila no
|
|
81
|
+
* registra, y desde esa fila un estrechamiento de vuelta a ella parecería «sin cambio» (A1/S-B). Un grupo que lo servido
|
|
82
|
+
* tampoco declara no es rancio (es `orphan` en la otra dirección).
|
|
83
|
+
*/
|
|
84
|
+
export declare function staleDenyReach(baseline: ConfigLike, served: ConfigLike, denies: Iterable<LiveDenyGroup>): DenyReachFinding[];
|
|
85
|
+
/** Lo que devuelven los dos detectores (el de un driver y el de `--dry-run`) para un estado: las dos direcciones. */
|
|
86
|
+
export interface DenyReachCheck {
|
|
87
|
+
/** `'persisted'`: hay línea base utilizable; `'none'`: no la hay (sin fila, o fila que la lectura TODO O NADA no tipa). */
|
|
88
|
+
baseline: 'persisted' | 'none';
|
|
89
|
+
/** Persistida → servida: `shrunk`, `orphan` y, sin línea base, `no-baseline` (el juicio de la guarda, sin salidas). */
|
|
90
|
+
findings: DenyReachFinding[];
|
|
91
|
+
/** Servida → persistida: `stale` (solo con línea base). */
|
|
92
|
+
staleBaseline: DenyReachFinding[];
|
|
93
|
+
}
|
|
94
|
+
/** **Los dos sentidos sobre el mismo estado** (firma (8 · detector de un driver)): el punto de paso de los detectores. */
|
|
95
|
+
export declare function denyReachCheck(baseline: ConfigLike | null, served: ConfigLike, denies: Iterable<LiveDenyGroup>): DenyReachCheck;
|
|
96
|
+
/**
|
|
97
|
+
* Una línea por hallazgo, con el prefijo ESTABLE de su rama (CLAUDE.md punto 7): la usan el error de la guarda, el detector
|
|
98
|
+
* de un driver y el comando. Prefijos: «deny con alcance ENCOGIDO», «deny HUÉRFANO», «deny SIN línea base», «línea base
|
|
99
|
+
* RANCIA».
|
|
100
|
+
*/
|
|
101
|
+
export declare function denyReachLine(finding: DenyReachFinding): string;
|
|
102
|
+
export {};
|