@jantstack/adonis-authz 2.5.0-alpha.2 → 2.5.0-alpha.4
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 +743 -28
- 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 +0 -1
- package/build/commands/authz_catalog_prune_orphans.js +0 -1
- 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 +6 -1
- package/build/commands/authz_relations_reconcile.js +163 -5
- package/build/commands/authz_scopes_relay.d.ts +0 -1
- package/build/commands/authz_scopes_relay.js +49 -5
- package/build/commands/authz_scopes_requeue.d.ts +0 -1
- package/build/commands/authz_scopes_requeue.js +14 -2
- 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 +72 -1
- package/build/commands/openfga_provision.js +236 -4
- package/build/configure.d.ts +0 -1
- package/build/configure.js +0 -1
- package/build/index.d.ts +11 -9
- package/build/index.js +12 -5
- 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 +25 -1
- 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 +6 -1
- package/build/src/drivers/database_driver.js +22 -2
- package/build/src/drivers/database_relations_driver.d.ts +46 -5
- package/build/src/drivers/database_relations_driver.js +297 -59
- package/build/src/drivers/openfga_driver.d.ts +159 -26
- package/build/src/drivers/openfga_driver.js +980 -231
- package/build/src/drivers/openfga_facts.d.ts +112 -1
- package/build/src/drivers/openfga_facts.js +351 -11
- package/build/src/drivers/openfga_relations_driver.d.ts +109 -8
- package/build/src/drivers/openfga_relations_driver.js +817 -53
- package/build/src/errors.d.ts +233 -1
- package/build/src/errors.js +283 -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 +2 -1
- package/build/src/identity.js +4 -1
- package/build/src/manager.d.ts +0 -1
- package/build/src/manager.js +164 -31
- 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 +3 -4
- package/build/src/openfga.js +5 -3
- 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 +1 -2
- package/build/src/relations/check_many.js +6 -5
- package/build/src/relations/define_relations_config.d.ts +140 -5
- package/build/src/relations/define_relations_config.js +205 -6
- 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 +46 -8
- package/build/src/relations/manager.js +178 -16
- package/build/src/relations/page.d.ts +19 -0
- package/build/src/relations/page.js +74 -0
- package/build/src/relations/reconcile.d.ts +274 -2
- package/build/src/relations/reconcile.js +1006 -162
- 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 +127 -0
- package/build/src/relations/tuple_order.js +599 -0
- 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 +0 -1
- package/build/src/scope_outbox.js +0 -1
- package/build/src/shared/backend_guard.d.ts +60 -1
- package/build/src/shared/backend_guard.js +179 -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 +7 -1
- package/build/src/testing/contract.js +77 -1
- package/build/src/testing/main.d.ts +1 -2
- package/build/src/testing/main.js +1 -2
- 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 +25 -1
- package/build/src/testing/relations_contract.js +996 -49
- package/build/src/testing/relations_reconcile_contract.d.ts +9 -1
- package/build/src/testing/relations_reconcile_contract.js +207 -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 +170 -15
- 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_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
|
@@ -1922,6 +1922,33 @@ export function registerAuthorizationDriverContract(harness, api) {
|
|
|
1922
1922
|
await driver.revoke(alice, 'lead', unitA1);
|
|
1923
1923
|
assert.isFalse(await driver.authorize(alice, 'docs:write', unitA1));
|
|
1924
1924
|
});
|
|
1925
|
+
since('2.2', 'un deny en el OWNER sigue ganando sobre su rol local mientras el scope sale del owner y vuelve: authorize false antes, fuera y de vuelta (invariantes 2 y 18; lote «antes de RC» · F4, F-1); sin el deny: true, false, true', async ({ assert, }) => {
|
|
1926
|
+
// F-1 del tester (`loteRC-6b-estudio-tester.md` §6): PARIDAD entre drivers del `moved` con un rol LOCAL y un deny
|
|
1927
|
+
// en su owner. En `database` no hay estado intermedio (la regla se evalúa en cada pregunta); en `openfga` el
|
|
1928
|
+
// barrido F4 borra el binding ANTES de escribir la arista, así que tampoco lo hay (el prefijo lo juzga la
|
|
1929
|
+
// propiedad `openfga.roles.moved.order` de la guardia). Aquí se observa el estado de reposo en los tres puntos.
|
|
1930
|
+
const denied = subject();
|
|
1931
|
+
const plain = subject();
|
|
1932
|
+
const orgA = await orgUnder(tree, APP_SCOPE);
|
|
1933
|
+
const orgB = await orgUnder(tree, APP_SCOPE);
|
|
1934
|
+
const unit = await unitUnder(tree, orgA);
|
|
1935
|
+
const leaf = await unitUnder(tree, unit);
|
|
1936
|
+
await localRole(orgA, { slug: 'lead', scopeType: 'unit', permissions: ['docs:write'] });
|
|
1937
|
+
await driver.grant(denied, 'lead', unit);
|
|
1938
|
+
await driver.grant(plain, 'lead', unit);
|
|
1939
|
+
await driver.deny(denied, 'docs:write', orgA);
|
|
1940
|
+
const both = async () => [
|
|
1941
|
+
await driver.authorize(denied, 'docs:write', unit),
|
|
1942
|
+
await driver.authorize(denied, 'docs:write', leaf),
|
|
1943
|
+
await driver.authorize(plain, 'docs:write', unit),
|
|
1944
|
+
await driver.authorize(plain, 'docs:write', leaf),
|
|
1945
|
+
];
|
|
1946
|
+
assert.deepEqual(await both(), [false, false, true, true], 'dentro del owner: el deny gana, sin él concede (también abajo)');
|
|
1947
|
+
await tree.move(unit, orgB);
|
|
1948
|
+
assert.deepEqual(await both(), [false, false, false, false], 'fuera del owner: el rol local no existe (y el deny ya no hace falta)');
|
|
1949
|
+
await tree.move(unit, orgA);
|
|
1950
|
+
assert.deepEqual(await both(), [false, false, true, true], 'de vuelta: restaura lo concedido y el deny sigue ganando');
|
|
1951
|
+
});
|
|
1925
1952
|
since('2.2', 'la visibilidad se decide POR NIVEL, no por el conjunto de la cadena: si el árbol se recuelga y el owner queda POR DEBAJO del scope de la asignación, esa asignación deja de contar aunque el owner siga en la cadena de la pregunta', async ({ assert, }) => {
|
|
1926
1953
|
// 3B · B2 (desviación 2 del lote, sin caso hasta aquí). La regla es
|
|
1927
1954
|
// «una asignación en el scope S cuenta si su rol EXISTE EN S»: el owner
|
|
@@ -2072,6 +2099,35 @@ export function registerAuthorizationDriverContract(harness, api) {
|
|
|
2072
2099
|
assert.isFalse(await driver.authorize(victima, 'docs:write', unitU1), 'el rol de A ya no existe aquí');
|
|
2073
2100
|
assert.isTrue(await driver.hasRole(victima, 'lead', unitU1));
|
|
2074
2101
|
});
|
|
2102
|
+
since('2.2', 'K4 · revoke por SLUG decide con el catálogo EN FRESCO aunque el memo sirva con ventana { everyMs }: un rol local recién definido en OTRO proceso con el slug de uno global también se revoca (nunca un «revocado» mudo)', async ({ assert, }) => {
|
|
2103
|
+
// Asentar · cierre 2 (D-1 del re-ataque del cierre 1; gemelo del 🟡 5 de `openfga`). `{ everyMs }` es una ventana
|
|
2104
|
+
// de DECISIÓN (invariante 14); una ESCRITURA decide con la versión en fresco (K4). Con el memo de la ventana,
|
|
2105
|
+
// `revoke(alice, 'unit-editor', unit)` solo veía el global y el DELETE no tocaba la asignación del local homónimo:
|
|
2106
|
+
// seguía concediendo, en silencio y para siempre (al caducar la ventana, también en este proceso). La ventana solo se
|
|
2107
|
+
// construye si `driver.catalog` es un `CatalogCache` (los dos drivers del paquete): un driver con memo PROPIO corre
|
|
2108
|
+
// el caso SIN ventana y el K4 de `revoke` NO queda juzgado para él (cierre 3 · 🟡 B del tester: es su deber escrito,
|
|
2109
|
+
// no juzgado; un hook de harness para su memo sería contrato nuevo).
|
|
2110
|
+
const alice = subject();
|
|
2111
|
+
const orgA = await orgUnder(tree, APP_SCOPE);
|
|
2112
|
+
const unit = await unitUnder(tree, orgA);
|
|
2113
|
+
const memo = new CatalogCache({ revalidate: { everyMs: 3_600_000 } });
|
|
2114
|
+
let windowed = driver;
|
|
2115
|
+
if (driver.catalog instanceof CatalogCache) {
|
|
2116
|
+
windowed = Object.create(driver);
|
|
2117
|
+
Object.defineProperty(windowed, 'catalog', { value: memo, enumerable: true });
|
|
2118
|
+
await memo.view();
|
|
2119
|
+
}
|
|
2120
|
+
// «Otro proceso» define el local con el slug del global `unit-editor` (fila + versión, sin señal en memoria).
|
|
2121
|
+
const local = await localRole(orgA, { slug: 'unit-editor', scopeType: 'unit', permissions: ['docs:write'] });
|
|
2122
|
+
await driver.grant(alice, { uuid: local }, unit);
|
|
2123
|
+
assert.isTrue(await driver.authorize(alice, 'docs:write', unit));
|
|
2124
|
+
if (windowed !== driver) {
|
|
2125
|
+
assert.isNull((await memo.view()).roleByUuid(local), 'la ventana del memo sigue sirviendo la foto SIN el local (si no, el caso no juzga nada)');
|
|
2126
|
+
}
|
|
2127
|
+
await windowed.revoke(alice, 'unit-editor', unit);
|
|
2128
|
+
assert.isFalse(await driver.authorize(alice, 'docs:write', unit), 'la asignación del local homónimo también se revoca');
|
|
2129
|
+
assert.isFalse(await driver.hasRole(alice, { uuid: local }, unit));
|
|
2130
|
+
});
|
|
2075
2131
|
since('2.2', 'paridad entre drivers (3D · N1): una asignación cuyo rol está declarado para OTRO nivel no cuenta en ninguno de los dos — ni concede, ni es membresía, ni se enumera — y vuelve a contar en cuanto el nivel del rol coincide otra vez', async ({ assert, }) => {
|
|
2076
2132
|
// Desviación 3 del lote 3B («`database.authorize` exige además
|
|
2077
2133
|
// `r.scope_type = a.scope_type`, como ya hacía `openfga`») era una
|
|
@@ -3738,6 +3794,27 @@ export function registerAuthorizationDriverContract(harness, api) {
|
|
|
3738
3794
|
tree.chainOf = original;
|
|
3739
3795
|
}
|
|
3740
3796
|
}
|
|
3797
|
+
// ── Estrategia 2.5.0 · firma 4 · `experimental` (regla D15) ─────────
|
|
3798
|
+
// La capacidad DICE algo que el consumidor tiene que saber —«este driver está fuera de la garantía de la versión»— y
|
|
3799
|
+
// no apaga ningún caso: el juez corre ENTERO contra un driver experimental. Lo que se observa es la declaración: la
|
|
3800
|
+
// del driver y la copia normalizada que publica `authorization.capabilities()`, en las DOS caras.
|
|
3801
|
+
caseFor('experimental', {
|
|
3802
|
+
whenTrue: () => {
|
|
3803
|
+
test('experimental:true · el driver se declara EXPERIMENTAL (capabilities.experimental === true) y `authorization.capabilities()` lo publica tal cual; el juez corre igual contra él', async ({ assert, }) => {
|
|
3804
|
+
assert.strictEqual(driver.capabilities?.experimental, true, 'el harness declara experimental: true y el driver no: declara lo observable');
|
|
3805
|
+
const published = await managerOver().capabilities();
|
|
3806
|
+
assert.strictEqual(published.experimental, true);
|
|
3807
|
+
assert.isTrue(Object.isFrozen(published));
|
|
3808
|
+
});
|
|
3809
|
+
},
|
|
3810
|
+
whenFalse: () => {
|
|
3811
|
+
test('experimental:false · el driver NO se declara experimental (ausente o false) y `authorization.capabilities().experimental` es false, nunca undefined (D15)', async ({ assert, }) => {
|
|
3812
|
+
assert.notStrictEqual(driver.capabilities?.experimental, true, 'el harness declara experimental: false y el driver declara true: declara lo observable');
|
|
3813
|
+
const published = await managerOver().capabilities();
|
|
3814
|
+
assert.strictEqual(published.experimental, false);
|
|
3815
|
+
});
|
|
3816
|
+
},
|
|
3817
|
+
});
|
|
3741
3818
|
// ── 3b-2e · E2 · `roleInheritanceNative` ─────────────────────────────
|
|
3742
3819
|
caseFor('roleInheritanceNative', {
|
|
3743
3820
|
whenFalse: () => {
|
|
@@ -3868,4 +3945,3 @@ export function uncoveredCapabilities(capabilities, covered) {
|
|
|
3868
3945
|
* un skip disfrazado — «rechazo activo» sería una etiqueta.
|
|
3869
3946
|
*/
|
|
3870
3947
|
const BOTH_FACES_REQUIRED = new Set(['transactionalWrites']);
|
|
3871
|
-
//# sourceMappingURL=contract.js.map
|
|
@@ -12,7 +12,7 @@ export { memoryScopeTree, resolveChainFrom, descendantsFrom } from './scope_tree
|
|
|
12
12
|
export { runMigrationContract, registerMigrationContract, runMigrationDirection, makeMigrationSeed, migrationQuestions, plantMigrationFacts, plantMigrationTree, MIGRATION_CATALOG, MIGRATION_PERMISSIONS, MIGRATION_ROLES, MIGRATION_QUESTION_COUNT, } from './migration_contract.js';
|
|
13
13
|
export type { MigrationContractHarness, MigrationDirection, MigrationQuestion, MigrationSeed, MigrationVerdict, ExpectedLoss, } from './migration_contract.js';
|
|
14
14
|
export type { ContractScopeTree } from './scope_tree.js';
|
|
15
|
-
export { runRelationsDriverContract, registerRelationsDriverContract, makeRelationsDriver, contractRelationsConfig, RELATIONS_HOLDER_TYPES, RELATIONS_CONTRACT_OBJECT_TYPES, lucidRelationsContractTransactions, } from './relations_contract.js';
|
|
15
|
+
export { runRelationsDriverContract, registerRelationsDriverContract, makeRelationsDriver, contractRelationsConfig, contractDenyRelationsConfig, RELATIONS_CONTRACT_DENY_TYPES, RELATIONS_HOLDER_TYPES, RELATIONS_CONTRACT_OBJECT_TYPES, lucidRelationsContractTransactions, } from './relations_contract.js';
|
|
16
16
|
export { createTestClock } from './test_clock.js';
|
|
17
17
|
export type { TestClock } from './test_clock.js';
|
|
18
18
|
export type { RelationsDriverContractHarness, RelationsContractTransactions, MakeRelationsDriverOptions, } from './relations_contract.js';
|
|
@@ -20,4 +20,3 @@ export { runRelationsReconcileContract, registerRelationsReconcileContract, } fr
|
|
|
20
20
|
export type { RelationsReconcileHarness } from './relations_reconcile_contract.js';
|
|
21
21
|
export { runScopeOutboxContract, registerScopeOutboxContract, makeScopeOutbox, SCOPE_OUTBOX_CAPABILITY_KEYS, } from './scope_outbox_contract.js';
|
|
22
22
|
export type { ScopeOutboxCapabilities, ScopeOutboxContractHarness, ScopeOutboxContractTransactions, MakeScopeOutboxOptions, } from './scope_outbox_contract.js';
|
|
23
|
-
//# sourceMappingURL=main.d.ts.map
|
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
export { runAuthorizationDriverContract, lucidContractTransactions } from './contract.js';
|
|
10
10
|
export { memoryScopeTree, resolveChainFrom, descendantsFrom } from './scope_tree.js';
|
|
11
11
|
export { runMigrationContract, registerMigrationContract, runMigrationDirection, makeMigrationSeed, migrationQuestions, plantMigrationFacts, plantMigrationTree, MIGRATION_CATALOG, MIGRATION_PERMISSIONS, MIGRATION_ROLES, MIGRATION_QUESTION_COUNT, } from './migration_contract.js';
|
|
12
|
-
export { runRelationsDriverContract, registerRelationsDriverContract, makeRelationsDriver, contractRelationsConfig, RELATIONS_HOLDER_TYPES, RELATIONS_CONTRACT_OBJECT_TYPES, lucidRelationsContractTransactions, } from './relations_contract.js';
|
|
12
|
+
export { runRelationsDriverContract, registerRelationsDriverContract, makeRelationsDriver, contractRelationsConfig, contractDenyRelationsConfig, RELATIONS_CONTRACT_DENY_TYPES, RELATIONS_HOLDER_TYPES, RELATIONS_CONTRACT_OBJECT_TYPES, lucidRelationsContractTransactions, } from './relations_contract.js';
|
|
13
13
|
export { createTestClock } from './test_clock.js';
|
|
14
14
|
export { runRelationsReconcileContract, registerRelationsReconcileContract, } from './relations_reconcile_contract.js';
|
|
15
15
|
export { runScopeOutboxContract, registerScopeOutboxContract, makeScopeOutbox, SCOPE_OUTBOX_CAPABILITY_KEYS, } from './scope_outbox_contract.js';
|
|
16
|
-
//# sourceMappingURL=main.js.map
|
|
@@ -290,4 +290,3 @@ export declare function runMigrationDirection(harness: MigrationContractHarness,
|
|
|
290
290
|
*/
|
|
291
291
|
export declare function runMigrationContract(harness: MigrationContractHarness): void;
|
|
292
292
|
export declare function registerMigrationContract(harness: MigrationContractHarness, api: ContractTestApi): void;
|
|
293
|
-
//# sourceMappingURL=migration_contract.d.ts.map
|
|
@@ -22,6 +22,31 @@ export declare const RELATIONS_CONTRACT_OBJECT_TYPES: readonly ["document", "wor
|
|
|
22
22
|
* editor ⊆ viewer` (includes de un nivel) y `membersOf` habilitado en `database`.
|
|
23
23
|
*/
|
|
24
24
|
export declare function contractRelationsConfig(): RelationsConfig;
|
|
25
|
+
/**
|
|
26
|
+
* **La config del contrato CON techo de anidación de grupos** (lote «antes de RC» · R1, cierre: el runner publicado no
|
|
27
|
+
* tenía ningún caso del techo y un driver de terceros no tenía juez): la MISMA config que `contractRelationsConfig` con
|
|
28
|
+
* `maxGroupDepth` (por defecto 3) y el opt-in de `database` (`database.enforceGroupDepth`). Un driver que declare
|
|
29
|
+
* `groupDepthLimit()` tiene que responder con un techo ≤ ese número (la config solo BAJA el del driver) y aplicarlo.
|
|
30
|
+
*/
|
|
31
|
+
export declare function contractGroupDepthRelationsConfig(maxGroupDepth?: number): RelationsConfig;
|
|
32
|
+
/**
|
|
33
|
+
* **La config del contrato CON deny** (plan 2.5 · lote D · D1): los MISMOS dos tipos con el mismo retículo y, además,
|
|
34
|
+
* un tercero sin opt-in —para que «deny sobre un tipo sin deny ⇒ 422» y «D8: un tipo sin opt-in también honra»
|
|
35
|
+
* se juzguen con la config fija—:
|
|
36
|
+
*
|
|
37
|
+
* - `document`: `deny: 'write'` (fase 2: se escriben denies);
|
|
38
|
+
* - `workspace`: `deny: 'read'` (fase 1: el modelo y las lecturas honran; `deny()` ⇒ 422);
|
|
39
|
+
* - `note`: sin opt-in.
|
|
40
|
+
*
|
|
41
|
+
* Es una config APARTE (no se tocó `contractRelationsConfig`): un tipo sin `deny` genera el modelo de 2.4.0-alpha.10
|
|
42
|
+
* byte a byte (D-29) y los casos de antes no cambian de config.
|
|
43
|
+
*/
|
|
44
|
+
export declare const RELATIONS_CONTRACT_DENY_TYPES: {
|
|
45
|
+
readonly document: "write";
|
|
46
|
+
readonly workspace: "read";
|
|
47
|
+
readonly note: undefined;
|
|
48
|
+
};
|
|
49
|
+
export declare function contractDenyRelationsConfig(): RelationsConfig;
|
|
25
50
|
export interface RelationsDriverContractHarness {
|
|
26
51
|
name: string;
|
|
27
52
|
/** Lo que este driver DECLARA. Cada valor se juzga con su cara. */
|
|
@@ -84,4 +109,3 @@ export declare function registerRelationsDriverContract(harness: RelationsDriver
|
|
|
84
109
|
registered: number;
|
|
85
110
|
covered: Set<keyof RelationsDriverCapabilities>;
|
|
86
111
|
};
|
|
87
|
-
//# sourceMappingURL=relations_contract.d.ts.map
|